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) # 响应的内容