我们日常工作中,单纯的HTTP请求,程序员都倾向于使用万能的python Requests库。但大多数场景下,我们的需求页面不是纯静态网页,网页加载过程中伴随有大量的JS文件参与页面的整个渲染过程,且页面的每一步操作可能都能找到异步加载XHR的影子。所以Requests库不是万能的,Requests-Html库就能解决一部分问题,前提是您知道这个过程加载了哪些js文件。小爬的实际工作中,更倾向于Requests+selenium的模式来完成整个网页信息的爬取。

能用Requests库直接请求获得数据的,就直接用requests的Session类来请求,碰到页面中JS载入较多的,就切换到selenium来执行。

  那么问题来了,如何从requests优雅地切换到selenium来完成整个网页的自动化过程呢?很多时候,我们的页面信息爬取,服务器都是要求用户先登陆的,然后每次请求的时候保证会话session和基本cookies不变,就可以一直保证后台的登陆状态。那么requests库的cookies如何传给selenium用呢?这样切换到selenium时,我们不用再次登陆,而是直接用requests给的cookies绑定到 selenium下,请求目标网页,打开的网页就可以天然是登陆状态了。

  我们先使用requests库来登陆,代码通常是这样(需要抓包看后台的post请求的data参数,我们请求前构造这个参数就可以了,每个网页的登陆的data参数不尽相同):

loginData={'redirect':'','username':username,'password':psw}
session = requests.Session()
r=session.post('%sportal/u/a/login.do'%base_url,loginData)

  完成这部操作后,我们可以通过Post请求的status_code是否等于200来判断页面是否成功登陆。一旦登陆成功,则我们的session请求该网站后续的网页时,这个session就可以一直保持下去了。

接下来,我么要拿到requests登陆网站后的cookies,它是requests的Cookiejar类的一个实例。Cookiejar简单来说就是获取响应的cookie,cookie是存储在浏览器的一些信息,包括用户的登陆信息和一些操作,我们从服务器中获取的响应信息中,有时候也会包含一些cookie信息。

  问题是这个cookiejar对象不是我们常见的字典型cookies对象,我们需要利用requests库的utils.dict_from_cookiejar方法来把cookiejar对象转换为python的字典对象。

cookies=session.cookies
cookies=requests.utils.dict_from_cookiejar(cookies)

  得到的cookies大概如下形式:

  但是这依然不是selenium支持的cookies格式。实际上,selenium使用driver.get_cookies()方法得到的cookies如下:列表中包含多个cookie字典,每个字典中包含多个键值对,而所有的键中,有的不是必须的,但是“name","value"这两个键是必填的。

[{'domain': '.yourdomain.com', 'httpOnly': False, 'name': 'HAP_HTTP_PATH', 'path': '/', 'secure': False, 'value': 'http://yourdomain.com:80/hap'},{},{}]
所以,我们只需要将我们上文转化后的cookies字典转化为selenium能认得的cookies即可,方法如下:
    
   driver.get(base_url)
  """传递request cookie给 selenium用"""
for k,v in cookies.items():
driver.add_cookie({"name":k,"value":v})

需要注意的是,必须先要driver.get(your url),然后才能使用driver.add_cookie方法,否则selenium会报错。

  至此,我们的selenium就成功添加了requests中捕获的响应的cookies,我们的selenium就不用再被服务器要求先登陆了。requests就和selenium完成了无缝衔接,完美!

