当前位置:   article > 正文

知乎cookies的介绍_Requestium = Requests + Selenium

transfer_driver_cookies_to_session

f27cf911f0f9a4f80c7b64bd41ae32a2.png

24e25791a4d5b3a67a360db9f1da04c1.png

这个框架是我在知乎「Python有哪些常见的、好用的爬虫框架?」的高赞答案中看到的,试着用了一下,还挺好玩。

下面的内容主要来自RequestsiumGitHub上的介绍:https://github.com/tryolabs/requestium,少量是我自己的测试代码。

定位

Requestium是集RequestsSelenium于一体的WEB自动化工具。Requestium可以看作是在Requests为主体的基础上增加了Selenium的部分功能,如果你需要一个以Selenium为主体,增加部分Requests功能的Python库,可以去看一下 另一个叫做Selenium-Requests的库。

Requestium最主要的特性是能够在保持当前Web会话的同时,允许在Requests的Session和Selenium的Webdriver之间切换。

安装方法

pip install requestium

使用方法

对于能够熟练使用RequestsSelenium的人来说,学习Requestium几乎没有什么成本(Requestium的源码一共也只有400多行)。如果不熟悉的话还是要先去学这两个库,最好的学习资料就是它们的官方文档。

首先创建一个session,初始化参数包含webdriver的路径,浏览器,timeout时限,以及webdriver所需参数。

  1. from requestium import Session, Keys
  2. s = Session(webdriver_path='./chromedriver',
  3. browser='chrome',
  4. default_timeout=15,
  5. webdriver_options={'arguments': ['headless']})

至于浏览器,Requestium只支持PhantomJSChrome,鉴于PhantomJS已死,作者短时间内没有更新这个上次commit是2018年2月的库,我们可以认为Requestium只支持Chrome,当然自己写一个支持其他浏览器的版本也并非难事。

8d01f28ddf939e29484f8388cca1f9ab.png

Requests不同,我们不需要手动解析收到的响应,当调用xpath,css,re的时候,解析会自动完成,例如这样:

title = s.get('http://samplesite.com').xpath('//title/text()').extract_first(default='Default Title')

Requestium的session对象本质上就是Requests的session对象,所以它原本自带的方法都可以用:

  1. s.post('http://www.samplesite.com/sample', data={'field1': 'data1'})
  2. s.proxies.update({'http': 'http://10.11.4.254:3128', 'https': 'https://10.11.4.252:3128'})

也可以切换到webdriver模式来运行js代码:

  1. s.transfer_session_cookies_to_driver() # You can maintain the session if needed
  2. s.driver.get('http://www.samplesite.com/sample/process')

Requestium的session.driver对象本质上就是Selenium的driver对象,所以它原本自带的方法都可以用:

  1. s.driver.find_element_by_xpath("//input[@class='user_name']").send_keys('James Bond', Keys.ENTER)
  2. # New method which waits for element to load instead of failing, useful for single page web apps
  3. s.driver.ensure_element_by_xpath("//div[@attribute='button']").click()

除了原本自带的函数,Requestium的session.driver对象还有xpath,css,re方法,可以用来定位:

  1. if s.driver.re(r'ID_dwd some_pattern'):
  2. print('Found it!')

切换回session模式同样简单:

  1. s.transfer_driver_cookies_to_session()
  2. s.post('http://www.samplesite.com/sample2', data={'key1': 'value1'})

ensure 方法

Requestium的另一大特点是增加了一系列ensure 方法,可以确保driver确实发现了指定元素或者转移了cookie。

如果使用的是Seleniumfind_element_by_方法,一旦driver没有发现我们想要的元素,就会立刻抛出一个异常。而Requestium则会等待这个元素的出现。下面是四个Requestium可以等待的状态:

  • present (默认)
  • clickable
  • visible
  • invisible (例如等待loading... 消失)

一些对比的例子

官网上的一个例子:登录Reddit

使用Requestium时的代码量只有使用Requests + Selenium + lxml的一半。(可不是嘛,你把好多try...except都用ensure封装起来了 )。

26a923abb678c2b0a66c4cc5e718c278.png

cac148c2d1aeb94e19f5d1400a7a724c.png

一个例子——用Requestium登录浙大通行证

霏霏:【JS逆向】模拟登录浙大通行证​zhuanlan.zhihu.com
b74cf0da0a3b33056fd85ceb5a984c58.png

速度要慢一点,但是写起来不用动脑子。

  1. import re
  2. from requestium import Session, Keys
  3. login_url = 'https://zjuam.zju.edu.cn/cas/login'
  4. s = Session(webdriver_path='/usr/local/bin/chromedriver',
  5. browser='chrome',
  6. default_timeout=15,
  7. webdriver_options={'arguments': ['headless']}
  8. )
  9. s.driver.get(login_url)
  10. s.driver.find_element_by_xpath("//*[@id='username']").send_keys('')
  11. s.driver.find_element_by_xpath("//*[@id='password']").send_keys('', Keys.ENTER)
  12. s.transfer_driver_cookies_to_session()
  13. resp = s.get(login_url)
  14. print(re.search('nick: '(.*?)'', resp.text).group(1), '登录成功!')

欢迎关注~

3f76b5d638ff1d9ed595718d80b3e1db.png
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/372287
推荐阅读
相关标签
  

闽ICP备14008679号