selenium 之 driver.get_log获取浏览器Network请求和响应

5,686 阅读1分钟

前言:

   现在的公司为了不被爬虫,不断的改版前后端数据交互方式,但俗语有说:道高一尺,魔高一丈;对于常见
   的:iframe、svg、接口交互(Network请求和响应) selenium、网路上的各种大神都有出对应的对策,
   本文章,主要介绍 获取浏览器Network请求和响应 的方法以及经验教训(滴泪。。。)
复制代码

正文:

前置:

这里以抓取喜马拉雅接口数据为例,目标url:https://www.ximalaya.com/sound/148249100 获取Network请求和响应

selenium 版本 要 4.1.0 以上哦!!!!*很重要*

driver.get_log抓取Network数据包

上代码


from selenium import webdriver
from selenium.webdriver.chrome.service import Service


# chromedriver 路径配置
driverP = Service(r'xxxx/xxxxx/chromedriver的存放路径')


# ChromeOptions 配置相关
options = webdriver.ChromeOptions()

options.add_argument('--ignore-certificate-errors')

# 去掉开发者警告
options.add_experimental_option('useAutomationExtension', False)

# 去掉黄条
options.add_experimental_option('excludeSwitches', ['enable-automation'])

options.add_argument('--ignore-certificate-errors-spki-list')

options.add_argument('--no-sandbox')

options.add_experimental_option('perfLoggingPrefs', {'enableNetwork': True})


driver = webdriver.Chrome(options=option, service=driverP)


base_url = "https://www.ximalaya.com/sound/148249100"

driver.get(base_url)

logs = driver.get_log("performance")

for log in logs:
    logjson = json.loads(log["message"])["message"]
    if logjson['method'] == 'Network.responseReceived':
        params = logjson['params']
        try:
            requestUrl = params['response']['url']

            if "/bdsp/album/pay" in requestUrl:

                requestId = params['requestId']
                response_body = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId})
                _content = json.loads(response_body["body"])
            else:
                continue
        except:
            requestUrl = "None"
            logger.info("没找到requestUrl:{}".format(requestUrl))
            continue
    else:
        continue
        
_content = "None"

driver.quit()

从代码量来看,还是挺挺可以接受的,也不受vpn 干扰,nice ~ 在此小编对driver.get_log 的使用感觉也是比较浅的,强大的功能没有挖掘完毕,但在目前场景下,够用了

ps:用driver.get_log 要记得先研究 driver.get_log("performance") 得到的结果体结构哦,很容易跳坑