requests库结合selenium库共同完成web自动化和爬虫工作

  我们日常工作中,单纯的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完成了无缝衔接,完美!

原文地址:https://www.cnblogs.com/new-june/p/12095905.html

时间: 2024-08-28 09:08:16

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

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

(一)自动化准备 说明:本文主要记录了基于公司现有项目(一个电子商务平台),从0开始实现UI自动化的历程.从准备阶段,部分内容直接省略了基础知识,一切以最终做成自动化项目为目标,难免会有晦涩之处.文章主要用于记录过程,翻阅回顾.如有记录出错,描述晦涩之处,望读者能及时指出,一起进行讨论交流,以免误导他人. 1 所使用工具的简单介绍 1.java + selenium WebDriver:用于脚本的编写: 2.TestNG:测试框架,用于结构化用例,生成测试报告: 3.log4j2:用于生成日志:

Python(80)_使用selenium实现第一个web自动化程序

百度搜索 #-*-coding:utf-8-*- from selenium import webdriver f = webdriver.Chrome("D:\\Documents\\Downloads\\chromedriver.exe") f.get("http://www.baidu.com") f.find_element_by_id('kw').send_keys('selenium') f.find_element_by_id('su').click(

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

知识内容: 1.requests库 2.selenium库 3.BeautifulSoup4库 一.requests库 1.安装及简单使用 (1)安装 1 pip3 install requests (2)简单使用 1 import requests 2 3 r = requests.get("http://www.baidu.com") # 发起get请求 4 print(r.status_code) # 打印状态码 5 r.encoding = "utf-8"

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

欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:陈象 导语: 最近写了好几个简单的爬虫,踩了好几个深坑,在这里总结一下,给大家在编写爬虫时候能给点思路.本次爬虫内容有:静态页面的爬取.动态页面的爬取.web自动化终极爬虫. 分析: 数据获取(主要靠爬虫) 静态网页爬取 动态网页爬取 数据存储(python excel存储) Python Excel操作,保存结果 数据获取实战: 百度音乐(静态网页) 分析步骤1 . 打开百度音乐:http://music.baidu.com/

浅谈python中selenium库调动webdriver驱动浏览器的实现原理

最近学web自动化时用到selenium库,感觉很神奇,遂琢磨了一下,写了点心得. 当我们输入以下三行代码并执行时,会发现新打开了一个浏览器窗口并访问了百度首页,然而这是怎么做到的呢? 1 from selenium import webdriver 2 driver = webdriver.Chrome() 3 driver.get('http://www.baidu.com') 首先我们来看一下selenium库的结构: 很显然,selenium就是一个软件包,里面有两个一级子包,commo

Python:requests库、BeautifulSoup4库的基本使用(实现简单的网络爬虫)

Python:requests库.BeautifulSoup4库的基本使用(实现简单的网络爬虫) 一.requests库的基本使用 requests是python语言编写的简单易用的HTTP库,使用起来比urllib更加简洁方便. requests是第三方库,使用前需要通过pip安装. pip install requests 1.基本用法: import requests #以百度首页为例 response = requests.get('http://www.baidu.com') #res

为采集动态网页安装和测试Python Selenium库

1. 引言 上一篇<为编写网络爬虫程序安装Python3.5>中测试小例子对静态网页做了一个简单的采集程序,而动态网页因为需要动态加载js获取数据,所以使用urllib直接openurl已经不能满足采集的需求了.这里我们使用selenium库,通过它我们可以很简单的使用浏览器来为我们加载动态内容,从而获取采集结果. 在很多案例中,Selenium与PhantomJS搭配采集动态网页内容(可以参看我以前发表的案例文章),直接与Firefox或者Chrome搭配,可以应对一些更加复杂的采集情形,比

用requests库和BeautifulSoup4库爬取新闻列表

1.用requests库和BeautifulSoup4库,爬取校园新闻列表的时间.标题.链接.来源. import requests from bs4 import BeautifulSoup mt="http://news.gzcc.cn/html/xiaoyuanxinwen/" res=requests.get(mt) res.encoding='utf-8' soup=BeautifulSoup(res.text,"html.parser") for new

requests库和BeautifulSoup4库爬取新闻列表

画图显示: import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt txt = open("zuihou.txt","r",encoding='utf-8').read() wordlist = jieba.lcut(txt) wl_split=" ".join(wordlist) mywc = WordCloud().generate(wl_spl