硒 - 蟒蛇。如何捕获网络流量的响应[重复]
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以上是关于硒 - 蟒蛇。如何捕获网络流量的响应[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 上使用 selenium webdriver 和 browsermob 代理捕获网络流量?