Селен - питон. как захватить ответ сетевого трафика

Я использую python Django для создания веб-приложения. Я использую селен для запуска безголового браузера (phantomjs) и делаю несколько кликов, пока не дойду до определенной страницы. Я хочу захватить сетевой трафик и получить ответ на конкретный сетевой вызов. Этот сетевой вызов фактически содержит html-документ в качестве ответа.

Любой способ добиться этого?


person Rich Rajah    schedule 03.10.2018    source источник


Ответы (1)


Вы можете получить доступ к журналам браузера или 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-адрес ответа.

Другой вариант — использовать такую ​​библиотеку, как selenium-wire.

ОБНОВЛЕНИЕ 2020-10-07 ⬇

Как @Roey B и @Inactivist объясните в комментариях, вы можете получить доступ к телу ответа, используя Network.getResponseBody:

driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': events[0]["params"]["requestId"]})
person hellpanderr    schedule 03.10.2018
comment
Примечание. Если у вас возникли проблемы с работой журнала производительности в последних версиях (~ 75+) Chrome, см. здесь: stackoverflow.com/ а/56536604/5368039. В основном просто измените loggingPrefs на goog:loggingPrefs - person Jeremy Weirich; 05.08.2019
comment
чтобы получить данные ответа, вы можете запустить это: driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': msg["message"]["params"]["requestId"]}) - person Roey B; 26.05.2020
comment
@RoeyB что входит в msg? - person hellpanderr; 26.05.2020
comment
@RoeyB, пожалуйста, помогите объяснить, что здесь означает msg? Спасибо! - person johnanish; 16.06.2020
comment
msg — это одна из проанализированных записей журнала JSON, возвращенных driver.get_log('performance'), см. также selenium.webdriver.chrome.webdriver.execute_cdp_cmd - person Inactivist; 10.07.2020
comment
@JeremyWeirich, почему бы тебе просто не отредактировать ответ? - person Smit Johnth; 30.10.2020
comment
Вот рабочий пример извлечения запросов JSON: gist.github.com/lorey/079c5e178c9c9d3c30ad87df7f70491d - person lorey; 03.11.2020
comment
Может ли кто-нибудь помочь мне, как это сделать с браузером Firefox?, - person shajahan; 02.06.2021
comment
Начиная с Selenium 4.0, библиотека будет поддерживать доступ к информации devtools. Тем не менее, он все еще находится в состоянии бета-тестирования. - person user8491363; 13.07.2021