【代码】Python3|Requests 库怎么继承 Selenium 的 Headers (2024,Chrome)

本文使用的版本:

  • Chrome 124
  • Python 12
  • Selenium 4.19.0

版本过旧可能会出现问题,但只要别差异太大,就可以看本文,因为本文对新老版本都有讲解。

文章目录

    • 1 难点解析和具体思路
    • 2 注意事项
      • 2.1 PDF 资源获取时注意事项
      • 2.2 Capabilities 写法
      • 2.3 get_log("performance") 写法
    • 3 完整代码

1 难点解析和具体思路

这个难点主要是 Chrome 和 Selenium 的版本更新太快了。

首先,如果要继承 Selenium 的 Headers,有两种思路:

  1. 从 Selenium 对于 Chromedriver的参数入手,即 arguments[0]这样的东西。参考示例代码如下:
    # Execute JavaScript to retrieve headers
    headers = driver.execute_script("""var headersObj = {};var headers = new Map(Object.entries(arguments[0].headers));headers.forEach(function(value, key) {headersObj[key] = value;});return headersObj;
    """, driver.execute_script("return window.navigator"))
    
    具体driver是什么我也不解释了,总之就是这个其实就是个人工配置项,arguments[0]里根本就不会自带一个headers键值。arguments里面可能存在的所有参数可以看这篇文章:List of Chromium Command Line Switches,https://peter.sh/experiments/chromium-command-line-switches/。
  2. 从 Selenium 抓的包入手,即使用 network 相关的,在 Selenium 里面是 get_log("performance")。这个方式在 Selenium 4.10 之后有所改变,具体改变见下文。

2 注意事项

