用于检查大网址列表上断开链接的Python工具

时间:2018-10-25 07:57:12

标签: python scrapy

我有一个正在生产中的搜索引擎,提供大约70万个网址。使用Scrapy进行爬网,并使用DeltaFetch计划所有蜘蛛,以获取每日的新链接。

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

我很难找到一种定期扫描和删除损坏链接的好方法。我在考虑一些解决方案:

  • 使用request.get开发python脚本,以检查每个单独的url,并删除所有返回404状态的内容。
  • 使用https://github.com/linkchecker/linkchecker之类的第三方工具,但不确定是不是最佳解决方案,因为我只需要检查网址列表,而不是网站。
  • 使用可抓取的抓取工具抓取此网址列表,并返回所有错误的网址。我对此并没有真正的信心,因为我知道在不同域上扫描大量url时,scrapy会超时,这就是为什么我非常依赖deltafetch

您有解决此问题的建议/最佳做法吗?

非常感谢。

编辑:我忘了一种精确度:我想“验证”这700k网址,而不是对其进行爬网。实际上,这70万个网址是大约2500万个域的抓取结果。

4 个答案:

答案 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。

我会这样处理:

  • 使用计数器(存储在两次运行之间)将每个错误的URL保存在单独的列表/映射中。
  • 每次URL错误时,都要增加计数器。如果不是,则递减计数器。
  • 运行Scrapy脚本后,请在此列表/映射中查找计数器值足够高的网址-假设有10个以上的错误,然后将其删除-或将其存储在单独的链接列表中以检查稍后(作为检查是否由于服务器宕机时间太长而意外删除了有效的网址)

由于您的第三个要点是有关Scrapy的URL结果不稳定,因此一般来说,网站也可以这样说。如果某个网站在1次尝试中出现错误,则可能并不意味着链接断开。

答案 2 :(得分:1)

如果您要创建自己检查的脚本this solution
另外,我建议您进行优化,以使URL存储库中具有层次结构。如果您从一个父网址中获取404,则可以避免检查所有子网址

答案 3 :(得分:1)

  1. 我首先想到的是使用HEAD而不是其他任何方法来请求URL
  2. 一次繁殖多个蜘蛛,为它们分配LIMIT 0,10000LIMIT 10000,10000之类的批次
  3. 在您的数据管道中,不要在刮板每次发现DELETE状态时都运行MySQL 404查询,而是批量运行DELETE FROM table WHERE link IN(link1,link2)查询
  4. 我确定链接列上有INDEX,如果没有添加的话