0

我已经为 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)
4

1 回答 1

2

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

来自 JavaDoc 文档java.net.URI

字符类别

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

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

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

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

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 上打开示例 URL,然后从地址栏中复制该 URL,您将获得转义表示。随意为此打开一个问题(否则我会这样做)。同时,您可以尝试使用protocol-http不使用 Apache 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:
...
于 2018-03-20T22:34:17.550 回答