我这篇文章需要继承 headers 是因为网络上有些资源是需要登录注册的,但是每次都自己重新获取 Cookie 是很麻烦的。我这里以一个随便找的 PDF 资源(https://www.sigmaaldrich.cn/CN/zh/sds/aldrich/488488)的获取为例。

2.1 PDF 资源获取时注意事项

具体可以看【记录】Python|Selenium 下载 PDF 不预览不弹窗(2024年),代码的解释也写了,这部分就不展开说了,本文的最后面贴了完整的代码。

2.2 Capabilities 写法

参考:How to Capture Network Traffic When Scraping with Selenium & Python

在 Chrome 75 之后这部分出现了改变。Chrome 和 chromedriver 的版本很重要。版本 75 左右的日志记录功能发生了变化,以适应 W3C 合规性。如果您卡在 Chrome/chromedriver 版本 75 以下,则需要在下面的第一个代码片段中使用loggingPrefs而不是goog:loggingPrefs。

caps = DesiredCapabilities.CHROME
# capabilities["loggingPrefs"] = {"performance": "ALL"}  # chromedriver < ~75
caps['goog:loggingPrefs'] = {'performance': 'ALL'}

2.3 get_log(“performance”) 写法

参考:Getting TypeError: WebDriver.init() got an unexpected keyword argument ‘desired_capabilities’ when using Appium with Selenium 4.10-Stackoverflow

在 Selenium 4.10 之后这部分出现了改变。

Selenium 4.10 之前:

driver = webdriver.Chrome(service=s, options=options, desired_capabilities=caps) # selenium < 4.10

Selenium 4.10 之后:

options.set_capability('goog:loggingPrefs', {'performance': 'ALL'})
driver = webdriver.Chrome(service=s, options=options)

3 完整代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilitiescaps = DesiredCapabilities.CHROME
# capabilities["loggingPrefs"] = {"performance": "ALL"}  # chromedriver < ~75
caps['goog:loggingPrefs'] = {'performance': 'ALL'}options = Options()
# options.add_argument(
#     "user-agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'")  # UA
# options.add_argument("user-data-dir=C:/Users/User/AppData/Local/Google/Chrome/User Data/Default")
s = Service("D:/software/chromedriver.exe")
# Disable the built-in PDF viewer
options.add_experimental_option('prefs', {"download.prompt_for_download": True,'plugins.always_open_pdf_externally': False})
# desired_capabilities has been removed according to this post,so the newest way looks like this : options = webdriver.ChromeOptions() options.set_capability('goog:loggingPrefs', {'performance': 'ALL'})
# driver = webdriver.Chrome(service=s, options=options, desired_capabilities=caps) # selenium < 4.10
options.set_capability('goog:loggingPrefs', {'performance': 'ALL'})
driver = webdriver.Chrome(service=s, options=options)pdf_url = 'https://www.sigmaaldrich.cn/CN/zh/sds/aldrich/488488'# get driver log
driver.get(pdf_url)
print(driver.log_types)
network_logs = driver.get_log("performance")import json
# Extract headers from the network logs
headers = {}
for log in network_logs:log_message = json.loads(log['message'])['message']  # Parse log message as JSONif 'params' in log_message and 'request' in log_message['params']:request_params = log_message['params']['request']if 'headers' in request_params:headers = request_params['headers']break  # Exit loop after finding headersimport requests# Use requests to download the PDF file with headers
response = requests.get(pdf_url, headers=headers)# Check if the request was successful
if response.status_code == 200:# Save the PDF filewith open("output.pdf", "wb") as f:f.write(response.content)print("PDF file downloaded successfully.")
else:print("Failed to download the PDF file.")# Close the Selenium WebDriver
driver.quit()

在这里插入图片描述

这样子写代码就不需要 Selenium 去 sleep 等待下载了,也可以很好地解决一部分 Requests 库的反爬虫问题,不过对于防止重放攻击的反爬虫手段还是无效。

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_46106285/article/details/137891147。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

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

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

相关文章

asp.net core 依赖注入后的服务生命周期

ASP.NET Core 依赖注入&#xff08;DI&#xff09;容器支持三种服务的生命周期选项&#xff0c;它们定义了服务实例的创建和销毁的时机。理解这三种生命周期对于设计健壯且高效的应用程序非常重要&#xff1a; 瞬时&#xff08;Transient&#xff09;&#xff1a; 瞬时服务每次…

西瓜书学习——第一、二章笔记

[] 什么是机器学习? 研究关于“学习算法”(一类能从数据中学习出其背后潜在规律的算法)的一门学科。 PS:深度学习指的是神经网络那一类学习算法&#xff0c;因此是机器学习的子集。 假设空间和版本空间 举个栗子:假设现已收集到某地区近几年的房价和学校数量数据&#xf…

CloudCompare 整体架构

CloudCompare 是一个开源的大规模点云处理软件,内置了点云渲染和各种点云算法,还有插件化拓展,非常适合作为点云相关软件的基础程序进行二次开发。源码地址:https://github.com/CloudCompare/CloudCompare 这里记录一下项目的主要模块目录和他们做的事情。 编译和依赖 编…

ChatGPT及GIS、生物、地球、农业、气象、生态、环境科学领域案例

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

SRIO系列-时钟逻辑与复位逻辑

一、前言 上一篇讲述了SRIO协议的基本概念&#xff0c;传输的HELLO帧格式、事务类型等&#xff0c;本篇说一下SRIO IP核的时钟关系。 基本的IP设置可以参考此篇文章&#xff1a;【高速接口-RapidIO】Xilinx SRIO IP 核详解-CSDN博客 二、时钟关系 PHY可以在两个时钟域上运行…

【Java EE】多线程-进阶-锁策略

目录 1.常见的锁策略 1.1乐观锁 vs 悲观锁 1.2重量级锁 vs 轻量级锁 1.3自旋锁&#xff08;Spin Lock&#xff09; 1.4公平锁 vs 非公平锁 1.5可重入锁和不可重入锁 1.6读写锁 2.CAS 2.1什么事CAS 2.2CAS是怎么实现的 2.3CAS有哪些应用 2.3.1实现原子类 2.3.2实现自…

自动驾驶(八十四)---------中间件对比分析

很久没有写博客了&#xff0c;CSDN无故非法删了我第82篇&#xff0c;让我很恼火&#xff0c;一直提不起兴趣重新写一遍第82篇。但回初心&#xff0c;知识需要用自己的语言输出&#xff0c;所以今天对比分析自动驾驶中间件&#xff1a; 1. 中间件介绍 在自动驾驶架构中&#xf…

SAP打印输出设置

SAP打印输入有很多方式&#xff0c;适合不同的应用场景。 一.打印输出总体概览图 二.前台打印 这个是比较常见的&#xff0c;前端打印的出现减轻了管理员的工作量&#xff0c;用户可以选择自己电脑上的打印机输出&#xff0c;不需要所有打印机都在SAP平台中进行配置&#xff0…

【Next】动态路由、加载 UI 和流式传输

动态路由 动态段作为 params 属性传递给 layout、page、route 和 generateMetadata 函数。 /app/blog/[slug]/page.tsx export default function Page({params}: {params:{slug:string}}) {return <h1>Slug Page -- {params.slug}</h1> };/app/shop/[...slug]/pa…

(vue)el-select选择框加全选/清空/反选

(vue)el-select选择框加全选/清空/反选 <el-form-item label"批次"><el-selectv-model"formInline.processBatch"multiplecollapse-tagsfilterableplaceholder"请选择"style"width: 250px"no-data-text"请先选择企业、日…

常用的启发式算法有哪些

常用的启发式算法主要包括模拟退火算法&#xff08;SA&#xff09;、蚁群算法&#xff08;ACO&#xff09;、粒子群算法&#xff08;PSO&#xff09;、遗传算法&#xff08;GA&#xff09;、禁忌搜索算法&#xff08;TS&#xff09;以及超启发式算法&#xff08;Hyper-Heuristi…

Java使用documents4j将word和excel转pdf

pom.xml添加documents4j依赖 <!-- documents4j --> <dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.0.3</version> </dependency> <!-- documents4j 转 wor…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU+外部etcd使用containerd部署K8S 1.26.15容器版集群(一主多从)》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本&#xff0c;出现了一个问题&#xff0c;就是在pod中访问百度网站&#xff0c;大…

Java基础知识总结(59)

&#xff08;1&#xff09;Set集合 Set也是集合中的一个容器&#xff0c;程序可以依次把若干个对象放进Set&#xff0c;但是Set无法保存元素添加的顺序&#xff0c; Set不允许包含相同的元素&#xff0c;如果把两个相同的元素加入同一个Set中&#xff0c;则添加失败&#xff0…

Openlayers动态刷新Arcgis MapServer服务图层

Openlayers动态刷新Arcgis MapServer服务图层 最近做一个图层编辑的功能&#xff0c;在前端新增一个图块之后需要刷新Arcgis切片服务&#xff0c;实时显示效果。刚开始使用source的refresh方法&#xff0c;结果不生效&#xff0c;后来在source上更新一个时间戳参数实现了刷新切…

UTS iOS插件

1、UTS插件无法出现 再uniapp x中使用时&#xff0c;必须给这个插件高度和宽度&#xff0c;否则出不来&#xff01; <uts-hello-view buttonText"点击按钮内容" style"width:375px;height: 375px;background-color: aqua;"></uts-hello-view>…

python后端相关知识点汇总(十二)

python知识点汇总十二 1、什么是 C/S 和 B/S 架构2、count(1)、count(*)、count(列名)有啥区别&#xff1f;3、如何使用线程池3.1、为什么使用线程池&#xff1f; 4、MySQL 数据库备份命令5、supervisor和Gunicorn6、python项目部署6.1、entrypoint.sh制作6.2、Dockerfile制作6…

vue 的报告页面,生成pdf,使用html2canvas , 下载pdf格式文件。多页分页下载

1. 新建一个js 文件 &#xff0c; 命名 为 html2canvas.js ,html2canvas 文件和jspdf.min.js 放同一目录下。下载文件已上传啦 2. 在vue 文件中引入html2canvas.js 文件 <script>import * as html2Canvas from ./html2canvas.js </script> 3 点击下载&#xff…

oracle insert操作分批量提交

对临时表做insert插入时没有做批量提交&#xff0c;可能会导致undo表空间撑爆&#xff0c;修改脚本对插数进行2万一次的批量提交&#xff0c;并且修改索引和同义词创建时间在插数操作结束后。 原语句&#xff1a; insert into 目标表 select * from 源表;改为2w次一提交&…

OpenCV基本图像处理操作(十)——图像特征harris角点

角点 角点是图像中的一个特征点&#xff0c;指的是两条边缘交叉的点&#xff0c;这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中&#xff0c;角点是重要的特征&#xff0c;因为它们通常是图像中信息丰富的区域&#xff0c;可以用于图像分析、对象识别、3D…