Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于解析/扩展数千个URL的工具/库_Java_C_Http_Web Crawler - Fatal编程技术网

Java 用于解析/扩展数千个URL的工具/库

Java 用于解析/扩展数千个URL的工具/库,java,c,http,web-crawler,Java,C,Http,Web Crawler,在一个类似爬虫的项目中,我们有一个常见且广泛使用的任务来解析/扩展数千个URL。假设我们有(非常简单的例子): 得到http://bit.ly/4Agih5'请求返回3xx中的一个,我们按照重定向权限转到: 得到http://stackoverflow.com'返回200。所以“stackoverflow.com”是我们需要的结果 任何URL(不仅仅是众所周知的缩写,如bit.ly)都可以作为输入。有些重定向一次,有些根本不重定向(在本例中,结果是URL本身),有些重定向多次我们的任务是尽可

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

得到http://bit.ly/4Agih5'请求返回3xx中的一个,我们按照重定向权限转到:

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

任何URL(不仅仅是众所周知的缩写,如bit.ly)都可以作为输入。有些重定向一次,有些根本不重定向(在本例中,结果是URL本身),有些重定向多次我们的任务是尽可能模仿浏览器的行为来跟踪所有重定向。一般来说,如果我们有一些URL
A
解析程序应该返回我们的URL
B
,这应该与在某个浏览器中打开
A
时相同

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

  • 简单性-只需创建
    URLConnection
    ,设置跟随重定向,就可以了(差不多)
  • HTTP支持——Java提供了我们尽可能模仿浏览器所需的一切:自动跟踪重定向、cookie支持
不幸的是,这种方法也有缺点:

  • 性能-线程不是免费的,
    URLConnection
    getInputStream()
    之后立即开始下载文档,即使我们不需要它
  • 内存占用-不确定是否准确,但似乎
    URL
    URLConnection
    都是非常沉重的对象,并且在调用
    getInputStream()
    之后立即缓冲GET结果
是否有其他解决方案(或对此方案的改进)可以显著提高速度并减少内存消耗?我们大概需要以下解决方案:

  • 基于Java.nio的高性能轻量级Java HTTP客户端
  • C使用poll()或select()的HTTP客户端
  • 一些现成的库,用于解析/扩展URL
我会使用脚本从队列中读取URL并
获取它们。然后每个浏览器等待大约5秒钟,查看是否发生重定向,如果发生了重定向,则将新的重定向URL放回队列中,以便下一个实例进行处理。您可以让任意多个实例同时运行

更新

如果您只关心位置头(大多数非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重新粘贴到队列中,并在下一轮使用该URL。

您可以使用Python、Gevent和urlopen。结合


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

你试过Apache Nutch crawler吗?有些网站使用meta标记或Javascript重定向,所以你很可能想使用浏览器获得最终答案。@Abdullah Jibaly是的,我知道。最重要的是,我们以特定于站点的方式进行处理,以获得最终目的地。正如我所说,行为应该尽可能接近浏览器,而不是完全相同。考虑到我们需要处理数千个URL,我相信这不是我们处理JS的方式。它如何比我们当前的解决方案更快、占用更少内存?我需要启动很多“浏览器”来并行化,这对吗?