我正在研究一个我同时评估Scrapy和Apify的项目。大多数代码都以node.js为中心,因此使用javascript解决方案会更好。另外,我喜欢可以在Apify中使用puppeteer的事实。也就是说,我的用例要求对许多网站进行较浅的爬网(例如,深度约为4)。这在Scrapy中很容易配置,但是我不知道如何在Apify中实现。有没有办法在新的Apify API中指定最大深度?看起来这是他们旧版爬网程序中的一个参数,但我在新API中找不到它。
答案 0 :(得分:0)
您可以在apify/web-scraper中找到选项“最大爬行深度”。该工具替代了旧版phantomJS刮板。它使用puppeteer,并且具有非常相似的界面。
您甚至可以使用Apify SDK并使用PuppeteerCrawler自己实现最大深度。我建议使用request.userData记录您进行爬网的深度。如果您对此解决方案感兴趣,可以查看the source code of web scraper,以及如何在网络抓取工具中完成。
答案 1 :(得分:0)
您可以采用两种方法。首先,您可以使用Puppeteer Scraper公共角色,这使您能够以简化形式使用Apify SDK的大多数功能,并且最大爬网深度配置在此处是简单的输入。 性能和限制部分。要了解基础知识,请visit the introduction tutorial。
第二种方法涉及更多,直接使用Apify SDK。对于所有请求,您可以使用request.userData
属性向下传递任意用户数据。这样,在您将更多页面添加到爬网队列之前,您可以检查是否未达到所需的深度:
const MAX_DEPTH = 4;
// When creating the request queue, we seed the first request with a depth of 0.
const requestQueue = await Apify.openRequestQueue();
await requestQueue.addRequest({
url: "https://stackoverflow.com",
userData: {
depth: 0,
}
});
// ...
// Then, somewhere in handlePageFunction, when adding more requests to the queue.
if (request.userData.depth < MAX_DEPTH) {
await requestQueue.addRequest({
url: "https://example.com",
userData: {
depth: request.userData.depth + 1,
}
});
}