前言:
现在的公司为了不被爬虫,不断的改版前后端数据交互方式,但俗语有说:道高一尺,魔高一丈;对于常见
的: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") 得到的结果体结构哦,很容易跳坑