seleniumwire获取请求头参数

news/2024/12/4 19:36:32/文章来源:https://www.cnblogs.com/superbaby11/p/18587027

selenium-wire扩展了 Selenium 的 Python 绑定,让您可以访问浏览器发出的底层请求。 您编写代码的方式与使用 Selenium 的方式相同,但您可以获得额外的 API 来检查请求和响应并动态更改它们

一:简介

selenium是爬虫常用的手段之一,由于是使用浏览器驱动模拟手动操作,所以只要掌握一些元素的基本定位就很容易上手。
但是经常会遇到的问题我觉得至少有两点:

每次启动的浏览器都是一个全新的浏览器,不存在任何的缓存,换句话说如果网站需要登录则每次启动都需要登录,需要邮件验证码的网站就更难受了。
现在大多数的网站都采用前后端分离+ajax技术,分析画面元素固然是可以的,但是如果能够获取浏览器后台的ajax数据,那简直是事半功倍。
本次主要讨论的就是这两个问题,在之前我总结过一些相关的坑,包括浏览器的cookie操作、performance获取浏览器后台日志数据以及浏览器的代理认证框的处理问题,这也算是对之前的一次补充。

二:Selenium利用本地浏览器进行测试

是的,你没看错。由于驱动的是本地浏览器,本地浏览器有缓存,所以完美避免了浏览器的cookie问题。而且亲测,这种方式还可以直接解析浏览器当前网页,不需要启动新的浏览器,也就是说你可以预先登录到目标网站再运行程序。

1、右键谷歌浏览器快捷方式->属性,在路径上追加参数 --remote-debugging-port=9222

2、双击打开浏览器
3、selenium远程模式连接浏览器并进行操作,这里测试控制浏览器打开百度。

复制代码
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionschrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.baidu.com")
复制代码

这样就已经可以了,跟正常的selenium操作没有任何区别。

二、Selenium-wire获取后台数据

(一)selenium-wire安装

pip install selenium-wire

实例1:

复制代码
import time
from seleniumwire import webdriver# Create a new instance of the Chrome driver
driver = webdriver.Chrome()
# Go to the YouTube homepage.
driver.get('http://tool.liumingye.cn/music/?page=audioPage&type=migu&name=%E6%8A%96%E9%9F%B3')
time.sleep(5)
# Access requests via the `requests` attribute
for request in driver.requests:if request.response:if request.path == "/m/api/search":print(request.response.body.decode("utf-8"))
driver.quit()
复制代码

封装后的driver会有requests这样一个对象,可以发跟浏览器开发者工具的Network进行类比,请求的返回值存储在response.body中。
通过request.path过滤出我们想要的请求,然后获取response.body即可。

运行结果如下:

