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

Python工具,用于检查大URL列表上的断开链接,python,scrapy,Python,Scrapy,我有一个搜索引擎在生产服务约70万网址。爬行是使用Scrapy完成的,所有爬行器都是使用DeltaFetch安排的,以便获得每日的新链接 我面临的困难是处理断开的链接 我很难找到一个好方法来定期扫描和删除断开的链接。我在考虑一些解决方案: 使用requests.get开发python脚本,以检查每个url,并删除返回404状态的任何内容 使用第三方工具,如,但不确定这是否是最好的解决方案,因为我只需要检查url列表,而不是网站 使用scrapy spider删除此url列表,并返回任何出错的u

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

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

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

  • 使用requests.get开发python脚本,以检查每个url,并删除返回404状态的任何内容
  • 使用第三方工具,如,但不确定这是否是最好的解决方案,因为我只需要检查url列表,而不是网站
  • 使用scrapy spider删除此url列表,并返回任何出错的url。我对这一点不是很有信心,因为我知道scrapy在扫描不同域上的大量URL时会超时,这就是我如此依赖deltafetch的原因
您是否有解决此问题的建议/最佳做法

非常感谢


编辑:我忘了给出一个精确性:我希望“验证”那些700k URL,而不是对它们进行爬网。实际上,这些700k URL是大约25000k个域的爬网结果。

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

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

这与你的第一点相同。您还可以运行此异步,以优化运行700k链接所需的时间。

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

我会这样做:

  • 使用计数器(存储在两次运行之间)将每个出错的URL保存在单独的列表/映射中
  • 每次URL出错时,递增计数器。如果没有,则减小计数器
  • 运行Scrapy脚本后,请检查此列表/映射中具有足够高计数器的URL(比方说超过10个错误,并将其删除),或者将它们存储在单独的链接列表中,以便稍后检查(如果由于服务器停机时间太长而意外删除了工作URL,请进行检查)

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

如果您选择创建我们自己的脚本,请检查
此外,我建议的一个优化是在URL存储库中建立继承权。如果您从父URL之一获得404,则可以避免检查所有子URL

  • 我的第一个想法是使用
    头来请求URL,而不是使用任何其他方法
  • 一次生成多个spider,为它们分配批处理,如
    LIMIT 010000
    LIMIT 1000010000
  • 在数据管道中,不是每次scraper发现
    404
    状态时都运行MySQL
    DELETE
    查询,而是批量运行
    DELETE FROM table WHERE link In(link1,link2)
    query
  • 我确信你们在链接栏上有索引,若并没有添加的话

  • 我编写了一个简单的脚本,它使用urllib并检查http状态代码是否返回。它不仅是404,但是你也应该检查其他状态代码,比如503等等。我假设列表是相当大的,所以考虑在多个线程中并行使用获取URL(主要是IO等待,所以你将不受<代码>吉尔<代码>限制),或者更好地使用<代码> AssiCIO < /C>这里提到的一些东西:只要求头部是个好主意!然而,我根本不使用SQL,但我明白您在中关于查询的观点bulk@roma98No.*2*也是一个好主意,无论scraper从哪个数据源读取链接,都可以通过生成多个实例来实现双倍的速度谢谢!然而,我不想爬网,那些700k的URL已经是一个巨大的爬网的结果。脚本看起来真的很好,我会编辑它并在我这边尝试。这是我很久以来一直在考虑的事情,但我认为这可能是我的情况下最好的解决方案。