首页 > 解决方案 > Puppeteer 缺少响应并且行为与 Pyppeteer 不同

问题描述

我写了一个简单的程序,它只记录请求和响应,一次是在 Python 中使用 pyppeteer,一次是在 JavaScript 中使用 puppeteer(在遇到问题后我将描述下一个)。这是JS代码:

const puppeteer = require('puppeteer');
const url = 'https://www.twitch.tv/';
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.setRequestInterception(true);

    page.on('request', request => {
        console.log("REQUEST: " + request.url());
        request.continue();
    });

    page.on('response', response => {
        console.log("RESPONSE: " + response.url());
    });

    await page.goto(url, {waitUntil: ["networkidle0", "domcontentloaded"]});
    await browser.close();
})();

这是Python代码:

import asyncio
from pyppeteer import launch

url = "https://www.twitch.tv/"

async def handle_request(request):
    print("REQUEST: ", request.url)
    await request.continue_()

async def handle_response(response):
    print("RESPONSE: ", response.url)

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.setRequestInterception(True)

    page.on('response', handle_response)
    page.on('request', handle_request)

    await page.goto(url, waitUntil=["networkidle0", "domcontentloaded"])
    await browser.close()

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

然后我使用以下方法比较它们的输出:

> python3 script.py | grep "wasm"
REQUEST:  https://static.twitchcdn.net/assets/wasmworker.min-[redacted].js
REQUEST:  https://static.twitchcdn.net/assets/wasmworker.min-[redacted].wasm
> node script.js | grep "wasm"
(nothing)

我的问题:

(1) 为什么我得到不同的结果?Puppeteer 和 Pyppeteer 不应该在后台使用完全相同的浏览器,并且(希望)使用相同的默认设置(例如视口......等)吗?
(2) 即使 Python 版本工作得更好(主观上,对于我的用例),因为它记录请求,为什么它不记录相应的响应?在非无头模式下运行时,在开发人员控制台中,两个请求都将显示响应代码 200。什么可能导致响应没有被 pyppeteer 记录?

我尝试使用不同的视口大小并启用/禁用缓存,但无济于事。

编辑:好的,(1)的原因似乎是 pyppeteer 刚刚过时。关于(2): twitch.tv 在使用 puppeteer 运行时不提供我正在寻找的文件(而且流也不起作用);尽管我将 puppeteer 设置为使用与手动访问页面时相同的 chrome 可执行文件和 UserAgent 字符串,但它可以在其中工作。我认为这可能与 puppeteer 禁用扩展有关,因为调试控制台显示cast_sender.js来自 chrome cast 扩展的一些错误,但即使使用确切的 saame 参数启动 chrome,因为 puppeteer 确实加载了感兴趣的文件。

标签: javascriptpythonweb-scrapingpuppeteerpyppeteer

解决方案


不要忘记它制作页面的lambda.on调用你想要的任何函数

page.on('response', lambda res: interceptResponse(res))

page.on('request', lambda req: intercept(req))

推荐阅读