Selenium-python。如何捕获网络流量';s的反应

Selenium-python。如何捕获网络流量';s的反应,python,django,selenium,browser,traffic,Python,Django,Selenium,Browser,Traffic,我正在使用python Django创建一个web应用程序。 我正在使用selenium启动一个无头浏览器(phantomjs)并进行一些单击,直到到达特定页面。 我希望捕获网络流量并获得特定网络呼叫的响应。这个网络调用实际上包含一个html文档作为响应 有什么方法可以做到这一点吗?您可以访问浏览器或chromedriver日志,它们在网络响应方面略有不同。浏览器日志称为performance,驱动程序日志称为driver。它们返回一个类似json的对象,您可以对其进行解析以提取其中包含网络方法

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


有什么方法可以做到这一点吗?

您可以访问浏览器或chromedriver日志,它们在网络响应方面略有不同。浏览器日志称为
performance
,驱动程序日志称为
driver
。它们返回一个类似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":"https://stackoverflow.com/questions/52633697/selenium-python-how-to-capture-network-traffics-response","frameId":"C2D13BD13CF743B6D0695B35E9CC935C","hasUserGesture":false,"initiator":{"type":"other"},"loaderId":"5331BFDC4F466FCED920CFC9F033D2EC","request":{"headers":{"Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (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":"https://stackoverflow.com/questions/52633697/selenium-python-how-to-capture-network-traffics-response"},"requestId":"5331BFDC4F466FCED920CFC9F033D2EC","timestamp":104499.729,"type":"Document","wallTime":1538607113.838206}},"webview":"C2D13BD13CF743B6D0695B35E9CC935C"}',
  '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('https://stackoverflow.com/questions/52633697/selenium-python-how-to-capture-network-traffics-response')

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

另一种选择是使用类似的库

更新2020-10-07⬇

如注释中所述,您可以使用以下命令访问响应正文:


注意:如果在最近的(~75+)chrome上运行性能日志时遇到问题,请参阅此处:。基本上只需将
loggingpresfs
更改为
goog:loggingpresfs
即可获得响应数据,您可以运行以下命令:
驱动程序。执行\u cdp\u cmd('Network.getResponseBody',{'requestId':msg[“message”][“params”][“requestId”})
@RoeyB
msg
中有什么内容?@RoeyB,请帮助解释一下“msg”在这里代表什么意思?谢谢下面是一个提取JSON请求的工作示例:
driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': events[0]["params"]["requestId"]})