pyppeteer拦截

import asyncio
from pyppeteer import launch


async def intercept_request(req):
    # 不加载css和img等资源
    if req.resourceType in ["image", "media", "eventsource", "websocket", "stylesheet", "font"]:
        await req.abort() #连接请求
    else:
        res = {
            "method": req.method,
            "url": req.url,
            "data": "" if req.postData == None else req.postData,
            "res": "" if req.response == None else req.response
        }
        print(res) # 打印请求的内容
        await  req.continue_() #继续请求,可以添加参数将请求地址重定向、改变请求的headers

async def intercept_response(res):
    resourceType = res.request.resourceType
    # 拦截ajax请求获取数据
    if resourceType in ['xhr']:
        resp = await res.json()
        print(resp)# 这里可以操作mysql、redis或者设计一个class来保存数据
        
async def main():
    # 创建一个浏览器
    browser = await launch({
        'executablePath': '你下载的Chromium.app/Contents/MacOS/Chromium',
        'headless': False, # 关闭无头模式。主要在测试环境调试使用
        'devtools': True, # 打开 chromium 的 devtools与headless配个使用
        'args': [ 
             '--disable-extensions',
             '--hide-scrollbars',
             '--disable-bundled-ppapi-flash',
             '--mute-audio',
             '--no-sandbox',# --no-sandbox 在 docker 里使用时需要加入的参数,不然会报错
             '--disable-setuid-sandbox',
             '--disable-gpu',
          ],
         'dumpio': True, #把无头浏览器进程的 stderr 核 stdout pip 到主程序,也就是设置为 True 的话,chromium console 的输出就会在主程序中被打印出来
    })
    # 打开一个页面,同一个browser可以打开多个页面
    page = await browser.newPage()
    # 是否启用JS,enabled设为False,则无渲染效果,如果页面有ajax请求需要开启此项
    await page.setJavaScriptEnabled(enabled=True)
    # 是否允许拦截请求,如果开启可以注册的两个回调函数,在浏览器发出请求和获取到请求之前指向这两个函数。
    await page.setRequestInterception(value=True)
    page.on('request', intercept_request) # 请求的内容
    page.on('response', intercept_response) # 响应的内容
    await page.goto('https://baidu.com') # 访问指定页面
    await page.screenshot(path='example.png')  # 截图
    await page.close() # 关闭页面
    await browser.close() # 关闭浏览器(实测中发现打开多个页面会产生大量僵尸进程)

asyncio.get_event_loop().run_until_complete(main())

Python 2020-10-07 17:51:58 通过 网页 浏览(230)

共有0条评论!

发表评论