You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:25:28