selenium 捕获网络请求

写在前面

之前分享过CDP的知识,现在有一个需求需要在selenium自动化时捕获网络请求,这里记录一下。

书接上回:浏览器自动化必须知道CDP协议

实现

开启日志记录

首先,我们要开启浏览器的日志记录,首先需要配置一个capabilities,它允许定义浏览器的一些特性。

import json
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

chrome_option = Options()

chrome_option.set_capability("goog:loggingPrefs", {"performance": "ALL"})


service = Service("./chromedriver-win64/chromedriver.exe")

driver = webdriver.Chrome(service=service, options=chrome_option)

在最新的selenium的版本中,是通过Options()去配置浏览器的一些属性,在这里通过配置'goog:loggingPrefs': {'performance': 'ALL'}来打开浏览器的性能日志记录。

获取日志

接下来我们尝试获取一下访问百度的日志

driver.get("https://www.baidu.com")

performance_log = driver.get_log("performance")

在访问百度后,通过get_log(“performance”)来获取性能日志,这是一个由字典组成的列表。这里我打印一个看一下格式

{
    'level': 'INFO', 
    'message': '{"message":{"method":"Network.requestWillBeSent","params":{"documentURL":"https://www.baidu.com/","frameId":"62715239374117F099DBA348C45736CD","hasUserGesture":false,"initiator":{"type":"other"},"loaderId":"C5F286A8A5744DEEB277D0718C4E34E8","redirectHasExtraInfo":false,"request":{"headers":{"Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36","sec-ch-ua":"\"Not/A)Brand\";v=\"99\", \"Google Chrome\";v=\"115\", \"Chromium\";v=\"115\"","sec-ch-ua-mobile":"?0","sec-ch-ua-platform":"\"Windows\""},"initialPriority":"VeryHigh","isSameSite":true,"method":"GET","mixedContentType":"none","referrerPolicy":"strict-origin-when-cross-origin","url":"https://www.baidu.com/"},"requestId":"C5F286A8A5744DEEB277D0718C4E34E8","timestamp":1508.943033,"type":"Document","wallTime":1692620664.219256}},"webview":"62715239374117F099DBA348C45736CD"}', 
    'timestamp': 1692620664216
}

可以看到,关键的信息都在message中,注意message中是一个json字段

{
  "message":{
    "method":"Network.requestWillBeSent",
    "params":{
      "documentURL":"https://www.baidu.com/",
      "frameId":"62715239374117F099DBA348C45736CD",
      "hasUserGesture":false,
      "initiator":{"type":"other"},
      "loaderId":"C5F286A8A5744DEEB277D0718C4E34E8",
      "redirectHasExtraInfo":false,
      "request":{
        "headers":{
          "Upgrade-Insecure-Requests":"1",
          "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
          "sec-ch-ua":"\"Not/A)Brand\";v=\"99\", \"Google Chrome\";v=\"115\", \"Chromium\";v=\"115\"","sec-ch-ua-mobile":"?0",
          "sec-ch-ua-platform":"\"Windows\""
        },
        "initialPriority":"VeryHigh",
        "isSameSite":true,
        "method":"GET",
        "mixedContentType":"none",
        "referrerPolicy":"strict-origin-when-cross-origin",
        "url":"https://www.baidu.com/"
      },
      "requestId":"C5F286A8A5744DEEB277D0718C4E34E8",
      "timestamp":1508.943033,
      "type":"Document",
      "wallTime":1692620664.219256
    }
  },
  "webview":"62715239374117F099DBA348C45736CD"
}

这是一个请求包的示例,大家看到method凡是以Network开头的都是网络请求。

获取网络返回包

我这个需求是想获取一个请求的返回包的数据,其实本身在performance日志中也有Network.response*相关的日志,但不是完整的请求包

所以,就需要requesetId这个字段了,通过CDP来获取

message = json.loads(packet.get("message")).get("message")
packet_method = message.get("method")
if "Network" in packet_method:
    request_id = message.get("params").get("requestId")
    resp = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': request_id})
    body = resp.get("body")

这里就可以将返回包完整的获取到了

如果有定制化需求,比如想获取某个链接的返回包等等,都可以去通过分析数据通过条件判断来处理

完整代码

最后附上完整测试代码

import json
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

chrome_option = Options()

chrome_option.set_capability("goog:loggingPrefs", {"performance": "ALL"})


service = Service("./chromedriver-win64/chromedriver.exe")

driver = webdriver.Chrome(service=service, options=chrome_option)


driver.get("https://www.baidu.com")

performance_log = driver.get_log("performance")

for packet in performance_log:
    message = json.loads(packet.get("message")).get("message")
    packet_method = message.get("method")
    if "Network" in packet_method:
        request_id = message.get("params").get("requestId")
        try:
        	resp = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': request_id})
        	body = resp.get("body")
        	print(body)
        except:
            pass
  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Selenium可以通过结合Browsermob-Proxy来获取网络请求的信息。通过使用Browsermob-Proxy,你可以捕获浏览器发出的所有网络请求以及它们的返回信息。下面是使用Selenium和Browsermob-Proxy来获取网络请求的步骤: 1. 首先,确保你已经安装了Selenium和Browsermob-Proxy,并从官方网站下载了相应的浏览器驱动程序。 2. 创建一个Browsermob-Proxy服务器对象,并启动它。 3. 创建一个Selenium WebDriver对象,并将代理设置为Browsermob-Proxy服务器的地址和端口。 4. 使用Selenium WebDriver访问你要进行网络请求抓取的网页。 5. 在访问网页的过程中,Browsermob-Proxy会记录所有的网络请求和返回信息。 6. 通过Browsermob-Proxy提供的API,你可以获取所有的网络请求和返回信息,包括请求的URL、请求方法、请求头、请求参数、返回状态码、返回头和返回内容等。 7. 根据你的需要,对获取到的网络请求和返回信息进行处理和分析。 下面是一个使用Selenium和Browsermob-Proxy获取网络请求的示例代码: ```python from selenium import webdriver from browsermobproxy import Server # 启动Browsermob-Proxy服务器 server = Server("/path/to/browsermob-proxy") server.start() proxy = server.create_proxy() # 创建Selenium WebDriver对象,并设置代理 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--proxy-server={0}".format(proxy.proxy)) driver = webdriver.Chrome("/path/to/chromedriver", options=chrome_options) # 设置代理的请求过滤规则,可以根据需要进行设置 proxy.new_har("capture", options={"captureHeaders": True, "captureContent": True}) # 使用Selenium访问网页 driver.get("https://www.example.com") # 获取所有的网络请求和返回信息 har = proxy.har for entry in har["log"]["entries"]: request = entry["request"] response = entry["response"] # 在这里可以对请求和返回信息进行处理和分析 # 关闭Selenium WebDriver和Browsermob-Proxy服务器 driver.quit() proxy.close() server.stop() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银空飞羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值