当前位置: 首页 > 面试题库 >

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

欧浩淼
2023-03-14
问题内容

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

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


问题答案:

您可以访问浏览器或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://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['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。



 类似资料:
  • 问题内容: 我们正在将Selenium与Java API和一些Javascript用户扩展一起使用。我们在应用程序中使用了很多AJAX调用。我们的许多测试都是随机失败的,因为有时AJAX调用的完成速度比其他时间慢,因此页面未完全加载。我们通过等待特定元素或Thread.sleep来解决此问题。我试图找到一种方法来代替等待网络流量完成。这样我们就可以做到这一点: 这样,我们可以摆脱线程hiberna

  • 当客户端发出请求时,“MonoJust”会打印在第4行,但“test”会在Http响应正文中返回。我知道发布者在订阅之前不会生成数据,那么为什么Http响应包含“test”而不是“MonoJust”?

  • 我正在尝试寻找资源或库,可以让我捕捉所有网络数据包的流量的设备编程,无论是从wifi或移动网络。我相信不需要root用户就可以像shark for root用户所要求的那样进入这种混乱的模式,因为play store上有一个应用程序,它可以捕获所有的网络流量(甚至用MITM解密SSL),而不需要root用户。我根本想不出如何做同样的事。 我的问题是:这款app是如何实现这种抓取的?他们用了什么AP

  • 问题内容: 我想捕获到我正在浏览使用python的Selenium的网站的访问量,因为使用代理将使访问量达到https的水平,这将不会使我走远。 我的想法是使用selenium来运行phantomJS并使用phantomJS执行脚本(不是在页面上使用webdriver.execute_script(),而是在phantomJS本身上)。我在想netlog.js脚本(从这里https://githu

  • 问题内容: 我单击Firefox中的链接,网页使用javascript发送请求,然后服务器发送某种响应,其中包括网站地址。这样,新网站就会在新窗口中打开。链接后面的html代码是(我省略了initial和final 标签): 我想捕获服务器响应并使用Python和Selenium提取“新网站”。我一直在使用BeautifulSoup进行抓取,对Selenium来说还很陌生。 到目前为止,我已经能够

  • 我目前正在使用自定义JWT身份验证进行SpringCloudGateway。身份验证后,我希望使用GlobalFilter将标头中的JWT令牌字符串传递到下游服务: JWT令牌字符串可以通过调用主体来获得。getName(); 我的问题是:我如何实现