Selenium爬虫实践(踩坑记录)之ajax请求抓包、浏览器退出
上一篇: 使用Selenium截取网页上的图片
前言
最近在搞公司内部系统,累的一批,需要从另一个内部系统导出数据存到数据库做分析,有大量的数据采集工作,又没办法去直接拿到那个系统的接口,太难了,只能爬虫,但是cookie还经常失效,为了不每次登录失效就来找我重新注入Cookie,我写了一个手机版的网页,用来控制后台的selenium自动登录,截取token和cookie。

ajax请求抓包方案
搜索资料的过程真的痛苦,不过还好这时间没有白花,最终还是解决了问题……
根据找到的资料,有以下几种方法可以在Selenium中抓取ajax请求中的数据
- 使用本地代理:browsermob-proxy (本文采用的方法)
- 使用selenium的执行js功能注入 ajax hook 并执行,然后本地开一个服务器接收拦截到的ajax数据(见第三个参考资料)
- 用第三方库selenium-wire,这个是一个GitHub上的开源项目,可以直接截取response_code和body,原理应该走的也是代理
- 开启selenium的性能抓取,在性能日志里面可以做改动,以拦截response_body(详见第一个参考资料)
使用本地代理
本文使用Browsermob-Proxy这个代理服务器,这个是用Java写的,有一个python封装的接口包可以方便交互……
先去下载:https://github.com/lightbody/browsermob-proxy/releases
安装python包:
pip install browsermob-proxy
在代码中使用,这里我截取了项目的部分代码,随便看看就好了,完整代码可以看官网文档或者参考资料~
有几个需要注意的坑的地方,我在代码中标出了
# 创建代理服务器
self.server = Server(
# Windows就是bat,如果Linux就是另一个不带后缀名的
r'path\bin\browsermob-proxy.bat',
# 这里可以自定义端口
options={'port': 9090}
)
# 这里启动服务器,等会机会要关掉,不然下次用就端口占用冲突了
self.server.start()
# 注意这里一定要 trustAllServers 不然等会selenium会报 error_tunnel 错误
self.proxy = self.server.create_proxy(params={'trustAllServers': 'true'})
# 设置selenium的代理
options = ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument(f'--proxy-server={self.proxy.proxy}')
self.driver = webdriver.Chrome(options=options)
使用代理来进行抓包,我这个项目需要在ajax请求的header里面提取出token和cookie,截取了关键部分的代码如下:
self.proxy.new_har('抓包名称 自己起一个', options={'captureHeaders': True, 'captureContent': True})
# 找到需要点击的元素
elem_query = self.driver.find_element_by_css_selector(elem_css_selector)
elem_query.click()
# 点击按钮后等待 并把数据取出来
time.sleep(5)
result = self.proxy.har
data = {}
for entry in result['log']['entries']:
url = entry['request']['url']
# 根据URL找到数据接口
if 'xxx/query' in url:
_response = entry['response']
_content = _response['content']['text']
for item in entry['request']['headers']:
# 提取出header里面的 token
if item['name'] == 'Authorization':
data['authorization'] = item['value']
# 提取出header里面的 cookie
if item['name'] == 'Cookie':
data['cookie'] = item['value']
break
print(data)
以上代码同样不是完整代码,不过已经将具体抓包的过程完整表达出来,需要的同学可以根据自己的实际需求进行编码,只要能抓到数据,一切都好说~
浏览器和代理服务器退出
这个没啥好写的,但是也有一个小坑,水一下吧~
从上面的代码里也可以看出来,我写了一个类来操作Selenium,程序执行完了肯定要把代理和服务器关了,不然selenium会留着一个 chromedriver.exe 的进程在后台占用资源,时间一长,系统内存都满了。
我在类的__del__方法中加入了关闭代理服务器和浏览器的代码,如下:
def __del__(self):
print('SeleniumFxxkUnicom has been deleted.')
self.proxy.close()
self.server.stop()
for win in self.driver.window_handles:
self.driver.switch_to.window(win)
self.driver.close()
os.system('taskkill /im chromedriver.exe /F')
注意这个循环的driver.close(),在__del__里是没办法正常执行driver.quit()的,按理说quit才是最好的退出方法,但是他还要导入什么鬼乱七八糟的模块,导致我在这个__del__里执行失败,于是只好曲线救国,先把全部标签页关闭,然后用系统命令结束掉进程…… 有点硬编码了,就这样吧,累了
参考资料
- 利用selenium抓取网页的ajax请求:https://www.cnblogs.com/fish-101/p/13170021.html
- Selenium爬虫-获取浏览器Network请求和响应:http://www.spiderpy.cn/blog/detail/47/
- 如何用 Hook 实时处理和保存 Ajax 数据
- 教你轻松截获 Selenium 中的 Ajax 数据
- selenium框架中driver.close()和driver.quit()关闭浏览器:https://blog.csdn.net/yangfengjueqi/article/details/84338167
欢迎交流
程序设计实验室专注于互联网热门新技术探索与团队敏捷开发实践,在公众号「程序设计实验室」后台回复 linux、flutter、c#、netcore、android、kotlin、java、python 等可获取相关技术文章和资料,同时有任何问题都可以在公众号后台留言~
Selenium爬虫实践(踩坑记录)之ajax请求抓包、浏览器退出的更多相关文章
- 爬虫(八):分析Ajax请求抓取今日头条街拍美图
(1):分析网页 分析ajax的请求网址,和需要的参数.通过不断向下拉动滚动条,发现请求的参数中offset一直在变化,所以每次请求通过offset来控制新的ajax请求. (2)上代码 a.通过aj ...
- vconsole h5应用ajax请求抓包
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta co ...
- DevOps落地实践点滴和踩坑记录-(2) -聊聊平台建设
很久没有写文章记录了,上一篇文章像流水账一样,把所见所闻一个个记录下来.这次专门聊聊DevOps平台的建设吧,有些新的体会和思考,希望给正在做这个事情的同学们一些启发吧. DevOps落地实践点滴和踩 ...
- SpringBoot + Shiro + shiro.ini 的踩坑记录
0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...
- ABP框架踩坑记录
ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...
- python发布包到pypi的踩坑记录
前言 突然想玩玩python了^_^ 这篇博文记录了我打算发布包到pypi的踩坑经历.python更新太快了,甚至连这种发布上传机制都在不断的更新,这导致网上的一些关于python发布上传到pypi的 ...
- VUE使用微信JDK(附踩坑记录)
VUE使用微信分享SDK(附踩坑记录) 微信分享官方文档 安装JS-SDK npm i -S weixin-jsapi 引入包 ES5 写法 const wx = require('weixin-js ...
- unionId突然不能获取的踩坑记录
昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
随机推荐
- Kubernetes K8S之通过helm部署metrics-server与HPA详解
Kubernetes K8S之通过helm部署metrics-server与 Horizontal Pod Autoscaling (HPA)详解 主机配置规划 服务器名称(hostname) 系统版 ...
- Docker部署&MySQL部署
Docker部署 本文采用的是阿里云的centos7 # 更新yum yum update # 安装docker yum install docker # 启动docker systemctl sta ...
- 前端学习总结之——HTML
近期在找工作参加面试,想总结一下学过的东西,也会持续更新遇到的新问题.盲点. 什么是HTML? 超文本标记语言(英语:HyperText Markup Language,简称:HTML),由尖括号包围 ...
- Spring(1) --入门(IoC,AOP)
说说你对spring的理解? Spring框架是一个轻量级的企业级开发的一站式解决方案,所谓一站式解决方案就是可以基于Spring解决Java EE开发的所有问题.Spring框架主要提供了IoC容器 ...
- leetcode-222完全二叉树的节点个数
题目 给出一个完全二叉树,求出该树的节点个数. 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置. ...
- Openstack Ocata 负载均衡安装(二)
Openstack OCATA 负载节点(二) 安装haproxy: apt install haproxy 配置haproxy: vim /etc/haproxy/haproxy.cfg globa ...
- logback为不同的包或类指定输出日志文件
对日志分割的常见需求是,需要按不同的等级进行输出,这个的配置方式类似如下,在appender节点内添加内容 <appender name="FILE-INFO" class= ...
- SDUST数据结构 - chap7 图
判断题: 选择题: 函数题: 6-1 邻接矩阵存储图的深度优先遍历: 裁判测试程序样例: #include <stdio.h> typedef enum {false, true} boo ...
- mysql查看修改参数
1.查看参数 show variables like '%timeout%'; 2.修改参数 会话级别修改: set session innodb_lock_wait_timeout=50; 对当前会 ...
- 你真的了解Android系统启动流程吗?Android高级工程师必看系列,已开源
前言 从毕业到现在面试也就那么几家公司,单前几次都比较顺利,在面到第三家时都给到了我offer!前面两次找工作,没考虑到以后需要什么,自己的对未来的规划是什么,只要有份工作,工资符合自己的要求就行!所 ...