赞
踩
本文使用的版本:
- Chrome 124
- Python 12
- Selenium 4.19.0
版本过旧可能会出现问题,但只要别差异太大,就可以看本文,因为本文对新老版本都有讲解。
这个难点主要是 Chrome 和 Selenium 的版本更新太快了。
首先,如果要继承 Selenium 的 Headers,有两种思路:
# 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"))
get_log("performance")
。这个方式在 Selenium 4.10 之后有所改变,具体改变见下文。我这篇文章需要继承 headers 是因为网络上有些资源是需要登录注册的,但是每次都自己重新获取 Cookie 是很麻烦的。我这里以一个随便找的 PDF 资源(https://www.sigmaaldrich.cn/CN/zh/sds/aldrich/488488)的获取为例。
具体可以看【记录】Python|Selenium 下载 PDF 不预览不弹窗(2024年),代码的解释也写了,这部分就不展开说了,本文的最后面贴了完整的代码。
参考: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'}
在 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)
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.desired_capabilities import DesiredCapabilities caps = 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 JSON if '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 headers import 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 file with 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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。