我每天都使用scrapy来抓取一个新闻网站。我如何限制 scrapy 抓取已抓取的 URL。上是否有任何明确的文档或示例SgmlLinkExtractor
。
5 回答
实际上,您可以使用此处的 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()
我认为就是这样。下次您运行蜘蛛程序时,它应该会自动尝试开始避开相同的站点。
祝你好运!
我认为 jama22 的回答有点不完整。
在代码段if self.FILTER_VISITED in x.meta
:中,您可以看到您的请求实例中需要 FILTER_VISITED 才能忽略该请求。这是为了确保您可以区分要遍历和移动的链接和您不想再次看到的项目链接。
这是直截了当的。在 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)才能获得更新的内容。
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 的库。
希望能帮助到某人。我花了很多时间寻找这个。