我开发了一个PuppeteerCrawler法案,想注入一些用于所有页面的通用代码。我发现了Apify.utils.puppeteer.injectFile方法,如果代码是由每个“ domcontentloaded”事件注入的,则该方法可以正常工作。但我只想注入一次。为此,有一个“ surviveNavigations”选项,该选项应导致每页重新注入。
不幸的是,此选项对我不起作用。请在下面找到一些测试代码,以演示我的问题。在第一页中找到了“ testfunction.js”文件,在第二页中没有找到该文件。
我的代码有什么问题?
欢呼沃尔夫冈
这是测试搜寻器,应打开两个页面,注入testfunction.js的ONCE并执行:
Apify.main( async () => {
const requestQueue = await Apify.openRequestQueue();
// Please replace urls by existing ones, if necessary!
// See here: '...'
await requestQueue.addRequest({ url: '...'});
await requestQueue.addRequest({ url: '...'});
var isAlreadyInjected;
const crawler = new Apify.PuppeteerCrawler({
requestQueue: requestQueue,
maxConcurrency: 1,
gotoFunction: async ({page, request}) => {
page.on('domcontentloaded', async () => {
if(! isAlreadyInjected){
await puppeteer.injectFile(page, 'testinject.js', {surviveNavigations: true} );
isAlreadyInjected = true;
}
});
return page.goto(request.url, {
waitUntil: 'domcontentloaded'
});
},
handlePageFunction: async ({ request, page }) => {
var finding = await page.evaluate( () => {
try{
return testinject();
} catch(err){
return `Test inject was NOT found!`;
}
});
log.info(finding + ` (${page.url()})`);
},
handleFailedRequestFunction: async ({ request }) => {
log.info( `Failed Request:\t${request.url}` );
},
});
await crawler.run();
});
这是要插入的“ testfunction.js”:
testinject = function(){
return 'Test inject: I was found!'
};
答案 0 :(得分:0)
您使用的是全局变量isAlreadyInjected
,因此只有第一个请求的页面得到处理,并注入了文件 testfunction.js ,其余的则不会。
您可以使用局部变量,并可以使用userData
(Custom user data assigned to the request)来保留变量数据