requests-html

1. requests-html简介

官方文档:http://html.python-requests.org/

GiHub项目地址:https://github.com/kennethreitz/requests-html

使用Python开发的同学一定听说过Requsts库,它是一个用于发送HTTP请求的测试。如比我们用Python做基于HTTP协议的接口测试,那么一定会首选Requsts,因为它即简单又强大。现在作者Kenneth Reitz 又开发了requests-html 用于做爬虫。

requests-html 是基于现有的框架 PyQuery、Requests、lxml、beautifulsoup4等库进行了二次封装,作者将Requests设计的简单强大的优点带到了该项目中。

requests-html和其他解析HTML库最大的不同点在于HTML解析库一般都是专用的,所以我们需要用另一个HTTP库先把网页下载下来,然后传给那些HTML解析库。而requests-html自带了这个功能,所以在爬取网页等方面非常方便。

2. 安装

pip install requests-html

3. 使用

3.1 请求

from requests_html import HTMLSession

session = HTMLSession()

# 参数
browser.args = [
	'--no-sand',
	'--user-agent=XXXXX'
]

# 响应对象 = session.request(......)

# 响应对象 = session.get(......)

# 响应对象 = session.post(......)

参数和requests模块一模一样

3.2 响应

r.url
# 属性和requests模块一毛一样

3.3 解析

3.3.1 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

3.3.2 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
			}
		})
	}
'''

3.3.3 Element对象方法及属性

# el为element对象
el.absolute_links
el.links
el.text
el.html
el.attrs
el.find('css选择器')
el.search('模板')
el.search_all('模板')

3.3.4 与浏览器交互(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)

3.3.5 键盘事件(r.html.page.keyboard.XXX)

.down('Shift')
.up('Shift')
.press('ArrowLeft')
.type('喜欢你啊', {'delay': 100})

3.3.6 鼠标事件(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})
posted @ 2020-01-06 17:11  油饼er  阅读(1056)  评论(0编辑  收藏  举报