selenium 通过 chrome webdriver 的log获得谷歌network调试接口ajax response数据

 获取response数据有几种方式,最常见的是用代理,另外还有javascript 注入hook的方式

这里介绍的是log的方式

 https://blog.csdn.net/weixin_34722157/article/details/112436963

一般我们用webdriver时候都是通过xpath,css之类的选择器取页面的数据,今天我教你另一种方案,直接获得response!

import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities        
        
 
        options = webdriver.ChromeOptions()
        # options.add_argument('--headless')   #无头模式
        # options.add_argument('--no-sandbox') #非沙盒
        # options.add_argument('--disable-gpu') #禁用gpu,一般生产环境会使用,因为服务器大多没有gpu
        prefs = {"profile.managed_default_content_settings.images": 2} #不加载图片
        options.add_experimental_option("prefs", prefs)
        #重点来了
        options.add_experimental_option('perfLoggingPrefs', {'enableNetwork': True})
        options.add_argument('--disable-dev-shm-usage')
        options.add_experimental_option("excludeSwitches", ["enable-automation"])
        options.add_experimental_option('useAutomationExtension', False)
        caps = DesiredCapabilities.CHROME
 
        #重点又来了
        caps['goog:loggingPrefs'] = {'performance': 'ALL'}   
        driver = webdriver.Chrome(options=options, desired_capabilities=caps)
        #driver.implicitly_wait(5)
        # driver = webdriver.Chrome(desired_capabilities=caps)
 
        #屏蔽webdrive检测
        driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
                                               Object.defineProperty(navigator, 'webdriver', {
                                                 get: () => undefined
                                               })
                                             """
        })

重点就是 这几个设置,我上面的建议都加上:

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

caps['goog:loggingPrefs'] = {'performance': 'ALL'}

看名字也能知道是和log有关的;log里面记录了每一个http请求的id,通过id,就可以直接获得response了
 

def get_body(self, log, driver):
        #获得log里面的requestid,通过id来获得response的内容
        requestId = json.loads(log.get("message")).get("message").get("params").get("requestId")
        # 
        driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId})
        response_dict = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId})
        #注意,这里获得的body是字符串形式,需要序列化为json对象/
        body = response_dict["body"]        
        Jres = json.loads(body)
        return Jres
driver.get(url="目标url")
#chrome的日志将开启并记录所有的访问。
try:
    logs = driver.get_log("performance")
    for log in logs[:]:
    try:
        url = json.loads(log.get("message")).get("message").get("params").get("request").get("url")
    except:
        url = None
    if url:
 
    # 111   左上角个人档案信息 ->,这里是我要获取的内容的url正则,你根据你自己要获取的接口编写。
    # 正则表达是匹配 需要抓取的那一个请求 
    regex_person_document = re.compile(
                        'https://star.toutiao.com/v/api/user/author_page/?author_id=(d+)&recommend=false&platform_source=1'
                                                               )
   if regex_person_document.findall(url):
        # 获得了 json形式的响应体,就能按需要获得里面的数据了
      Jres = self.get_body(log, driver)
except:
  pass

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值