如何通过Selenium获取页面加载时的请求文件列表及JSON数据文件?
嗨,我来帮你搞定这个Selenium捕获页面请求的问题——这在抓取动态加载的数据时确实是个高频需求!
用Selenium捕获页面加载时的请求文件列表及目标JSON数据
一、先搞定:捕获页面加载时的所有请求文件列表
要拿到页面加载过程中发起的所有请求文件,最靠谱的方式是利用Selenium的性能日志(Performance Log),它能完整记录浏览器的网络请求细节。具体步骤如下:
1. 启动Chrome时开启性能日志
首先得给ChromeDriver配置参数,让它记录网络请求的日志:
from selenium import webdriver from selenium.webdriver.chrome.options import Options import json chrome_options = Options() # 开启性能日志,设置日志级别为ALL chrome_options.set_capability('goog:loggingPrefs', {'performance': 'ALL'}) driver = webdriver.Chrome(options=chrome_options)
2. 提取并筛选请求文件
加载页面后,从性能日志里把请求信息捞出来,还可以按文件类型过滤:
driver.get("你的目标页面URL") # 获取性能日志 logs = driver.get_log('performance') # 遍历日志,提取有用的请求信息 requested_files = [] for entry in logs: log_msg = json.loads(entry['message'])['message'] # 只处理请求完成的事件 if log_msg['method'] == 'Network.responseReceived': req_url = log_msg['params']['response']['url'] # 这里可以根据后缀筛选你关心的文件类型,比如.json、.js、图片等 if req_url.endswith(('.json', '.js', '.png', '.css')): requested_files.append({ 'url': req_url, 'status_code': log_msg['params']['response']['status'], 'content_type': log_msg['params']['response']['headers'].get('Content-Type', '未知') }) # 打印结果 for file in requested_files: print(f"文件URL: {file['url']} | 状态码: {file['status_code']} | 类型: {file['content_type']}")
二、重点解决:获取目标JSON数据文件的内容
针对你提到的那个JSON数据文件,除了拿到请求信息,我们还能直接获取它的内容,这里有两种实用方法:
方法1:通过请求URL重放获取数据
如果已经从日志里拿到了JSON文件的URL,直接用Python的requests库重新请求就行——要是需要保持登录态,别忘了从Selenium里把Cookie导出来:
import requests # 从之前的列表里找到目标JSON的URL(这里假设你能通过特征匹配到它) target_json_url = next(f['url'] for f in requested_files if '你知道的文件名关键词' in f['url']) # 导出Selenium里的Cookie,保持会话一致 cookies = driver.get_cookies() session = requests.Session() for cookie in cookies: session.cookies.set(cookie['name'], cookie['value']) # 请求并解析JSON response = session.get(target_json_url) json_data = response.json() print("拿到的JSON数据:", json_data)
方法2:用Chrome DevTools协议(CDP)直接拦截响应
这种方法更高效,不用重新发请求,直接在请求完成时获取响应内容:
# 启用网络监控 driver.execute_cdp_cmd('Network.enable', {}) # 定义回调函数,捕获目标JSON的响应 def capture_json_response(event): req_url = event['params']['response']['url'] # 匹配你的目标JSON文件,比如用后缀或关键词 if req_url.endswith('.json') and '目标文件名关键词' in req_url: # 获取响应体 response_body = driver.execute_cdp_cmd('Network.getResponseBody', { 'requestId': event['params']['requestId'] }) # 解析成JSON对象 json_data = json.loads(response_body['body']) print("直接捕获的JSON数据:", json_data) # 添加监听器 driver.add_cdp_listener('Network.responseReceived', capture_json_response) # 加载页面 driver.get("你的目标页面URL") # 关闭网络监控 driver.execute_cdp_cmd('Network.disable', {})
额外小提示
- 如果那个JSON数据是JS动态生成的(不是通过HTTP请求获取的),那你可以直接从页面的JS上下文里拿,比如:
# 假设页面里把JSON存在了window.targetData这个变量里 json_data = driver.execute_script("return window.targetData;") - 不同浏览器的日志配置可能有差异,上面的示例都是针对Chrome的,Firefox可以参考类似的
loggingPrefs配置。
内容的提问来源于stack exchange,提问作者Paul D Smith
相关产品推荐
相关产品推荐

