我有一个正在生产中的搜索引擎,提供大约70万个网址。使用Scrapy进行爬网,并使用DeltaFetch计划所有蜘蛛,以获取每日的新链接。
我面临的困难是处理断开的链接。
我很难找到一种定期扫描和删除损坏链接的好方法。我在考虑一些解决方案:
您有解决此问题的建议/最佳做法吗?
非常感谢。
编辑:我忘了一种精确度:我想“验证”这700k网址,而不是对其进行爬网。实际上,这70万个网址是大约2500万个域的抓取结果。
答案 0 :(得分:1)
您可以编写一个小的脚本来检查返回的http状态,如下所示:
for url in urls:
try:
urllib2.urlopen(url)
except urllib2.HTTPError, e:
# Do something when request fails
print e.code
这与您的第一点相同。您还可以运行此异步操作,以优化通过700k链接运行所需的时间。
答案 1 :(得分:1)
我建议您使用scrapy,因为您已经在使用此工具查找每个URL,从而知道哪些URL错误。这意味着您不必再次检查URL。
我会这样处理:
由于您的第三个要点是有关Scrapy的URL结果不稳定,因此一般来说,网站也可以这样说。如果某个网站在1次尝试中出现错误,则可能并不意味着链接断开。
答案 2 :(得分:1)
如果您要创建自己检查的脚本this solution
另外,我建议您进行优化,以使URL存储库中具有层次结构。如果您从一个父网址中获取404,则可以避免检查所有子网址
答案 3 :(得分:1)
HEAD
而不是其他任何方法来请求URL LIMIT 0,10000
和LIMIT 10000,10000
之类的批次DELETE
状态时都运行MySQL 404
查询,而是批量运行DELETE FROM table WHERE link IN(link1,link2)
查询