【问题标题】:Does Scrapy 'know' when it has crawled an entire site?Scrapy 是否“知道”它何时抓取了整个网站?
【发布时间】:2017-09-12 19:15:43
【问题描述】:

在抓取网站的单个页面时,我使用 Beautiful Soup 取得了巨大的成功,但我有一个新项目,我必须在其中检查大量网站,看看它们是否包含提及或指向我的网站的链接。因此,我需要检查每个站点的整个站点。

对于 BS,我只是还不知道如何告诉我的爬虫它是通过一个站点完成的,所以我达到了递归限制。这是 Scrapy 开箱即用的东西吗?

【问题讨论】:

    标签: python web-scraping beautifulsoup scrapy


    【解决方案1】:

    Scrapy 使用链接跟随者遍历站点,直到可用链接列表消失。一旦访问了一个页面,它就会从列表中删除,Scrapy 会确保不再访问该链接。

    假设所有网站页面在其他页面上都有链接,Scrapy 将能够访问网站的每个页面。

    我已经使用 Scrapy 遍历了数千个网站,主要是小型企业,并且没有遇到任何问题。它能够遍历整个站点。

    【讨论】:

    • 感谢您的回答。我看到的文档和教程用于抓取一个域。你知道我应该在哪里寻找如何抓取域名列表吗?也许我只是没有使用正确的关键字。
    • 我会使用这个教程——youtube.com/watch?v=nnnDshuflSI——它将为你提供一个很好的框架来构建。花点时间学习他的教导。他使用 Scrapy,所以它是一个很棒的教程。
    • 谢谢,我去看看。
    【解决方案2】:

    恐怕,没有人知道它何时爬取了整个网站。例如,您能说一下您何时爬取了整个 Facebook 吗?那是因为动态生成和交叉链接的页面。

    设置递归限制是规划边界的唯一方法,之后您将停止移动。但是您可以最大限度地减少重复页面的数量。您可以使用页面链接或页面文本的 CRC 作为标识符并检查它是否唯一。

    你可以在你的 parse 方法中做这样的事情:

    if some_id not in set_of_all_page_ids:
        set_of_all_page_ids.add(some_id)
        yield scrapy.Request(response.urljoin(next_page_url))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-08
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2020-10-12
      相关资源
      最近更新 更多