硒 - python。如何捕获网络流量的响应

Selenium - python. how to capture network traffic's response

我正在使用 python Django 创建网络应用程序。 我正在使用 selenium 启动无头浏览器(phantomjs)并进行一些点击,直到我到达特定页面。 我希望捕获网络流量并获得特定网络调用的响应。这个网络调用实际上包含一个 html 文档作为响应。

有什么方法可以实现吗?

您可以访问浏览器或 chromedriver 日志,它们在网络响应方面略有不同。浏览器日志称为 performance,驱动程序日志称为 driver。它们 return 一个类似于 json 的对象,您可以对其进行解析以提取其中包含网络方法的事件:

{'level': 'INFO',
  'message': '{"message":{"method":"Page.frameStoppedLoading","params":{"frameId":"FB10764A3ABF7FFC83110C39C5F7BF77"}},"webview":"C2D13BD13CF743B6D0695B35E9CC935C"}',
  'timestamp': 1538607113832},
 {'level': 'INFO',
  'message': '{"message":{"method":"Page.frameDetached","params":{"frameId":"FB10764A3ABF7FFC83110C39C5F7BF77"}},"webview":"C2D13BD13CF743B6D0695B35E9CC935C"}',
  'timestamp': 1538607113838},
 {'level': 'INFO',
  'message': '{"message":{"method":"Network.requestWillBeSent","params":{"documentURL":" (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"},"initialPriority":"VeryHigh","method":"GET","mixedContentType":"none","referrerPolicy":"no-referrer-when-downgrade","url":"
  'timestamp': 1538607113839},...}

您需要在 DesiredCapabilities 中启用登录,然后使用 JSON 模块解析它:

import json
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities.CHROME
caps['goog:loggingPrefs'] = {'performance': 'ALL'}
driver = webdriver.Chrome(desired_capabilities=caps)
driver.get('

def process_browser_log_entry(entry):
    response = json.loads(entry['message'])['message']
    return response

browser_log = driver.get_log('performance') 
events = [process_browser_log_entry(entry) for entry in browser_log]
events = [event for event in events if 'Network.response' in event['method']]

我不知道您是否可以使用它访问响应数据本身,但您可以获得响应的 url。

另一种选择是使用像 selenium-wire.

这样的库

更新 2020-10-07 ⬇

作为@Roey B and @Inactivist explain in the comments, you can access response body using Network.getResponseBody命令:

driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': events[0]["params"]["requestId"]})