0


Selenium获取Network数据

前言

为解决从Selenium中获取Network接口数据,潜心研究了一小会儿,遂有此文

基本看这篇文章的,多多少少都跟spider 沾亲带故。所以直接进入正题。

只想要代码,文章前边自取
想看长篇大论,先看这篇 【Selenium】控制当前已经打开的 chrome浏览器窗口(高级版)
应用场景
Chrome浏览器 -> 开发者工具 -> Network 中所有的数据包,我要全部拿下来。

举个例子🌰

网站通过XHR异步加载数据,然后再渲染到网页上。而通过Selenium去获取渲染后的数据,是同HTML打交道的
异步加载返回数据是json文件的,有时渲染在网页上,不一定是完整的json文件中的数据;最重要的是,json文件解析起来很方便
通过selenium去拿网页数据,往往是两个途径:

selenium.page_source,通过解析HTML
通过中间人进行数据截获,数据源是啥就是啥
这两种方法各有利弊,但是这篇文章就可以将他们相结合起来了,实在是妙啊!

可能你会有疑惑👀?直接使用requests去请求不就完事了,

请你想一下,我这都使用上selenium了,你觉得我还会去使用requests再多请求一遍吗???

完整代码

Selenium获取Network
这里指定9527端口打开浏览器,也可以不指定

# -*- coding: utf-8 -*-# @Time   : 2022-08-27 11:59# @Name   : selenium_cdp.pyimport json
from selenium import webdriver
from selenium.common.exceptions import WebDriverException
from selenium.webdriver.chrome.options import Options

caps ={"browserName":"chrome",'goog:loggingPrefs':{'performance':'ALL'}# 开启日志性能监听}
options = Options()
options.add_experimental_option("debuggerAddress","127.0.0.1:9527")# 指定端口为9527
browser = webdriver.Chrome(desired_capabilities=caps, options=options)# 启动浏览器
browser.get('https://blog.csdn.net/weixin_45081575')# 访问该urldeffilter_type(_type:str):
    types =['application/javascript','application/x-javascript','text/css','webp','image/png','image/gif','image/jpeg','image/x-icon','application/octet-stream']if _type notin types:returnTruereturnFalse

performance_log = browser.get_log('performance')# 获取名称为 performance 的日志for packet in performance_log:
    message = json.loads(packet.get('message')).get('message')# 获取message的数据if message.get('method')!='Network.responseReceived':# 如果method 不是 responseReceived 类型就不往下执行continue
    packet_type = message.get('params').get('response').get('mimeType')# 获取该请求返回的typeifnot filter_type(_type=packet_type):# 过滤typecontinue
    requestId = message.get('params').get('requestId')# 唯一的请求标识符。相当于该请求的身份证
    url = message.get('params').get('response').get('url')# 获取 该请求  urltry:
        resp = browser.execute_cdp_cmd('Network.getResponseBody',{'requestId': requestId})# selenium调用 cdpprint(f'type: {packet_type} url: {url}')print(f'response: {resp}')print()except WebDriverException:# 忽略异常pass

本文转载自: https://blog.csdn.net/weixin_43936332/article/details/133697193
版权归原作者 dsdasun 所有, 如有侵权,请联系我们删除。

“Selenium获取Network数据”的评论:

还没有评论