爬虫流程
发送请求--获得数据--解析数据--存储数据
用于解析数据库
bs4 pyquery re
请求特别关心
URL method Header: Cookie 存储 Referer上一次跳转 User-Agent请求头
响应特别关心
不要把status 作为请求是否成功的结果
处理发送请求的requests库
响应对象 = requests.get(......)
携带的参数
url
headers = {} #请求头
cookies = {} #请求cookie
params = {} #请求携带的参数
proxies = {'http':‘http://端口:ip’} #代理
timeout #超时时间
allow_redirects = False #不允许跳转
响应对象 = requests.post(......)
url:
headers = {}
cookies = {}
data = {} #表单
json = {} #jason
files = {‘file’:open(...,‘rb’)} #文件
timeout = 0.5
allow_redirects = False
自动保存cookie的请求
session=request.session() #先使用session发送请求,登陆网站,把cookie保存在session中 response=session.get(url,headers) #下次再使用session请求登陆后才能访问网站,session能够自动的携带登陆成功的session
保存cookie到本地
import http.cookiejar as cookielib session.cookie = cookielib.LWPCookieJar() session.cookie.save(filename='1.txt') session.cookies.load(filename='1.txt')
响应的方法
r.url r.text r.encoding = 'gbk' r.content r.json() r.status_code r.headers r.cookies r.history
牛逼请求库2
requests-html
pip install requests-html from requests_html import HTMLSession session = HTMLSession() **参数:** browser.args = ['--no-sand', '--user-agent =XXXXX'] #默认是无头,这怎么可以?容易被识别 必须改掉,空格一定不能有
session = HTMLSession(browser_args=['--no-sand','--user-agent=Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'],headless=False)
requests-html res.html 对象属性与方法
属性
from requests_html import HTMLSession
session = HTMLSession()
res=session.get(r"http://www.tuniu.com/?p=15295&utm_source=baidu&utm_medium=cpc&utm_campaign=SE&fc=u9765489.k22013360876.a6753602032.pb")
print(res.html.absolute_links)
其他:
.absolute_link 绝对的link url组成的列表
.links #原来的连接 .base_url #根域名 .html .text .encoding = 'gbk' .raw_html #二进制流 .pq #
实例化HTTPsession() 会下载drive
方法
r.html.find('css选择器') .find('css选择器',first = True) .xpath(‘xpath选择器’) .xpath('css选择器',first = True) .search(‘模板’)
.search__all(‘模板’)
print(res.html.search_all("[国庆]<{name}总统府")) #【Result_obj,Result_obj,Result_obj】
print(res.html.search("[国庆]<{name}总统府")) #Result_obj
使用request-html注意点
把head-less设成False
try: r.html.render(script=scrapts,sleep=1,keep_page=True) async def main(): # await r.html.page.screenshot({"path":'2.png','clip':{'x':200,'y':200,'width':400,'height':400}}) #截屏 # res = await r.html.page.evaluate(''' # ()=>{ # var a = document.querySelector("#list") # return {'x':a.offsetLeft} # } # ''') # print(res) # print(await r.html.page.cookies()) # await r.html.page.type('#kw','泷泽萝拉',{'delay':500}) # await r.html.page.waitForSelector('[name="tj_trnews"]') # await r.html.page.click('[name="tj_trnews"]') # await r.html.page.focus('[type="number"]') # await r.html.page.keyboard.type('111111',{'delay':200}) # await r.html.page.hover('[data-stat-id="6f5c93b4d1baf5e9"]') # await r.html.page.keyboard.type('喜欢你啊啊啊', {'delay': 200}) # await r.html.page.keyboard.down('Shift') # for i in range(3): # await r.html.page.keyboard.press('ArrowLeft',{'delay': 1000}) # await r.html.page.keyboard.up('Shift') # await r.html.page.keyboard.press('Backspace') res = await r.html.page.evaluate(''' ()=>{ var a = document.querySelector('[alt="【究极爆肝】德克萨斯与拉普兰德的感伤往事(明日方舟描改 动画手书·完整版)"]') return { 'x':a.x+a.width/2, 'y':a.y+a.height/2 } } ''') print(res) # await r.html.page.mouse.move(res['x'],res['y'],{'steps':200}) # await r.html.page.mouse.down({'button':'right'}) # await r.html.page.mouse.up({'button':'right'}) # await r.html.page.mouse.click(res['x'],res['y']) await r.html.page.waitFor(5000) session.loop.run_until_complete(main()) finally: session.close()
keep_page需改为True否则无法对渲染页面进行操作
与浏览器进行交互
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)
键盘事件 r.html.page.keyboard.XXX
.down('Shift') .up('Shift') .press('ArrowLeft') #按一下放开 .type('喜欢你啊',{‘delay’:100}) #输入 每个间隔控制在100毫秒
鼠标事件 r.html.page.mouse.XXX
.click(x,y,{ 'button':'left', 'click':1 'delay':0 }) .down({'button':'left'}) .up({'button':'left'}) .move(x,y,{'steps':1})