硒 - 蟒蛇。如何捕获网络流量的响应[重复]

Posted

技术标签:

【中文标题】硒 - 蟒蛇。如何捕获网络流量的响应[重复]【英文标题】:Selenium - python. how to capture network traffic's response [duplicate] 【发布时间】:2019-03-09 01:51:03 【问题描述】:

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

有什么方法可以实现吗?

【问题讨论】:

【参考方案1】:

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

'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://***.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://***.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://***.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。

另一种选择是使用像selenium-wire 这样的库。

更新 2020-10-07 ⬇

正如 @Roey B 和 @Inactivist 在 cmets 中解释的那样,您可以使用 Network.getResponseBody 命令访问响应正文:

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

【讨论】:

注意:如果您无法让性能日志在最近的 (~75+) chrome 上运行,请参阅此处:***.com/a/56536604/5368039。基本上只需将loggingPrefs 更改为goog:loggingPrefs 要获取响应数据,您可以运行:driver.execute_cdp_cmd('Network.getResponseBody', 'requestId': msg["message"]["params"]["requestId"]) @RoeyB msg 中有什么内容? @RoeyB,请帮忙解释一下“msg”在这里代表什么?谢谢! 这是一个提取 JSON 请求的工作示例:gist.github.com/lorey/079c5e178c9c9d3c30ad87df7f70491d

以上是关于硒 - 蟒蛇。如何捕获网络流量的响应[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Wireshark 如何捕获网络流量数据包

如何捕获所有无线网络流量wireshark和wpa2?

如何在 Python 上使用 selenium webdriver 和 browsermob 代理捕获网络流量?

如何将多个 WebRTC 媒体流(屏幕捕获 + 网络摄像头)混合/组合成一个流?

网络流

我将XML发送到无效URL时如何捕获错误? (蟒蛇)