Python检查大量URL列表中断链接的工具

2024-06-16 09:16:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个搜索引擎在生产服务约70万个网址。爬行是使用Scrapy完成的,所有spider都使用DeltaFetch进行调度,以便获得每日的新链接。在

我面临的困难是处理断开的链接。在

我很难找到一个好的方法定期扫描,并删除断开的链接。我在想一些解决办法:

  • 使用开发python脚本请求.get,以检查每个url,并删除任何返回404状态的内容。在
  • 使用第三方工具,如https://github.com/linkchecker/linkchecker,但不确定这是否是最佳解决方案,因为我只需要检查url列表,而不是网站。在
  • 使用scrapy spider废弃这个url列表,并返回任何出错的url。我不太相信这一点,因为我知道scrapy在扫描不同域上的大量url时往往会超时,这就是为什么我如此依赖deltafetch

你有什么建议/最佳实践来解决这个问题吗?在

非常感谢。在

编辑:我忘了给出一个精度:我想“验证”那些700k个网址,而不是抓取它们。实际上,这700k个url是大约25000个域的爬行结果。在


Tags: 方法脚本url列表get链接调度搜索引擎
3条回答

我建议使用scrapy,因为您已经用这个工具查找每个URL,从而知道哪些URL出错了。这意味着您不必再次检查url。在

我会这样做的:

  • 将每一个URL错误保存在一个单独的列表/映射中,并带有一个计数器(存储在两次运行之间)。在
  • 每次URL出错时,递增计数器。如果没有,则递减计数器。在
  • 运行Scrapy脚本后,用足够高的计数器检查这个列表/映射中的URL(假设有10个以上的错误),并删除它们-或将它们存储在单独的链接列表中,以便以后检查(作为检查,如果由于服务器停机时间过长而意外删除了一个有效的URL)。在

因为你的第三个问题是担心Scrapy对URL结果的不稳定,所以对于一般的网站来说也是如此。如果一个站点在一次尝试中出错,可能并不意味着链接断开。在

您可以编写一个小脚本来检查返回的http状态,如下所示:

for url in urls:
    try:
        urllib2.urlopen(url)
    except urllib2.HTTPError, e:
        # Do something when request fails
        print e.code

这和你的第一点一样。您也可以运行这个异步,以便优化运行700k个链接所需的时间。在

如果你想创建一个我们自己的脚本检查this solution
另外,我建议的一个优化是在URL存储库中建立层次结构。如果你从一个父URL得到404,你可以避免检查所有的it子URL

相关问题 更多 >