【问题标题】:Scrapy Case : Incremental Update of ItemsScrapy 案例:项目的增量更新
【发布时间】:2013-03-20 17:03:32
【问题描述】:

请帮我解决以下情况:

想象一个典型的分类类别页面。包含项目列表的页面。当您点击您登陆内部页面的项目时。现在我的爬虫抓取所有这些 URL,进一步抓取这些 url 以获取项目的详细信息,检查初始种子 URL 是否为任何下一页。如果有,它会转到下一页并执行相同的操作。我将这些项目存储在 sql 数据库中。

假设 3 天后,种子 URL 中有新项目,我只想废弃新项目。可能的解决方案是:

  1. 在抓取每个项目时,我会检查数据库以查看 URL 是否已被抓取。如果有,我只是要求 Scrapy 停止进一步爬行。 问题:我不想每次都查询数据库。我的数据库会非常大,最终会让爬网变得超级慢。

  2. 我尝试存储最后抓取的 URL 并在开始时将其传递,当它找到这个 last_scraped_url 时,它只会停止爬虫。 不可能,因为抓取 URL 的异步特性不会按照从种子 URL 接收到的顺序进行抓取。 (我尝试了所有方法以使其井然有序——但这根本不可能)

任何人都可以提出任何其他想法吗?过去三天我一直在为此苦苦挣扎。

感谢您的回复。

【问题讨论】:

  • 种子 URL 中的项目是如何生成的?您对此有任何控制权吗?

标签: python screen-scraping scrapy


【解决方案1】:

在尝试给你一个想法之前......

我必须说我会先尝试您的数据库选项。数据库就是为此而建立的,即使您的数据库变得非常大,这也不应该使爬行速度显着变慢。 我学到的一个教训是:“首先做愚蠢的实现。然后,你尝试优化。”大多数情况下,当您首先优化时,您只是优化了错误的部分。

但是,如果您真的想要另一个想法... Scrapy 的默认设置是不会对同一个 url 进行两次爬取。因此,在开始抓取之前,您可以将已经抓取的 url(3 天前)放入 Scrapy 用来知道哪些 url 已经被访问过的列表中。 (我不知道该怎么做。) 或者,更简单的是,在您的项目解析器中,您只需检查 url 是否已被抓取并返回 None 或相应地抓取新项目。

【讨论】:

    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2021-11-10
    • 1970-01-01
    • 2016-08-07
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多