【问题标题】:Is there a way to specify max crawl depth when using the Apify SDK?使用 Apify SDK 时有没有办法指定最大爬网深度?
【发布时间】:2019-10-16 18:27:23
【问题描述】:

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

【问题讨论】:

    标签: web-crawler apify


    【解决方案1】:

    您可以采取两种方法。首先,您可以使用Puppeteer Scraper public actor,它使您能够以简化的形式使用 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,
      }
    });
    
    }
    
    

    【讨论】:

    • 谢谢。这就是我的怀疑。我将使用 userData 方法。感谢您提供代码示例。我会对此表示赞成,但我没有足够的代表。
    【解决方案2】:

    您可以在apify/web-scraper 中找到“最大爬行深度”选项。该工具是旧版 phantomJS 刮刀的替代品。它使用 puppeteer,并且具有非常相似的界面。

    您甚至可以使用 Apify SDK 并使用 PuppeteerCrawler 自行实现最大深度。我建议使用 request.userData 来记录你的爬行深度。如果您对此解决方案感兴趣,可以查看the source code of web scraper,它是如何在 web-scraper 中完成的。

    【讨论】:

    • 谢谢。这证实了我。只是想确保我没有遗漏什么。不幸的是,我不能投票,因为我没有足够的声誉:-(
    猜你喜欢
    • 2019-05-30
    • 2011-04-10
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多