如何将参数传递给 Apify BasicCrawler handleRequestFunction?

How do I pass parameters to Apify BasicCrawler handleRequestFunction?

我正在尝试迁移现有函数以在 Apify actor 中使用它。

最初,该函数加载给定的 URL,读取其 JSON 响应,并根据一些提供的参数提取一些数据和 returns 具有结果的对象。

如果你问,目前还没有抓取任何“最终”内容。它的结果是临时的,将用于创建其他 URL,然后(使用另一个爬虫)抓取这些结果以获得实际有用的结果。

当前执行爬虫的函数是这样的:

let url = new URL('/content', someBaseURL);
url.searchParams.set('search', someKeyword);
const reqList = new apify.RequestList({
    sources: [ { url: url.toString() } ]
});
await reqList.initialize();
const crawler = new apify.BasicCrawler({
    requestList: reqList,
    handleRequestFunction: reqHandler
});
// How do I set the inputs for reqHandler() here ?
await crawler.run();
// How do I get the output from reqHandler() here ?

reqHandler 代码是这样的:

async function reqHandler(options) {
    const response = await apify.utils.requestAsBrowser({
        url: options.request.url
    });
    // How do I read parameters from the caller here ?
    let searchResults = JSON.parse(response.body);
    // ... result object creation logic goes here ...
    // How do I return a result to the caller here ?
}

我对 Apify 这个东西很陌生,在文档中迷路了。

感谢您的帮助。

handleRequestFunction 不接受任何外部输入或产生任何输出。只需将它用作闭包并从周围代码捕获输入,或者您可以将它包装在不同的函数中。

通常我们这样做:

const context = {}; // put your inputs here

const crawler = new apify.BasicCrawler({
    requestList: reqList,
    handleRequestFunction: async () => {
        // use context here
        
        // output data
        await Apify.pushData(results);
    }
});

编辑:我忘了提及 use-case 如何传递输入。添加到队列或列表时,您需要通过 request.userData 对象来完成。

// The same userData is available in request list.
await requestQueue.addRequest({
    url: 'https://example.com',
    userData: { myInput: 'any-data' }
});

// Then in handleRequestFunction
handleRequestFunction: async (( request }) => {
   const { myInput } = request.userData;
   // ...
}