{"code":200,"data":{"list":[{"name":"把孤独当作晚餐(抖音版)","artist":"画词戏子","cover":"http:\/\/d.musicapp.migu.cn\/prod\/file-service\/file-down\/8121e8df41a5c12f48b69aea89b71dab\/0f0e94be13d0d18b4cd0f53996e0023b\/18bde3d3d5415eba88115dab279a8b4e","lrc":"http:\/\/59.110.45.28\/m\/api\/lrc\/migu\/id\/f8ceFzdyYgzcjzn5SuaHgUIARghxmB8jGoQIXczI3sOpkObywQMI-l8gtQ81JkoAm91NAZiVFqn2sz-LM7vsi7ycKuefN3JDZWHyMeVFO0toeLCawtmuafH-7iXPvu_lMWxYPkpA6-0-iyFzbqnwdaUWemgw6Ih2tmUPWXXHuA","url_m4a":"http:\/\/218.205.239.34\/MIGUM2.0\/v1.0\/content\/sub\/listenSong.do?toneFlag=LQ&netType=00&copyrightId=0&contentId=600913000005364995&resourceType=2&channel=0","url_128":"http:\/\/218.205.239.34\/MIGUM2.0\/v1.0\/content\/sub\/listenSong.do?toneFlag=PQ&netType=00&copyrightId=0&contentId=600913000005364995&resourceType=2&channel=0","url_320":"http:\/\/218.205.239.34\/MIGUM2.0\/v1.0\/content\/sub\/listenSong.do?toneFlag=HQ&netType=00&copyrightId=0&contentId=600913000005364995&resourceType=2&channel=0","url_flac":"http:\/\/218.205.239.34\/MIGUM2.0\/v1.0\/content\/sub\/listenSong.do?toneFlag=SQ&netType=00&copyrightId=0&contentId=600913000005364995&resourceType=E&channel=0","url":"http:\/\/218.205.239.34\/MIGUM2.0\/v1.0\/content\/sub\/listenSong.do?toneFlag=LQ&netType=00&copyrightId=0&contentId=600913000005364995&resourceType=2&channel=0"},{"name":"你走(抖音版)","artist":"松紧先生","cover":"http:\/\/d.musicapp.migu.cn\/prod\/file-service\/file-down\/b1899d500dda5db2da11df3efc89cba6\/d6ac70e448ff3cd5d545cf44d0d7a2c0\/c1690b3588064699c3688d676984331f","lrc":"http:\/\/59.110.45.28\/m\/api\/lrc\/migu\/id\/b30fUTX4wkz-oVd-f8y9OQ_kKBBi4zY2Aje7_xDOCt_kVgFl9nQjZo9U1oenDZiCAQJ6coUeJiWG7OGE9fc87A-z0llkBxgLJdxlW-_3LXaKxHkh29HDtMkYTExcEk20jfTXt_0BVLYaeBOf0dMAf4b0mFWQ5PQ6g1Bd7tPZ4w","url_m4a":"http:\/\/218.205.239.34\/MIGUM2.0\/v1.0\/content\/sub\/listenSong.do?toneFlag=LQ&netType=00&copyrightId=0&contentId=600919000000557974&resourceType=2&channel=0","url_128":"http:\/\/218.205.239.34\/MIGUM2.0\/v1.0\/content\/sub\/listenSong.do?toneFlag=PQ&netType=00&copyrightId=0&contentId=600919000000557974&resourceType=2&channel=0","url_320":"http:\/\/218.205.239.34\/MIGUM2.0\/v1.0\/content\/sub\/listenSong.do?toneFlag=HQ&netType=00&copyrightId=0&contentId=600919000000557974&resourceType=2&channel=0","url_flac":"http:\/\/218.205.239.34\/MIGUM2.0\/v1.0\/content\/sub\/listenSong.do?toneFlag=SQ&netType=00&copyrightId=0&contentId=600919000000557974&resourceType=E&channel=0","url":"http:\/\/218.205.239.34\/MIGUM2.0\/v1.0\/content\/sub\/listenSong.do?toneFlag=LQ&netType=00&copyrightId=0&contentId=600919000000557974&resourceType=2&channel=0"}}

实例2:

复制代码
from seleniumwire import webdriverdriver = webdriver.Chrome()
driver.get('https://www.baidu.com')# 通过requests属性访问请求
for request in driver.requests:if request.response:print("Url:", request.url)print("Code:", request.response.status_code)print("Content-Type:", request.response.headers['Content-Type'])
复制代码

执行结果:

实例3:设置拦截器

可以在某些请求发出前,修改请求的参数或直接阻止请求

复制代码
import json
from seleniumwire import webdriver# 设置拦截器
def interceptor(request):# 拦截.png,.jpg,.gif结尾的请求if request.path.endswith(('.png', '.jpg', '.gif')):request.abort()driver = webdriver.Chrome()
driver.request_interceptor = interceptor
driver.get('https://www.baidu.com')# 通过requests属性访问请求
for request in driver.requests:if request.response:print("Url:", request.url)print("Code:", request.response.status_code)print("Content-Type:", request.response.headers['Content-Type'])
复制代码

添加和修改请求参数

复制代码
# 设置拦截器
def interceptor(request):# 添加请求参数params = request.paramsparams['foo'] = 'bar'request.params = params# 修改POST请求正文中的JSONif request.method == 'POST' and request.headers['Content-Type'] == 'application/json':# 获取原请求内容body = request.body.decode('utf-8')data = json.loads(body)# 修改要改变的参数data['foo'] = 'bar'# 将修改好的参数设置回请求request.body = json.dumps(data).encode('utf-8')# 更新内容长度del request.headers['Content-Length']request.headers['Content-Length'] = str(len(request.body))
复制代码

 原文链接

https://www.cnblogs.com/hhaostudy/p/16121859.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/846807.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Confusion pg walkthrough Intermediate

namp ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.188.99 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-04 04:50 UTC Nmap scan report for 192.168.188.99 Host is up (0.072s latency). Not shown: 65532 closed tcp ports (reset) PORT STATE SERVICE…

ESP32+micropython+作为WiFi热点与PC通信+TCP/IP接收并返回数据

ESP32+作为WiFi热点+接收并返回数据 ESP32代码# ESP32 作为AP # 作为服务器 接收数据 并echo# ESP32 作为AP 即wifi热点 import network import utime# 配置ESP32为AP模式 ssid = ESP32_AP password = 12345678 authmode = 4 # WPA2-PSK# 创建WLAN对象 wlan = network.W…

ESP32+micropython+作为WiFi热点+接收并返回数据

ESP32+作为WiFi热点+接收并返回数据# ESP32 作为AP # 作为服务器 接收数据 并echo# ESP32 作为AP 即wifi热点 import network import utime# 配置ESP32为AP模式 ssid = ESP32_AP password = 12345678 authmode = 4 # WPA2-PSK# 创建WLAN对象 wlan = network.WLAN(networ…

docker环境一个奇怪的问题,容器进程正常运行,但是docker ps -a却找不到容器,也找不到镜像

一: 问题: docker环境一个奇怪的问题,使用容器跑的进程正常提供服务,在服务器上也能看到对应的端口正在监听,但是docker ps -a却找不到容器,也找不到镜像. 查看我使用docker容器启动服务的端口 正在监听docker images 找不到对应的镜像docker ps -a 找不到任何容器二: 排查过…

coca phrase的collocates MI计算比较

declare|declared war declare war declared war

Prime1_解法一:cms渗透 内核漏洞提权

Prime1_解法一:cms渗透 & 内核漏洞提权目录Prime1_解法一:cms渗透 & 内核漏洞提权信息收集主机发现nmap扫描tcp扫描tcp详细扫描22,80端口udp扫描漏洞脚本扫描目录爆破dirsearchWeb渗透wfuzz常见的 wfuzz 过滤器:获得wordpress后台权限wordpress cms渗透WordPress…

Bitmap Indexing in DBMS Bitmap Index vs. B-tree Index low cardinality

1、 Similarly let us assume that the Job of the Employees is divided into 4 categories only i.e Manager, Analyst, Clerk, and Salesman. Such columns are called columns with low cardinality. 2、 SELECT * FROM Employee WHERE New_Emp = &qu…

windows AD域控密码过期企业微信推送告警

在写了windows AD域控密码过期邮件推送告警后,有网友问我能不能写一篇关于企业微信推送的文章 如果需要看邮件推送或者需要自定义脚本,可以参考我的文章 windows AD域控密码过期邮件通知迭代版本1.企业微信告警要求 1.1.企业微信推送需要具备的条件需要在企业微信中创建企业微…

H5-27 浮动

1、浮动的定义fo属性定义元素在哪个方向浮动,任何元素都可以浮动。值 描述left 元素向左浮动right 元素向右浮动 2、浮动的原理:①浮动以后使元素脱离了文档流②浮动只有左右浮动,没有上下浮动 3、元素向左浮动脱离文档流之后,元素相当于在页面上面增加一个浮层来放置内容。…

工业凹槽洗底问题 | 探索研讨

关于抛物线和圆的位置关系的问题探索和引申前情概要 在和同事研讨下述题目的解答时,碰到了一些困难,思路不太好把握,探索一番,做个记录。 案例分析 【2024高二周末训练题】一个工业凹槽的截面是一条抛物线的一部分,它的方程是 \(x^2=4y\),\(y\in[0,10]\),在凹槽内放入一…

大学微积分 AB (第一单元)极限和连续性

极限介绍 平方的表示方式 极限不存在的情况 根据图表估算极限值 无限制 图中的单侧极限

算法网关视频分析网关消防车通道占用识别助力消防通道畅通守护生命线

随着城市化进程的加快,消防安全成为城市管理中的重要一环。消防车通道作为火灾发生时救援车辆的主要通道,其畅通无阻至关重要。然而,在实际生活中,消防车通道被占用或堵塞的现象屡见不鲜,给火灾救援工作带来了极大的阻碍。一、消防车通道占用识别算法的重要性 消防车通道占…