requests库结合selenium库共同完成web自动化和爬虫工作的更多相关文章

  1. Selenium+Python+jenkins搭建web自动化测测试框架

    python-3.6.2 chrome 59.0.3071.115 chromedriver 2.9 安装python https://www.python.org/downloads/  (Wind ...

  2. windiows下搭建python+selenium+unittest+Chrome的Web自动化环境

    一.selenium.unittest概念 Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架.它是一款用于运行端到端功能测试的超强工具.您可以使用多个编程语言编写测试,并且 ...

  3. Java+Selenium 3.x 实现Web自动化 - 1.自动化准备

    (一)自动化准备 说明:本文主要记录了基于公司现有项目(一个电子商务平台),从0开始实现UI自动化的历程.从准备阶段,部分内容直接省略了基础知识,一切以最终做成自动化项目为目标,难免会有晦涩之处.文章 ...

  4. Java+Selenium 3.x 实现Web自动化 - Maven打包TestNG,利用jenkins执行测试

    1. Jenkins本地执行测试 or 服务器端执行测试 测试代码计划通过jenkins执行时,通过网上查询各种教程,大多数为本地执行测试,由此可见,本地执行是大多数人的选择. 经过探讨,最终决定采用 ...

  5. python应用之爬虫实战2 请求库与解析库

    知识内容: 1.requests库 2.selenium库 3.BeautifulSoup4库 4.re正则解析库 5.lxml库 参考: http://www.cnblogs.com/wupeiqi ...

  6. 爬虫实战:爬虫之 web 自动化终极杀手 ( 上)

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:陈象 导语: 最近写了好几个简单的爬虫,踩了好几个深坑,在这里总结一下,给大家在编写爬虫时候能给点思路.本次爬虫内容有:静态页面的爬 ...

  7. 爬虫 - 请求库之selenium

    介绍 官方文档 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的 ...

  8. python爬虫---selenium库的用法

    python爬虫---selenium库的用法 selenium是一个自动化测试工具,支持Firefox,Chrome等众多浏览器 在爬虫中的应用主要是用来解决JS渲染的问题. 1.使用前需要安装这个 ...

  9. Python3 使用selenium库登陆知乎并保存cookie为本地文件

    Python3 使用selenium库登陆知乎并保存cookie为本地文件 学习使用selenium库模拟登陆知乎,并将cookie保存为本地文件,然后供以后(requests模块)使用,用selen ...

随机推荐

  1. <Mysql必知必会> ---- 笔记

    转载自  https://www.jianshu.com/p/294502893128 挺基础的mysql的书籍,基本上都是如何操作的语法. 第1章 了解SQL 主键(primary key):能够唯 ...

  2. AspNetPager 样式

    使用方法: 1.引入样式表. 将 想要使用的样式表加入到本页面<style type="text/css"></style>标记中,或者新建一个css文件如 ...

  3. genymotion 和genymotion eclipse 插件安装 !

    昨天天有好心网友在群里共享了一个好用的 android 模拟器 genymotion 昨天就试用了下 真心流畅 各位不妨一试 http://www.genymotion.com/ doc https: ...

  4. jmter正则表达式提取器

    1.若返回的body内容为空,仅有 header值,则: \s代表为空 2.使用Debug来调试

  5. 4818 Largest Empty Circle on a Segment (几何+二分)

    ACM-ICPC Live Archive 挺水的一道题,直接二分圆的半径即可.1y~ 类似于以前半平面交求核的做法,假设半径已经知道,我们只需要求出线段周围哪些位置是不能放置圆心的即可.这样就转换为 ...

  6. @雅礼集训01/10 - T1@ matrix

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个矩阵.求它的所有子矩阵中本质不同的行的个数之和. inp ...

  7. Serverless助力AI计算:阿里云ACK Serverless/ECI发布GPU容器实例

    ACK Serverless(Serverless Kubernetes)近期基于ECI(弹性容器实例)正式推出GPU容器实例支持,让用户以serverless的方式快速运行AI计算任务,极大降低AI ...

  8. CODE FESTIVAL 2017 qual B C 3 Steps(补题)

    总感觉这题是个题意杀,理解错题目了,看了好久才发现题目意思:操作是让,只要两点没有直接相连,而且只要有一条路的距离3,就可以把这两点连接起来. 按照题解中讲的,可以把图分为二分图和非二分图来解.不过题 ...

  9. 2019-6-23-win10-uwp-解决-SerialDevice.FromIdAsync-返回空

    title author date CreateTime categories win10 uwp 解决 SerialDevice.FromIdAsync 返回空 lindexi 2019-6-23 ...

  10. PHP redis安装扩展

    命令: 查看php版本:PHP -v 查看php安装的扩展:PHP -m php扩展开发包(包括phpize,php -config):yum install php-devel which phpi ...