1.请求库,解析库,数据库
#抓包工具:Fiddler;mitmproxy(中间人插件)
#请求方式:
get: ?key=value&key1=value1
post:
请求体:formdata;
json
files
请求头:headers
Cookie:主要记录用户保存信息
User-Agent:用户身份
Referer:从哪里来,防止盗链行为
服务器自定义字段
#响应:
Status Code:状态码
响应头:
location:重定向的url;
set-cookie:设置cookie;
服务器特定字段
响应体:
1.HTML代码
2.二进制,图片,视频,音频
3.json格式
4.jsonp格式
2.爬虫与反爬虫对抗历史
检测:User-Agent;
(频率限制)误伤;
登录限制;注册账号,模拟登陆,携带Cookie;多账户登录;养账户
验证码:解析验证码,打码平台(机器学习+人工)
手机验证、邮箱验证;
只请求HTML,不请求jq,css
robots协议:失控爬虫
#常见反扒手段
1:检测User-Agent;
2.封禁IP;西刺代理
3.图片验证码;打码平台
4.滑动模块,操作浏览器内核
5.js轨迹,验证人来行为,
6.前端反调试;F12
7.js加密
3.请求库(request)
3.1 get
#安装:pip install requests
get/post/request
#get请求
response = requests.get(url, params=None, **kwargs())
#参数
url
headers = {}
params = {}
cookies = {}
proxies = {}
timeout = 默认值
allow_redirects = False
import requests
url = 'http://httpbin.org/get?name=mac&age=20¶ms1=100'
params = {
'params1':'params1',
'params2':'params2',
}
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
'Cookie':'xxx',
'Referer':'yyy',
}
cookies = {
'ccc':'999',
}
proxies={
'https':'http://120.78.225.5:3128'
}
r = requests.get(url=url,headers=headers,params=params,cookies=cookies,
proxies=proxies,timeout = 10,allow_redirects = False)
print(r.text)
3.2 post
响应对象 = request.post()
#参数
url:
headers = {}
cookies = {}
data = {}
json = {}
files = {"file":"open('路径','rb')"}
timeout = 0.5
allow_redirects = False
import requests
url = 'http://httpbin.org/post'
data = {
'name':'mac',
}
# json = {
# 'age':20,
# }
files = {
'file':open('1.txt','rt',encoding='utf-8')
}
r = requests.post(url=url,data=data,files=files)
print(r.text)
#响应
r.url 请求url
r.text 获取的请求体文本信息
r.encoding = 'gbk' 获取解码格式
r.content 获得二进制
r.json() [json.loads(r.text)]
r.status_code
r.headers
r.cookies 获取cookie
r.history [响应对象1,响应对象2]
4. session和cookie
import requests
import http.cookiejar as cookiejar
session = requests.session()
session.cookies = cookiejar.LWPCookieJar()
r = session.get('http://www.baidu.com')
session.cookies.save('1.txt')
import requests
import http.cookiejar as cookiejar
session = requests.session()
session.cookies = cookiejar.LWPCookieJar()
session.cookies.load('1.txt')
print(session.cookies)
5. 解析语法
#常见解析:pyquery,re,bs4,lxml
#安装 pip install requests_html
#解析语法:
#CSS选择器:
1.类选择器 .类名
2.id选择器 #id值
3.标签选择器: 标签名
4.后代选择器 选择器1 选择器2
5.子代选择器 选择器1 > 选择器2
6.属性选择器 [属性名]
[属性名=属性值]
[属性名…^=属性值]
[属性名$=属性值]
[属性名*=属性值]
7.群组选择器:
选择器1,选择器2,... or
8.多条件选择器
选择器1选择器2,... and
#xpath选择器:
#xpath选择器
6. requests_html
import requests_html
url = 'http://www.xiaohuar.com'
# html = requests_html.HTML()
session = requests_html.HTMLSession()
# session.get(url=url)
# session.post()
r = session.request('get',url=url)
print(r.html)
#html对象属性
r.html.absolute_links 绝对路径
r.html.links 原样输出
r.html.base_url 默认的根路径
r.html.html 获取HTML页面
r.html.text 获取 HTML标签中的文本信息
r.html.encoding= 'gbk' 设置编码格式
r.html.raw_html 获取r.content
r.html.pq 获取pyquery对象
import requests_html
url = 'http://www.xiaohuar.com'
session = requests_html.HTMLSession()
r = session.request('get',url=url)
# print(r.html.absolute_links)
# print(r.html.links)
# print(r.html.base_url)
# r.html.encoding = ''
# print(r.html.html)
# print(r.html.text)
print(r.html.raw_html)
# print(r.html.pq)
requests方法:
r.html.find('css选择器')
r.html.find('css选择器',first=True)
r.html.xpath('xpath选择器')
r.html.xpath('xpath选择器',first=True)
r.html.search('模板') #result对象
r.html.search_all('模板')
r.html.render(......)
#参数:
script:"""
() =>
js代码
"""
scrolldow:n 向下翻几页
sleep:n 睡几秒
keep_page:True/False
import requests_html
url = 'https://baike.baidu.com/item/视频'
session = requests_html.HTMLSession()
r = session.request('get',url=url)
# print(r.html.html)
# print(r.html.find('img'))
# print(r.html.find('[name="word"]'))
print(r.html.search('<button class="{}"><em></em><span>{}</span></button>'))
print(r.html.search('<button class="{}"><em></em><span>{}</span></button>')[1])
print(r.html.search('<button class="{}"><em></em><span>{content}</span></button>')['content'])
#element对象与方法:
.absolute_links
.links
.html
.attrs,
.find('css选择器')
.search('模板')
.search_all('模板')
import requests_html
url = 'https://baike.baidu.com/item/视频'
session = requests_html.HTMLSession()
r = session.request('get',url=url)
print(r.html.find('[class="para-title level-2"] h2 span',first=True))
6.1 render
#render安装及其报错处理,参考如下博客:
#https://blog.csdn.net/weixin_30426957/article/details/101439477
#JS注入
session = HTMLSession(
browser_args=[
'--no-sand',
'--user-agent=xxxxx',
],headless=False
)
()=>{
Object.defineProperties(navigator,{
webdriver:{
get: () => undefined
}
})
#与浏览器进行交互
asynic def xxx():
await r.html.page.XXX
session.loop.run....(xxx())
.screenshot({'path':路径})
.evaluate('''() =>{js代码}’‘’})
.cookies()
.type('css选择器',’内容‘,{’delay‘:100})
.click('css选择器')
.focus('css选择器') 聚焦
.hover('css选择器')
.waitForSelector('css选择器')
.waitFor(1000)
from requests_html import HTMLSession, HTML
session = HTMLSession(
browser_args=[
'--no-sand',
'--user-agent=XXXXX',
], headless=False
)
url = 'https://baike.baidu.com/item'
r = session.request('get', url=url)
url = 'https://www.baidu.com'
r = session.get(url=url)
r.html.render(keep_page=True, sleep=1)
6.2键盘事件
.down('Shift')
.up('Shift')
.press('ArrowLeft')
.type('喜欢你啊',{‘delay’:100})
6.3鼠标事件
.click(x,y,{
'button':'left',
'click':1
'delay':0
})
.down({'button':'left'})
.up({'button':'left'})
.move(x,y,{'steps':1})
from requests_html import HTMLSession, HTML
session = HTMLSession(
browser_args=[
'--no-sand',
'--user-agent=XXXXX',
], headless=False
)
url = 'https://baike.baidu.com/item'
r = session.request('get', url=url)
url = 'https://www.baidu.com'
r = session.get(url=url)
r.html.render(keep_page=True, sleep=1)
async def run():
#交互语句
# mydic = await r.html.page.evaluate('''() =>{
# var a = document.querySelector('#kw')
# var b = a.getBoundingClientRect()
# return {'x':b.x,'y':b.y , 'width':b.width , 'height':b.height }
# }''')
# print(mydic)
# await r.html.page.screenshot({'path':'1.png','clip':mydic})
# await r.html.page.type('#kw','东京热',{'delay':400})
# await r.html.page.hover('li[class="category-item"]')
# await r.html.page.focus('#login_field')
# await r.html.page.keyboard.type('935938484@qq.com')
# await r.html.page.focus('#password')
# await r.html.page.keyboard.type('a-new-world')
# await r.html.page.click('[name="commit"]',{'button':'left'})
await r.html.page.keyboard.type('喜欢你啊aaaaa')
await r.html.page.keyboard.down('Shift')
for i in range(5):
await r.html.page.waitFor(100)
await r.html.page.keyboard.press('ArrowLeft')
await r.html.page.keyboard.up('Shift')
await r.html.page.keyboard.press('Backspace')
await r.html.page.waitFor(5000)
try:
session.loop.run_until_complete(run())
finally:
session.close()
7.数据库
查看数据库
show dbs 查看数据库
切换数据库
use db_name 切换数据库
增加数据库
db.table1.insert({'a':1}) 创建数据库(切换到数据库插入表及数据)
删除数据库
db.dropDatabase() 删数据库(删前要切换)
5.表
使用前先切换数据库
查看表
show tables 查所有的表
增加表
db.table1.insert({'b':2}) 增加表(表不存在就创建)
删除表
db.table1.drop() 删表
数据
db.test.insert(user0) 插入一条
db.user.insertMany([user1,user2,user3,user4,user5])插入多条
db.user.find({'name':'alex'}) 查xx==xx
db.user.find({'name':{"$ne":'alex'}}) 查xx!=xx
db.user.find({'_id':{'$gt':2}}) 查xx>xx
db.user.find({"_id":{"$gte":2,}}) 查xx>=xx
db.user.find({'_id':{'$lt':3}}) 查xx<xx
db.user.find({"_id":{"$lte":2}}) 查xx<=xx
db.user.update({'_id':2},{"$set":{"name":"WXX",}}) 改数据
db.user.deleteOne({ 'age': 8 }) 删第一个匹配
db.user.deleteMany( {'addr.country': 'China'} ) 删全部匹配
db.user.deleteMany({}) 删所有
pymongo
conn = pymongo.MongoClient(host=host,port=port, username=username, password=password)
db = client["db_name"] 切换数据库
table = db['表名']
table.insert({}) 插入数据
table.remove({}) 删除数据
table.update({'_id':2},{"$set":{"name":"WXX",}}) 改数据
table.find({}) 查数据