我每天都使用scrapy抓取新闻网站。我如何限制scrapy刮掉已经删除的URL。 SgmlLinkExtractor
上还有任何明确的文档或示例。
答案 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的库。
希望能帮助别人。我为此花了很多时间。