【Python】爬虫伴侣-Requests-HTML
requests-html 简介
Requests
库是 Python 中一款流行的 HTTP 请求库,用于简化 HTTP 请求的发送和处理,也是我们在使用 Python 做接口自动化测试时,最常用的第三方库。requests-html
是Requests
库作者的又一力作,它是基于现有的框架 PyQuery
、Requests
、lxml
、beautifulsoup4
等库进行了二次封装。集 HTTP 请求、HTML 解析、JavaScript 渲染等功能于一身,是爬虫的好伴侣。
但是需要提醒的是,这个库的最后更新时间是2019年
安装
pip install requests-html
使用
请求
from requests_html import HTMLSession
session = HTMLSession()
# 参数
browser.args = [
'--no-sand',
'--user-agent=XXXXX'
]
# 响应对象 = session.request(......)
# 响应对象 = session.get(......)
# 响应对象 = session.post(......)
响应
r.url
# 属性和requests模块一毛一样
解析
- html 对象属性
r.html.absolute_links # /xx/yy --> http://www....../xx/yy
r.links # 路径原样
r.base_url # 网站基础路径
r.html # 解码过的响应内容,相当于requests中的r.text
r.text
r.encoding = 'gbk' # 控制的是r.html.html的解码格式
r.raw_html # 相当于requests中的r.content
r.pq
- html 对象方法
r.html.find('css选择器') # [element对象, element对象...]
r.find('css选择器', first = True) # 对一个element对象
r.xpath('xpath选择器')
r.xpath('‘xpath选择器', first = True)
r.search('模板') # result对象(匹配第一次)
# 模板
r.search('xxx{}yyy{}')[0]
r.search('xxx{name}yyy{pwd}')['name']
r.search_all('模板') # 匹配所有, [result对象, result对象,....]
r.render(.....) # 渲染后的结果去替换r.html.html
# 参数
script:"""
( ) => {
js代码
js代码
}
"""
scrolldown:n
sleep:n
keep_page:True # True/False
# 绕过网站对webdriver的检测:
'''
() =>{
Object.defineProperties(navigator,{
webdriver:{
get: () => undefined
}
})
}
'''
- Element 对象方法及属性
# el为element对象
el.absolute_links
el.links
el.text
el.html
el.attrs
el.find('css选择器')
el.search('模板')
el.search_all('模板')
- 与浏览器交互(r.html.page.XXX)
async def xxx():
await r.html.page.XXX
session.loop.run....(xxx())
.screenshot({'path': 路径, 'clip': {'x': 1, 'y': 1, 'width': 100, 'height': 100}})
.evaluate('''() =>{js代码}}''')
.cookies()
.type('css选择器','内容',{'delay':100})
.click('css选择器', {'button': 'left', 'clickCount': 1, 'delay': 0})
.focus('css选择器')
.hover('css选择器')
.waitForSelector('css选择器')
.waitFor(1000)
- 键盘事件(r.html.page.keyboard.XXX)
.down('Shift')
.up('Shift')
.press('ArrowLeft')
.type('喜欢你啊', {'delay': 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})