10 requests-html
目录
一、requests-html介绍
使用Python开发的同学一定听说过Requsts库,它是一个用于发送HTTP请求的测试。如比我们用Python做基于HTTP协议的接口测试,那么一定会首选Requsts,因为它即简单又强大。
而requests库也是用作于爬虫。
现在作者Kenneth Reitz 又开发了requests-html 用于做爬虫。
requests-html 是基于现有的框架 PyQuery、Requests、lxml、beautifulsoup4等库进行了二次封装
1.全面支持解析JavaScript!
2.CSS 选择器 (jQuery风格, 感谢PyQuery).
3.XPath 选择器
4.自定义user-agent (就像一个真正的web浏览器).
5.自动追踪重定向.
6.连接池与cookie持久化.
二、requests-html和requests的区别
requests:
1.首先是需要利用requests.get/post去去url进行请求
2.利用解析库xpath、beautifulsoup、re...等去进行数据解析提取
如下:
import requests
from pyquery import PyQuery as pq
#获取网页
html = requests.get()
#解析网页
doc = pq(html)
requests-html:
只需要一步就可以完成而且直接进行js渲染
from requests_html import HTMLSession
session = HTMLSession() # 生成一个对象
r = session.get(url='http://httpbin.org/get')
print(r.html.html)# 就是已经解析好的响应内容了
三、安装
打开pycharm终端
pip install requests-html
四、requests-html的使用
1.请求
from requests_html import HTMLSession
session = HTMLSession()
**参数:浏览器所带的参数**
browser.args = [
'--no-sand',
'--user-agent=XXXXX'
]
响应对象 = session.request(......)
响应对象 = session.get(......)
响应对象 = session.post(......)
2.响应
获取它响应的内容(属性和方法一样)
我们先来一个百度小案例
from requests_html import HTMLSession, HTML
session = HTMLSession()
# 发送请求和requests模块一模一样
r = session.get(url='http://www.baidu.com')
'''r.html 返回的是html对象,有很多可用的方法'''
print(type(r.html))
print(r.html.html) # 返回的是解析好的响应内容
# 属性(r.html对象的属性)
.links #获取网页内的所有连接(页面上所有欲偶的连接,句对路径)
r.html.links # 返回列表
.base_url #返回的是请求网站的路径
.html #解析过的响应内容,相当如r.text
.text
.encoding #响应内容的编码格式
r.html.encoding # 查看编码格式
r.html.encoding='utf8' #修改编码格式
.raw_html #相当于r.content,获取二进制
.pq #转换成pyquery对象
#方法(r.html对象的方法)
.find('css选择器') #返回列表[element_obj,····][]取对象
r.html.find('.title')[0].text #取.title标签对象的文本内容
.find('css选择器',first=True)
r.html.find('.title',first=True) # 第一个.title的标签对象
.search('模板')
results = r.html.search('下载百{}')
#返回<Result ('度',) {}> 相当于是无名分组
print(results[0])
results1 = r.html.search('下载百{name}')
#<Result () {'name': '度'}> 相当于是有名分组
print(results1['name'])
.search_all('模板')#匹配所有,[result对象,result对象,....]
.render(.....)#渲染后的结果去替换 r.html.html
#当第一次使用的时候,会自动下载一个内核浏览器
# r.html.render() #利用内核在重新向url发送一次请求、
# 参数reload=False--不会重新发送请求、会加载内存中已经请求回来的数据进行渲染
# r.html.render(reload=False)# 替换r.html.html
'''参数'''
script:'''( ) => {
js代码
js代码
}
'''
scrolldown:n
sleep:n
keep_page:True/False #(默认为False)
r.html.page#如果配置了keeo_page=False的话,当请求结束以后,他会将r.html.page=none不会保留,浏览器就会关闭
#如果想要和浏览器进行交互的话,就要将keep_page设为True,他会将r.html.page保留,浏览器不会关闭
#绕过网站对webdriver的检测:
'''
() =>{ Object.defineProperties(navigator,{
webdriver:{
get: () => undefined
}
})
}
'''
五、与浏览器交互(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)
六、键盘事件(keyboard.xxx)
.down('Shift')
.up('Shift')
.press('ArrowLeft')
.type('喜欢你啊',{‘delay’:100})
七、鼠标事件(mouse.xxx)
.click(x,y,{
'button':'left',
'click':1
'delay':0
})
.down({'button':'left'})
.up({'button':'left'})
.move(x,y,{'steps':1})
八、常见反扒手段
1.检测浏览器headers
#携带需要的请求头参数即可
2.ip封禁
#可以使用ip代理
# 有时候ip封禁以后,你会发现你周围所有的ip都被禁了,这叫做误伤
# 因为大家使用的都是同一个局域网
3.图片验证码
4.滑动模块
# 首先我们看见滑动模块的时候
# 1.先把完整的图片截取下来
# 2.在把有缺口的图片截取下来
# 3.比对两张图片,通过两张图片的x,y坐标点
# 4.两张图片同时移动x,y坐标
# 5.对比两张图片相同坐标点的颜色
# 6.当出现颜色不一样时,就可以确定如何滑动了
# 7.(一般都是水平移动,y轴不用变)
# 8.一定要设置非运匀速的滑动,并且要做一些快慢的处理,否则很可能被检测出
5.js加密算法
5.js轨迹
6.前端反调试