【问题标题】:Scrapy - how to identify already scraped urlsScrapy - 如何识别已经抓取的网址
【发布时间】:2010-10-06 10:38:32
【问题描述】:

我每天都在使用 scrapy 抓取新闻网站。我如何限制 scrapy 抓取已抓取的 URL。 SgmlLinkExtractor 上也有任何明确的文档或示例。

【问题讨论】:

  • 为此,您必须存储已抓取的 URL。你这样做吗?如果有,怎么做?

标签: python web-crawler scrapy


【解决方案1】:

您实际上可以使用位于此处的 scrapy sn-p 轻松完成此操作:http://snipplr.com/view/67018/middleware-to-avoid-revisiting-already-visited-items/

要使用它,请从链接中复制代码并将其放入您的 scrapy 项目中的某个文件中。 要引用它,请在 settings.py 中添加一行来引用它:

SPIDER_MIDDLEWARES = { 'project.middlewares.ignore.IgnoreVisitedItems': 560 }

可以在此处阅读有关您为什么选择号码的详细信息:http://doc.scrapy.org/en/latest/topics/downloader-middleware.html

最后,您需要修改 items.py 以便每个项目类都有以下字段:

visit_id = Field()
visit_status = Field()

我想就是这样。下次您运行蜘蛛程序时,它应该会自动尝试开始避开相同的站点。

祝你好运!

【讨论】:

  • 我做了你提到的所有事情,但这并没有帮助。它仍然抓取相同的网址。
  • 这里提到的链接是:snipplr.com/view/67018/… now。
  • 好吧,我按照这些步骤操作,它分配了一个 visit_id 和 visit_status 为新的。但是在每次运行中一次又一次地扫描相同的项目(并将相同的 visit_id 和 visit_status 分配为新的)。有什么线索吗?
  • 代码 sn-p 的日期是 2010 年,所以可能你使用的 scrapy 比它太新了。
【解决方案2】:

这是直截了当的。在 python dict 中维护您之前抓取的所有 url。因此,当您下次尝试尝试它们时,请查看该 url 是否存在于字典中。否则抓取。

def load_urls(prev_urls):
    prev = dict()
    for url in prev_urls:
        prev[url] = True
    return prev

def fresh_crawl(prev_urls, new_urls):
    for url in new_urls:
        if url not in prev_urls:
            crawl(url)
    return

def main():
    purls = load_urls(prev_urls)
    fresh_crawl(purls, nurls)
    return

上面的代码是在 SO 文本编辑器又名浏览器中输入的。可能有语法错误。您可能还需要进行一些更改。但逻辑是存在的......

注意:但请注意,某些网站会不断更改其内容。因此,有时您可能需要重新抓取特定网页(即相同的 url)才能获取更新的内容。

【讨论】:

  • 在这种情况下使用集合比使用字典更好。
【解决方案3】:

我认为 jama22 的回答有点不完整。

在 sn-p if self.FILTER_VISITED in x.meta: 中,您可以看到您的请求实例中需要 FILTER_VISITED 才能忽略该请求。这是为了确保您可以区分要遍历和移动的链接和不想再次看到的项目链接。

【讨论】:

    【解决方案4】:

    Scrapy 可以自动过滤被抓取的网址,不是吗?一些指向同一个页面的不同url不会被过滤掉,比如“www.xxx.com/home/”和“www.xxx.com/home/index.html”。

    【讨论】:

      【解决方案5】:

      对于今天(2019 年),这篇文章是这个问题的最佳答案。

      https://blog.scrapinghub.com/2016/07/20/scrapy-tips-from-the-pros-july-2016

      这是一个自动处理 MIDDLEWARES 的库。

      希望能帮助到某人。我花了很多时间寻找这个。

      【讨论】:

        猜你喜欢
        • 2021-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        相关资源
        最近更新 更多