【发布时间】:2010-10-06 10:38:32
【问题描述】:
我每天都在使用 scrapy 抓取新闻网站。我如何限制 scrapy 抓取已抓取的 URL。 SgmlLinkExtractor 上也有任何明确的文档或示例。
【问题讨论】:
-
为此,您必须存储已抓取的 URL。你这样做吗?如果有,怎么做?
标签: python web-crawler scrapy
我每天都在使用 scrapy 抓取新闻网站。我如何限制 scrapy 抓取已抓取的 URL。 SgmlLinkExtractor 上也有任何明确的文档或示例。
【问题讨论】:
标签: python web-crawler scrapy
您实际上可以使用位于此处的 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()
我想就是这样。下次您运行蜘蛛程序时,它应该会自动尝试开始避开相同的站点。
祝你好运!
【讨论】:
这是直截了当的。在 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)才能获取更新的内容。
【讨论】:
我认为 jama22 的回答有点不完整。
在 sn-p if self.FILTER_VISITED in x.meta: 中,您可以看到您的请求实例中需要 FILTER_VISITED 才能忽略该请求。这是为了确保您可以区分要遍历和移动的链接和不想再次看到的项目链接。
【讨论】:
Scrapy 可以自动过滤被抓取的网址,不是吗?一些指向同一个页面的不同url不会被过滤掉,比如“www.xxx.com/home/”和“www.xxx.com/home/index.html”。
【讨论】:
对于今天(2019 年),这篇文章是这个问题的最佳答案。
https://blog.scrapinghub.com/2016/07/20/scrapy-tips-from-the-pros-july-2016
这是一个自动处理 MIDDLEWARES 的库。
希望能帮助到某人。我花了很多时间寻找这个。
【讨论】: