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