知乎cookies的介绍_Requestium = Requests + Selenium

f27cf911f0f9a4f80c7b64bd41ae32a2.png

24e25791a4d5b3a67a360db9f1da04c1.png

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

下面的内容主要来自Requestsium的GitHub上的介绍: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所需参数。

from requestium import Session, Keys

s = Session(webdriver_path='./chromedriver',
            browser='chrome',
            default_timeout=15,
            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对象,所以它原本自带的方法都可以用:

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。

如果使用的是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

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

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值