Selenium爬虫实践:ajax请求抓包、浏览器退出
ztj100 2024-12-03 20:02 21 浏览 0 评论
前言
最近在搞公司内部系统,累的一批,需要从另一个内部系统导出数据存到数据库做分析,有大量的数据采集工作,又没办法去直接拿到那个系统的接口,太难了,只能爬虫,但是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__里执行失败,于是只好曲线救国,先把全部标签页关闭,然后用系统命令结束掉进程……
相关推荐
- 其实TensorFlow真的很水无非就这30篇熬夜练
-
好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...
- 交叉验证和超参数调整:如何优化你的机器学习模型
-
准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...
- 机器学习交叉验证全指南:原理、类型与实战技巧
-
机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...
- 深度学习中的类别激活热图可视化
-
作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...
- 超强,必会的机器学习评估指标
-
大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...
- 机器学习入门教程-第六课:监督学习与非监督学习
-
1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...
- Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置
-
你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...
- 神经网络与传统统计方法的简单对比
-
传统的统计方法如...
- 自回归滞后模型进行多变量时间序列预测
-
下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...
- 苹果AI策略:慢哲学——科技行业的“长期主义”试金石
-
苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...
- 时间序列预测全攻略,6大模型代码实操
-
如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)