Scrapy - 如何识别已经刮过的网址

时间:2010-10-06 10:38:33

标签: python web-crawler scrapy

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

5 个答案:

答案 0 :(得分:13)

使用位于此处的scrapy代码段,您可以非常轻松地执行此操作: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()

我认为就是这样。下次运行蜘蛛时,应该自动尝试开始避开相同的站点。

祝你好运!

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这是直截了当的。在python dict中维护所有先前已爬网的URL。因此,当您下次尝试尝试它们时,请查看该dict中是否存在该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文本编辑器aka浏览器中输入的。可能有语法错误。您可能还需要进行一些更改。但逻辑是......

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

答案 4 :(得分:0)

对于今天(2019年),此帖子是此问题的最佳答案。

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

它是自动处理MIDDLEWARES的库。

希望能帮助别人。我为此花了很多时间。