Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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 Apache Nutch 2.3.1获取程序提供无效uri异常_Java_Exception_Web Crawler_Nutch_Nutch2 - Fatal编程技术网

Java Apache Nutch 2.3.1获取程序提供无效uri异常

Java Apache Nutch 2.3.1获取程序提供无效uri异常,java,exception,web-crawler,nutch,nutch2,Java,Exception,Web Crawler,Nutch,Nutch2,我已经用Hadoop生态系统配置了ApacheNutch2.3.1。我要找一些人去阿拉伯语网站。Nutch在获取时对一些URL给出了例外。下面是一个例外示例 java.lang.IllegalArgumentException: Invalid uri 'http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html': escaped absolute path not valid at org

我已经用Hadoop生态系统配置了ApacheNutch2.3.1。我要找一些人去阿拉伯语网站。Nutch在获取时对一些URL给出了例外。下面是一个例外示例

java.lang.IllegalArgumentException: Invalid uri 'http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html': escaped absolute path not valid
    at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:222)
    at org.apache.commons.httpclient.methods.GetMethod.<init>(GetMethod.java:89)
    at org.apache.nutch.protocol.httpclient.HttpResponse.<init>(HttpResponse.java:77)
    at org.apache.nutch.protocol.httpclient.Http.getResponse(Http.java:173)
    at org.apache.nutch.protocol.http.api.HttpBase.getProtocolOutput(HttpBase.java:245)
    at org.apache.nutch.fetcher.FetcherReducer$FetcherThread.run(FetcherReducer.java:564)
java.lang.IllegalArgumentException:无效uri'http://agahi.safirak.com/ads/850/html:转义绝对路径无效
位于org.apache.commons.httpclient.HttpMethodBase.(HttpMethodBase.java:222)
位于org.apache.commons.httpclient.methods.GetMethod.(GetMethod.java:89)
位于org.apache.nutch.protocol.httpclient.HttpResponse(HttpResponse.java:77)
位于org.apache.nutch.protocol.httpclient.Http.getResponse(Http.java:173)
http.api.HttpBase.getProtocolOutput(HttpBase.java:245)
位于org.apache.nutch.fetcher.FetcherReducer$FetcherThread.run(FetcherReducer.java:564)

即使在1.x分支上,我也能重现这个问题。问题在于Apache HTTP客户端库内部使用的Java URI类不支持非转义UTF-8字符:

java.net.URI
的JavaDoc文档中:

字符类别 RFC2396精确地指定URI引用的各个组件中允许哪些字符。以下类别(大部分取自该规范)用于描述这些约束条件:

  • alpha美国ASCII字母字符“A”到“Z”和“A”到“Z”
  • 数字US-ASCII十进制数字字符,“0”到“9”
  • alphanum所有字母和数字字符 未保留所有alphanum字符以及字符串“-!.~”()*”中的字符
  • punct字符串中的字符“,;:$&+=”
  • 保留所有点状字符以及字符串“+/[]”中的字符
  • 转义转义八位字节,即由百分比字符(“%”)和两个十六进制数字('0'-'9'、'A'-'F'和'A'-'F'组成的三元组
  • other不在US-ASCII字符集中的Unicode字符不是控制字符(根据
    character.isISOControl
    方法),也不是空格字符(根据
    character.isSpaceChar
    方法)(与RFC 2396的偏差,仅限于US-ASCII)
所有合法URI字符集由未保留、保留、转义和其他字符组成

正确转义的URL看起来更像:

实际上,如果您在Chrome上打开示例URL,然后从地址栏复制URL,您将获得转义的表示。请随意为此打开一个问题(否则我会这样做)。同时,您可以尝试使用不使用Apache http客户端的
协议http
插件。我在本地进行了测试,parsechecker工作正常:

➜  local (master) ✗ bin/nutch parsechecker "http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html"
fetching: http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html
robots.txt whitelist not configured.
parsing: http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html
contentType: text/html
signature: 048b390ab07464f5d61ae09646253529
---------
Url
---------------

http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html
---------
ParseData
---------

Version: 5
Status: success(1,0)
Title: پیچ بند بادی هفتیری 1800 دور بادی جیسون-نیازمندی سفیرک
Outlinks: 76
outlink: toUrl: http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html anchor: 
outlink: toUrl: http://agahi.safirak.com/assets/fonts/font-awesome/css/font-awesome.min.css anchor: 
outlink: toUrl: http://agahi.safirak.com/assets/css/bootstrap.css anchor:
...

即使在1.x分支上,我也能复制这个问题。问题在于Apache HTTP客户端库内部使用的Java URI类不支持非转义UTF-8字符:

java.net.URI
的JavaDoc文档中:

字符类别 RFC2396精确地指定URI引用的各个组件中允许哪些字符。以下类别(大部分取自该规范)用于描述这些约束条件:

  • alpha美国ASCII字母字符“A”到“Z”和“A”到“Z”
  • 数字US-ASCII十进制数字字符,“0”到“9”
  • alphanum所有字母和数字字符 未保留所有alphanum字符以及字符串“-!.~”()*”中的字符
  • punct字符串中的字符“,;:$&+=”
  • 保留所有点状字符以及字符串“+/[]”中的字符
  • 转义转义八位字节,即由百分比字符(“%”)和两个十六进制数字('0'-'9'、'A'-'F'和'A'-'F'组成的三元组
  • other不在US-ASCII字符集中的Unicode字符不是控制字符(根据
    character.isISOControl
    方法),也不是空格字符(根据
    character.isSpaceChar
    方法)(与RFC 2396的偏差,仅限于US-ASCII)
所有合法URI字符集由未保留、保留、转义和其他字符组成

正确转义的URL看起来更像:

实际上,如果您在Chrome上打开示例URL,然后从地址栏复制URL,您将获得转义的表示。请随意为此打开一个问题(否则我会这样做)。同时,您可以尝试使用不使用Apache http客户端的
协议http
插件。我在本地进行了测试,parsechecker工作正常:

➜  local (master) ✗ bin/nutch parsechecker "http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html"
fetching: http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html
robots.txt whitelist not configured.
parsing: http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html
contentType: text/html
signature: 048b390ab07464f5d61ae09646253529
---------
Url
---------------

http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html
---------
ParseData
---------

Version: 5
Status: success(1,0)
Title: پیچ بند بادی هفتیری 1800 دور بادی جیسون-نیازمندی سفیرک
Outlinks: 76
outlink: toUrl: http://agahi.safirak.com/ads/850/پیچ-بند-بادی-هفتیری-1800-دور-بادی-جیسون.html anchor: 
outlink: toUrl: http://agahi.safirak.com/assets/fonts/font-awesome/css/font-awesome.min.css anchor: 
outlink: toUrl: http://agahi.safirak.com/assets/css/bootstrap.css anchor:
...

主席先生,我不知道如何及在何处提出这问题。您可以打开此问题OK,我在我们的问题跟踪程序()中打开了一个问题您可以在那里跟踪进度。先生,我不知道如何以及在何处生成此问题。你可以打开这个问题OK,我在我们的问题跟踪器()中打开了一个问题,你可以在那里跟踪进度。