Apache Nutch 2.3.1 Fetcher给出无效的uri异常

时间:2018-03-20 08:00:12

标签: java exception web-crawler nutch nutch2

我已将Apache Nutch 2.3.1配置为Hadoop生态系统。我必须取一些人 - 阿拉伯语脚本网站。 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)

1 个答案:

答案 0 :(得分:2)

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

来自java.net.URI的JavaDoc文档:

  

字符类别

     

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

     
      
  • alpha US-ASCII字母字符,&#39; A&#39;通过&#39; Z&#39;和&#39; a&#39;通过&#39; z&#39;
  •   
  • 数字 US-ASCII十进制数字符,&#39; 0&#39;通过&#39; 9&#39;
  •   
  • alphanum 所有字母和数字字符   未保留所有的alphanum字符以及字符串中的字符&#34; _-!。〜&#39;()*&#34;
  •   
  • punct 字符串中的字符&#34;,;:$&amp; + =&#34;
  •   
  • 保留所有符号字符和字符串中的字符&#34;?/ [] @&#34;
  •   
  • 转义转义的八位字节,即由百分号(&#39;%&#39;)组成的三元组,后跟两个十六进制数字(&#39; 0&#39; - & #39; 9&#39;,&#39; A&#39; - &#39; F&#39;和&#39; a&#39; - &#39; f&#39;)
  •   
  • 其他不在US-ASCII字符集中的Unicode字符不是控制字符(根据Character.isISOControl方法),并且不是空格字符(根据Character.isSpaceChar方法)(与RFC 2396的偏差,仅限于US-ASCII)
  •   
     

所有合法URI字符集由未保留,保留,转义和其他字符组成。

正确转义的网址看起来更像是:

http://agahi.safirak.com/ads/850/%D9%BE%DB%8C%DA%86-%D8%A8%D9%86%D8%AF-%D8%A8%D8%A7%D8%AF%DB%8C-%D9%87%D9%81%D8%AA%DB%8C%D8%B1%DB%8C-1800-%D8%AF%D9%88%D8%B1-%D8%A8%D8%A7%D8%AF%DB%8C-%D8%AC%DB%8C%D8%B3%D9%88%D9%86.html

实际上,如果您在Chrome上打开示例网址,然后从地址栏中复制该网址,您将获得转义的代表。随意为此打开一个问题(否则我会这样做)。与此同时,您可以尝试使用不使用Apache HTTP客户端的protocol-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:
...