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 个选择:
在handlePageFunction
https://sdk.apify.com/docs/typedefs/puppeteer-handle-page-inputs
上使用response
参数
做你在 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)
我尝试从 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 个选择:
在
上使用handlePageFunction
https://sdk.apify.com/docs/typedefs/puppeteer-handle-page-inputsresponse
参数做你在
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)