![f27cf911f0f9a4f80c7b64bd41ae32a2.png](https://i-blog.csdnimg.cn/blog_migrate/b0d69b38094869ee67d6d2c649b154a0.png)
![24e25791a4d5b3a67a360db9f1da04c1.png](https://i-blog.csdnimg.cn/blog_migrate/0c7f47e8983216f656d4ff65db20a8e0.png)
这个框架是我在知乎「Python有哪些常见的、好用的爬虫框架?」的高赞答案中看到的,试着用了一下,还挺好玩。
下面的内容主要来自Requestsium
的GitHub上的介绍:https://github.com/tryolabs/requestium,少量是我自己的测试代码。
定位
Requestium
是集Requests
和Selenium
于一体的WEB自动化工具。Requestium
可以看作是在Requests
为主体的基础上增加了Selenium
的部分功能,如果你需要一个以Selenium
为主体,增加部分Requests
功能的Python库,可以去看一下 另一个叫做Selenium-Requests
的库。
Requestium
最主要的特性是能够在保持当前Web会话的同时,允许在Requests的Session和Selenium的Webdriver之间切换。
安装方法
pip install requestium
使用方法
对于能够熟练使用Requests
和Selenium
的人来说,学习Requestium
几乎没有什么成本(Requestium
的源码一共也只有400多行)。如果不熟悉的话还是要先去学这两个库,最好的学习资料就是它们的官方文档。
首先创建一个session,初始化参数包含webdriver
的路径,浏览器,timeout时限,以及webdriver
所需参数。
from requestium import Session, Keys
s = Session(webdriver_path='./chromedriver',
browser='chrome',
default_timeout=15,
webdriver_options={'arguments': ['headless']})
至于浏览器,Requestium
只支持PhantomJS
和Chrome
,鉴于PhantomJS
已死,作者短时间内没有更新这个上次commit是2018年2月的库,我们可以认为Requestium
只支持Chrome
,当然自己写一个支持其他浏览器的版本也并非难事。
![8d01f28ddf939e29484f8388cca1f9ab.png](https://i-blog.csdnimg.cn/blog_migrate/b623796245f43c877acfe02d5c5caed1.jpeg)
和Requests
不同,我们不需要手动解析收到的响应,当调用xpath,css,re的时候,解析会自动完成,例如这样:
title = s.get('http://samplesite.com').xpath('//title/text()').extract_first(default='Default Title')
Requestium
的session对象本质上就是Requests
的session对象,所以它原本自带的方法都可以用:
s.post('http://www.samplesite.com/sample', data={'field1': 'data1'})
s.proxies.update({'http': 'http://10.11.4.254:3128', 'https': 'https://10.11.4.252:3128'})
也可以切换到webdriver
模式来运行js代码:
s.transfer_session_cookies_to_driver() # You can maintain the session if needed
s.driver.get('http://www.samplesite.com/sample/process')
Requestium
的session.driver对象本质上就是Selenium
的driver对象,所以它原本自带的方法都可以用:
s.driver.find_element_by_xpath("//input[@class='user_name']").send_keys('James Bond', Keys.ENTER)
# New method which waits for element to load instead of failing, useful for single page web apps
s.driver.ensure_element_by_xpath("//div[@attribute='button']").click()
除了原本自带的函数,Requestium
的session.driver对象还有xpath,css,re方法,可以用来定位:
if s.driver.re(r'ID_dwd some_pattern'):
print('Found it!')
切换回session模式同样简单:
s.transfer_driver_cookies_to_session()
s.post('http://www.samplesite.com/sample2', data={'key1': 'value1'})
ensure 方法
Requestium
的另一大特点是增加了一系列ensure
方法,可以确保driver确实发现了指定元素或者转移了cookie。
如果使用的是Selenium
的 find_element_by_
方法,一旦driver没有发现我们想要的元素,就会立刻抛出一个异常。而Requestium
则会等待这个元素的出现。下面是四个Requestium
可以等待的状态:
- present (默认)
- clickable
- visible
- invisible (例如等待loading... 消失)
一些对比的例子
官网上的一个例子:登录Reddit
使用Requestium
时的代码量只有使用Requests + Selenium + lxml
的一半。(可不是嘛,你把好多try...except
都用ensure
封装起来了 )。
![26a923abb678c2b0a66c4cc5e718c278.png](https://i-blog.csdnimg.cn/blog_migrate/8ec7de79ce1311bfb8cb418ea40283a8.jpeg)
![cac148c2d1aeb94e19f5d1400a7a724c.png](https://i-blog.csdnimg.cn/blog_migrate/54c5892b5f029124af5babbf5e5e5793.jpeg)
一个例子——用Requestium登录浙大通行证
霏霏:【JS逆向】模拟登录浙大通行证zhuanlan.zhihu.com![b74cf0da0a3b33056fd85ceb5a984c58.png](https://i-blog.csdnimg.cn/blog_migrate/95e5d3a51c4f911481e11d3ddf5ba8db.jpeg)
速度要慢一点,但是写起来不用动脑子。
import re
from requestium import Session, Keys
login_url = 'https://zjuam.zju.edu.cn/cas/login'
s = Session(webdriver_path='/usr/local/bin/chromedriver',
browser='chrome',
default_timeout=15,
webdriver_options={'arguments': ['headless']}
)
s.driver.get(login_url)
s.driver.find_element_by_xpath("//*[@id='username']").send_keys('')
s.driver.find_element_by_xpath("//*[@id='password']").send_keys('', Keys.ENTER)
s.transfer_driver_cookies_to_session()
resp = s.get(login_url)
print(re.search('nick: '(.*?)'', resp.text).group(1), '登录成功!')
欢迎关注~
![3f76b5d638ff1d9ed595718d80b3e1db.png](https://i-blog.csdnimg.cn/blog_migrate/47469e04309be513731159dc31b00291.jpeg)