如何将参数传递给 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;
// ...
}
我正在尝试迁移现有函数以在 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;
// ...
}