赞
踩
这个框架是我在知乎「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
,当然自己写一个支持其他浏览器的版本也并非难事。
和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'})
Requestium
的另一大特点是增加了一系列ensure
方法,可以确保driver确实发现了指定元素或者转移了cookie。
如果使用的是Selenium
的 find_element_by_
方法,一旦driver没有发现我们想要的元素,就会立刻抛出一个异常。而Requestium
则会等待这个元素的出现。下面是四个Requestium
可以等待的状态:
使用Requestium
时的代码量只有使用Requests + Selenium + lxml
的一半。(可不是嘛,你把好多try...except
都用ensure
封装起来了 )。
速度要慢一点,但是写起来不用动脑子。
- 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), '登录成功!')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。