page.on('response') 在 handlePageFunction // PuppeteerCrawler (Apify SDK) 中不可访问

page.on('response') is not accessible in handlePageFunction // PuppeteerCrawler (Apify SDK)

我尝试从 page.on('response') 事件中获取一些数据。此数据应使用 pushData 推送到数据集中。

好像是这个事件:

await page
    .on('response', response => {
        if (response.status() === 404) {
            responseErrors.push(new Object({
                status: response.status(),
                url: response.url()
            }))
        }
    })
    .on('pageerror', err => {
        if (err.message) {
            pageErrors.push(JSON.stringify(err.message))
        }
    })
    .on('console', message => {
        consoleErrors.push(new Object({
            type: message.type(),
            url: message.text()
        }))
    });

在handlePageFunction中使用没有反应

如果我将它们添加到 PuppeteerCrawler 的 gotoFunction,我会得到结果。问题是我不能推入同一个数据集。

那么访问这些数据的正确方法是什么?

是的,它在 handlePageFunction 中不起作用,因为页面已经打开并且响应已经处理。您有 2 个选择:

  1. handlePageFunction https://sdk.apify.com/docs/typedefs/puppeteer-handle-page-inputs

    上使用response参数
  2. 做你在 gotoFunction 中所做的,而不是推送到数据集,更新 request.userData 然后在 handlePageFunction 中读取它,与你的数据合并并推送到数据集。

@Lukáš Křivka 的帮助下,我得到了适合我的解决方案。这是一个代码示例:

用户数据示例:

const crawler = new Apify.PuppeteerCrawler({
            requestQueue,
            launchPuppeteerOptions: {
                headless: true,
                ignoreHTTPSErrors: true,
                // slowMo: 500,
            },
            maxRequestsPerCrawl: settings.maxurls,
            maxConcurrency: settings.maxcrawlers,
            gotoFunction: async ({
                page,
                request
            }) => {
                const responseErrors = [];
                const consoleErrors = [];
                const pageErrors = [];
                await page.authenticate({
                    username: settings.authenticate.username,
                    password: settings.authenticate.password
                });
                await page
                    .on('response', response => {
                        if (response.status() === 404) {
                            responseErrors.push(new Object({
                                status: response.status(),
                                url: response.url()
                            }))
                        }
                    })
                    .on('pageerror', err => {
                        console.log(err)
                        if (err.message) {
                            pageErrors.push(JSON.stringify(err.message))
                        }
                    })
                    .on('console', message => {
                        consoleErrors.push(new Object({
                            type: message.type(),
                            url: message.text()
                        }))
                    });
                request.userData.responseErrors = responseErrors;
                request.userData.pageErrors = pageErrors;
                request.userData.consoleErrors = consoleErrors;

                return page.goto(request.url, {
                    timeout: 120000
                });
            },

访问:

handlePageFunction: async ({
            request,
            response,
            page
        }) => {
            await page.waitFor(settings.waitForPageload);

            console.log(request.userData)