【问题标题】:Tools/libraries to resolve/expand thousands of URLs用于解析/扩展数千个 URL 的工具/库
【发布时间】:2011-04-12 22:41:42
【问题描述】:

在类似爬虫的项目中,我们有一个常见且广泛使用的任务来解析/扩展数千个 URL。假设我们有(非常简化的示例):

http://bit.ly/4Agih5

GET 'http://bit.ly/4Agih5' 请求返回 3xx 之一,我们跟随重定向到:

http://stackoverflow.com

GET 'http://stackoverflow.com' 返回 200。所以 'stackoverflow.com' 是我们需要的结果。

任何网址(不仅是像 bit.ly 这样的知名缩短器)都可以作为输入。其中一些重定向一次,一些根本不重定向(在这种情况下结果是 URL 本身),一些重定向多次。 我们的任务是尽可能地跟踪模仿浏览器行为的所有重定向。 一般来说,如果我们有一些 URL A 解析器应该返回我们 URL B 应该与 A 相同在某些浏览器中打开。

到目前为止,我们使用 Java、线程池和简单的URLConnection 来解决这个任务。优点很明显:

  • 简单 - 只需创建URLConnection,设置跟随重定向就可以了(几乎);
  • 良好的 HTTP 支持 - Java 提供了我们尽可能模仿浏览器所需的一切:自动跟踪重定向、cookie 支持。

不幸的是,这种方法也有缺点:

  • 性能 - 线程不是免费的,URLConnectiongetInputStream() 之后立即开始下载文档,即使我们不需要它;
  • 内存占用 - 不确定,但似乎 URLURLConnection 是相当重的对象,并且在 getInputStream() 调用之后再次缓冲 GET 结果。

是否有其他解决方案(或对此进行改进)可以显着提高速度并减少内存消耗?大概,我们需要类似的东西:

  • 基于java.nio的高性能轻量级Java HTTP客户端;
  • 使用 poll() 或 select() 的 C HTTP 客户端;
  • 一些现成的库,可以解析/扩展 URL;

【问题讨论】:

  • 你试过 Apache Nutch 爬虫吗?
  • 某些网站使用元标记或 Javascript 进行重定向,因此您很可能希望使用浏览器来获得明确的答案。
  • @Abdullah Jibaly 是的,我知道。其中最重要的是,我们以特定于站点的方式处理以获得最终目的地。正如我所说,行为应该尽可能接近浏览器,而不是完全相同。考虑到我们需要处理数千个 URL,我认为这不是我们处理 JS 的方式。

标签: java c http web-crawler


【解决方案1】:

您可以使用 Python、Gevent 和 urlopen。将this gevent exampelthe redirect handling in this SO question 组合在一起。

我不推荐 Nutch,它的设置非常复杂,并且有很多依赖项(Hadoop、HDFS)。

【讨论】:

    【解决方案2】:

    我会使用 selenium 脚本从队列中读取 URL,并使用 GET 它们。然后每个浏览器等待大约 5 秒以查看是否发生了重定向,如果发生了,则将新的重定向 URL 放回队列中以供下一个实例处理。您可以根据需要同时运行多个实例。

    更新

    如果您只关心 Location 标头(大多数非 JS 或元重定向使用的),只需检查它,您永远不需要获取 inputStream

    HttpURLConnection.setFollowRedirects(false);
    URL url = new URL("http://bit.ly/abc123");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    String newLocation = conn.getHeaderField("Location");
    

    如果 newLocation 已填充,则将该 URL 重新插入队列并在下一轮进行。

    【讨论】:

    • 与我们当前的解决方案相比,它如何更快并消耗更少的内存?我需要启动很多“浏览器”来并行化它吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2014-07-31
    • 2011-02-20
    • 2018-12-09
    • 1970-01-01
    • 2015-02-08
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多