我正在尝试编写一个自动从网页接收图像的Python代码。
方法是获取图像响应,可以通过使用Selenium访问特定网页并从chrome devtool的网络复制图像的数据来获得。
这是因为特定站点被cloudflare屏蔽了,如果我使用requests或urllib.request等常用方法,就会出现403错误。
我可以像屏幕截图一样通过“复制响应”接收图像数据,但我想使用 chrome webdriver 和 python 来获取它。
from selenium import webdriver
option = webdriver.ChromeOptions()
option.set_capability('goog:loggingPrefs', {'performance': 'ALL'})
option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
browser = webdriver.Chrome(options=option)
browser.get(url)
time.sleep(5)
log_entries = browser.get_log("performance")
我得到了上面代码的响应头,但我想获得图像的完整响应
要获取响应,您应该循环遍历日志并按包含事件
message
的消息过滤 Network.responseReceived
对象。
然后你得到
params
对象并检查 target_url_part 是否存在于 url
中。
获取后,使用参数中的
Network.getResponseBody
执行CDP命令requestId
。
根据响应正文,您可以执行进一步的操作,例如获取其 json 字段/将其转换为图像等。
from selenium import webdriver
import json
import time
option = webdriver.ChromeOptions()
option.set_capability('goog:loggingPrefs', {'performance': 'ALL'})
option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
browser = webdriver.Chrome(options=option)
log_entries = browser.get_log("performance")
url = 'site_url'
browser.get(url)
time.sleep(5)
target_url = "your_request_url_part"
for log in log_entries:
message = log["message"]
if "Network.responseReceived" not in message:
continue
params = json.loads(message)["message"].get("params")
if params is None:
continue
response = params.get("response")
if response is None or target_url not in response["url"]:
continue
body = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': params["requestId"]})