使用Apify SDK时是否可以指定最大爬网深度?

时间:2019-10-16 18:27:23

标签: web-crawler apify

我正在研究一个我同时评估Scrapy和Apify的项目。大多数代码都以node.js为中心,因此使用javascript解决方案会更好。另外,我喜欢可以在Apify中使用puppeteer的事实。也就是说,我的用例要求对许多网站进行较浅的爬网(例如,深度约为4)。这在Scrapy中很容易配置,但是我不知道如何在Apify中实现。有没有办法在新的Apify API中指定最大深度?看起来这是他们旧版爬网程序中的一个参数,但我在新API中找不到它。

2 个答案:

答案 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,
  }
});

}