selenium获取网络响应的正文

Posted Jason_WangYing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了selenium获取网络响应的正文相关的知识,希望对你有一定的参考价值。

有时我们爬虫时,需要获取到页面的api接口响应正文

 下面我们上具体代码:

from selenium import webdriver 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time
import json

caps = 
    'browserName': 'chrome',
    'loggingPrefs': 
        'browser': 'ALL',
        'driver': 'ALL',
        'performance': 'ALL',
    ,
    'goog:chromeOptions': 
        'perfLoggingPrefs': 
            'enableNetwork': True,
        ,
        'w3c': False,
    ,

driver = webdriver.Chrome(desired_capabilities=caps)

driver.get('http://127.0.0.1:8000/apiGet?id=1&pid=334')
# 必须等待一定的时间,不然会报错提示获取不到日志信息,因为絮叨等所有请求结束才能获取日志信息
time.sleep(3)

request_log = driver.get_log('performance')

到这里,我们成功获取到了网页加载的所有资源,资源都在request_log里面,现在我们就需要筛选出来我们需要的资源requestId

for i in range(len(request_log)):
    message = json.loads(request_log[i]['message'])
    message = message['message']['params']
    # .get() 方式获取是了避免字段不存在时报错
    request = message.get('request')
    if(request is None):
        continue

    url = request.get('url')
    if(url == "http://127.0.0.1:8000/apiGet?id=1&pid=334"):
        # 得到requestId
        print(message['requestId'])
        # 通过requestId获取接口内容
        content = driver.execute_cdp_cmd('Network.getResponseBody', 'requestId': message['requestId'])
        print(content)
        break

 这里最主要是driver里面的 execute_cdp_cmd方法,我们可以根据此方法来获取网页的请求包,具体文档参考此

查看的源码是

def execute_cdp_cmd(self, cmd, cmd_args):
    """
    Execute Chrome Devtools Protocol command and get returned result
    The command and command args should follow chrome devtools protocol domains/commands, refer to link
    https://chromedevtools.github.io/devtools-protocol/

    :Args:
     - cmd: A str, command name
     - cmd_args: A dict, command args. empty dict  if there is no command args

    :Usage:
        driver.execute_cdp_cmd('Network.getResponseBody', 'requestId': requestId)

    :Returns:
        A dict, empty dict  if there is no result to return.
        For example to getResponseBody:

        'base64Encoded': False, 'body': 'response body string'

    """
    return self.execute("executeCdpCommand", 'cmd': cmd, 'params': cmd_args)['value']

结果就是这样

 

以上是关于selenium获取网络响应的正文的主要内容,如果未能解决你的问题,请参考以下文章

selenium获取网络响应的正文

如何使用 Selenium 4 (devTools) 从网络选项卡获取响应正文

Selenium Python - 获取网络响应正文

Python:获取网络请求响应正文

Java Selenium 获取 JSON 响应正文

使用 Selenium 捕获网络 XHR 日志(带有参数的请求/响应)