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

server/2024/11/14 2:53:57/

本文使用的版本:

  • 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]这样的东西。参考示例代码如下:
    python"># 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。

python">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 之前:

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

Selenium 4.10 之后:

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

3 完整代码

python">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.ppmy.cn/server/8081.html

相关文章

【Java EE】文件操作

目录 1.认识文件 2.树型结构组织和目录 3.文件路径&#xff08;Path&#xff09; 4.其他知识 5.Java中操作文件 5.1File概述 5.1.1属性 5.1.2构造方法 5.1.3方法 5.2代码示例 1.认识文件 我们先来认识狭义的文件&#xff08;file&#xff09;。针对1硬盘这种持久化存…

社交媒体数据恢复:推特、Twitter

推特&#xff08;Twitter&#xff09;数据恢复&#xff1a;如何找回丢失的内容 随着社交媒体的普及&#xff0c;越来越多的人开始使用推特&#xff08;Twitter&#xff09;来分享生活点滴、发表观点和获取信息。然而&#xff0c;有时候我们会不小心删除了重要的推文&#xff0…

Docker - WEB应用实例

原文地址&#xff0c;使用效果更佳&#xff01; Docker - WEB应用实例 | CoderMast编程桅杆Docker - WEB应用实例 在之前的章节中&#xff0c;仅对普通容器进行了演示&#xff0c;但在实际中常常使用到 Docker 容器中的 WEB 应用程序。 运行一个WEB应用 拉取镜像 创建一个容器…

Qt绘制边框有阴影兼容性问题

在Qt开发过程中&#xff0c;有时候我们要显示一个有阴影的对话框&#xff0c;这时一般采用自定义实现&#xff0c;然而最近在开发时软件时&#xff0c;Win11上显示正常&#xff0c;Win10或其他Win11电脑显示不正常&#xff0c;存在兼容性问题吗&#xff1f; 下面是具体的源码 …

Unity 线程相关知识

线程 线程介绍 通过线程执行函数和直接在主函数中调用函数的区别是&#xff1a;通过直接调用函数时会按照语句顺序逐句执行&#xff0c;必定会完成上一句后再执行下一句&#xff0c;而通过线程执行的函数会从调用开始与主函数同步执行 调用线程的方式 调用无参数函数线程的…

几道练习题八

第 1 题 【 问答题 】 • 多项式相加 我们经常遇到两多项式相加的情况&#xff0c; 在这里&#xff0c; 我们就需要用程序来模拟实现把两个多项式相加到一起。 首先&#xff0c; 我们会有两个多项式&#xff0c;每个多项式是独立的一行&#xff0c; 每个多项式由系数、 幂数这样…

计算机网络中的一些基本概念

ip地址&#xff1a;IP地址是ip协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址&#xff0c;以此来屏蔽物理地址的差异。是用来区分主机的。 端口号&#xff1a;每个应用程序对应一个端口号&#xff0c;通过类似门牌号的端口号…

【PCL】教程correspondence_grouping对点云模型和点云场景进行特征提取,匹配,以及聚类找到模型与场景的匹配...

基于对应分组的 3D 对象识别 本教程旨在解释如何使用 pcl_recognition 模块执行基于对应分组的 3D 对象识别。具体来说&#xff0c;它解释了如何使用对应分组算法将 3D 描述符匹配阶段后的点对点对应集聚合到当前场景中的模型实例中。对于每个聚类&#xff0c;表示场景中的可能…