【踩坑记录】pyppeteer: RuntimeWarning: Enable tracemalloc to get the object allocation traceback
在启用拦截器拦截响应时抛出错误(如标题),且拦截失败
我的代码:
async def runBrowser(url, pageData, UserAgent=None):
from pyppeteer.network_manager import Response
async def get_content(response: Response):
if 'mgp.api.mucfc.com/?operationId=mucfc.content.post.query' in response.url:
content = await response.text()
pageData.append(content)
# "创建一个浏览器实例 browser 对象"
if "--enable-automation" in launcher.DEFAULT_ARGS:
launcher.DEFAULT_ARGS.remove("--enable-automation")
browser = await launch({
'handleSIGINT': False,
'handleSIGTERM': False,
'handleSIGHUP': False, # 以上禁用信号
'headless': False,
'dumpio': True,
'autoClose': False, # 避免长时间运行 内存泄漏
'args': [
'--no-sandbox', # 禁止沙箱模式
'--no-default-browser-check', # 不检查默认浏览器
'--disable-extensions',
'--hide-scrollbars',
'--disable-bundled-ppapi-flash',
'--mute-audio',
'--disable-setuid-sandbox',
'--disable-gpu',
"--window-size=1000,900",
"--disable-infobars" # 禁止提示 浏览器被驱动的提示信息
],
})
page = await browser.newPage() # "通过 Browser 对象创建页面 Page 对象"
# 启用拦截器
page.on("response", get_content)
if UserAgent:
await page.setUserAgent(UserAgent)
await page.setViewport({"width": 1000, "height": 900}) # 改变 页面大小
await page.goto(url)
await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
'{ webdriver:{ get: () => undefined } }) }') # 本页刷新后值不变
await page.waitForSelector('.tabs__list__item__not-active', {'timeout':60000})
await asyncio.sleep(2)
await page.click('div.tabs__list__item__not-active:nth-child(3)')
await page.waitForSelector('.news-item__title', {'timeout':60000})
await page.close()
await browser.close()
pageData = []
url = 'https://www.mucfc.com/zl_news#/'
loop1 = asyncio.new_event_loop() # 创建一个事件循环
asyncio.set_event_loop(loop1)
loop = asyncio.get_event_loop() # 创建一个事件循环
loop.run_until_complete(runBrowser(url, pageData)) # 将协程加入到事件循环loop
loop.close()
print(pageData)
参考:https://github.com/pyppeteer/pyppeteer/issues/220
解决办法:
一、给 pyee 版本降级
pip install 'pyee==7.0.4' --force-reinstall
二、用 asyncio 包装(测试可用)
修改前:
page.on('response', get_content)
修改后:
page.on('response', lambda response: asyncio.ensure_future(get_content(response)))