如何使用python selenium获取浏览器网络日志

5f0d552i  于 2022-12-23  发布在  Python
关注(0)|答案(5)|浏览(498)

我正在尝试使用 selenium 来调试请求/响应,以获取浏览器网络日志。您能帮我找到一种方法吗?
我用 selenium 3.14.0和最新的Chrome浏览器。

qxgroojn

qxgroojn1#

使用Python + selenium +火狐

除非必要,否则不要设置代理--为了获得出站API请求,我使用了以下答案中的解决方案,但在python中:https://stackoverflow.com/a/45859018/14244758

test = driver.execute_script("var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {}; var network = performance.getEntries() || {}; return network;")

for item in test:
  print(item)

你会得到一个字典数组。
这样我就可以看到所有的网络请求,我用它来解析其中一个请求的参数,这样我就可以用它来对API发出自己的请求。

**使用python + selenium + chrome **

编辑:这个答案得到了很多关注,这里是我现在如何做的w/Chrome(取自未检测到的chromedriver代码):

chrome_options = webdriver.ChromeOptions()
chrome_options.set_capability(
                        "goog:loggingPrefs", {"performance": "ALL", "browser": "ALL"}
                    )
driver = webdriver.Chrome(options=chrome_options)

##visit your website, login, etc. then:
log_entries = driver.get_log("performance")

for entry in log_entries:

    try:
        obj_serialized: str = entry.get("message")
        obj = json.loads(obj_serialized)
        message = obj.get("message")
        method = message.get("method")
        if method in ['Network.requestWillBeSentExtraInfo' or 'Network.requestWillBeSent']:
            try:
                for c in message['params']['associatedCookies']:
                    if c['cookie']['name'] == 'authToken':
                        bearer_token = c['cookie']['value']
            except:
                pass
        print(type(message), method)
        print('--------------------------------------')
    except Exception as e:
        raise e from None

通过这个方法,你可以解析出你的浏览器发送给服务器的令牌、API密钥等。

wwwo4jvm

wwwo4jvm2#

使用Python和Chrome驱动程序

要获取网络日志,您需要在python中安装BrowserMobProxy和selenium

pip install browsermob-proxy
  • 然后我们需要从https://bmp.lightbody.net/.下载browsermobproxy压缩文件 *
  • 将其解压缩到任意文件夹(例如path/to/extracted_folder)。此文件夹包含browsermob-proxy二进制文件。我们需要在Python代码中调用Server()时提及此路径 *

您需要启动浏览器代理,并在chrome驱动程序的chrome选项中配置代理。

from browsermobproxy import Server
from selenium import webdriver

server = Server("path/to/extracted_folder/bin/browsermob-proxy")
server.start()
proxy = server.create_proxy()

# Configure the browser proxy in chrome options
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--proxy-server={0}".format(proxy.proxy))
browser = webdriver.Chrome(chrome_options = chrome_options)

#tag the har(network logs) with a name
proxy.new_har("google")

然后,您可以使用selenium导航到页面

browser.get("http://www.google.co.in")

导航之后,您可以从代理获取json格式的网络日志

print(proxy.har) # returns a Network logs (HAR) as JSON

同样在退出驱动程序之前,也在结束时停止代理服务器,

server.stop()
browser.quit()
6ju8rftf

6ju8rftf3#

尝试selenium-wire,我认为这是一个更好的方法,也提供了undetected-chromedriver对机器人检测。

kx5bkwkv

kx5bkwkv4#

对于最新的pythonselenium4.1.0版,webdriver.get_log(self,log_type)只有4个类型日志

driver.get_log('browser')
driver.get_log('driver')
driver.get_log('client')
driver.get_log('server')

无法通过驱动程序获取性能日志.get_log函数

uttx8gqw

uttx8gqw5#

要在页面加载完成之前只获取网络日志(在页面的主要使用期间不获取 AJAX /async网络日志),您可以获取性能日志:http://chromedriver.chromium.org/logging/performance-log
例如,要启用ChromeDriver的性能日志记录,

DesiredCapabilities cap = DesiredCapabilities.chrome();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
RemoteWebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), cap);

chromium performance-log page还链接到此完整示例https://gist.github.com/klepikov/5457750,其中包含Java和python代码以获取性能日志。
再次强调,需要记住的是,这只会在页面加载完成之前收到网络请求,之后,驱动程序只会返回相同的性能日志,直到页面重新加载。
如果您希望在页面使用过程中异步获取网络日志,可以使用BrowserMobProxy作为Selenium驱动程序的代理服务器,捕获所有这些网络请求,然后从BrowserMobProxy生成的HAR文件中获取这些捕获的请求:https://github.com/lightbody/browsermob-proxy#using-with-selenium

// start the proxy
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start(0);

// get the Selenium proxy object
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);

// configure it as a desired capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);

// start the browser up
WebDriver driver = new FirefoxDriver(capabilities);

// enable more detailed HAR capture, if desired (see CaptureType for the complete list)
proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);

// create a new HAR with the label "yahoo.com"
proxy.newHar("yahoo.com");

// open yahoo.com
driver.get("http://yahoo.com");

// get the HAR data
Har har = proxy.getHar();

一旦您有了HAR文件,它就是一个类似JSON的网络事件列表,您可以使用它。

相关问题