欢迎来到Cecilia陈的博客

孤独,是人一生最好的修行。

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.前端反调试
posted @ 2020-01-05 19:17  Cecilia陈  阅读(323)  评论(0编辑  收藏  举报