硒 - 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"]})
我正在使用 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"]})