我已经使用Hadoop生态系统配置了Apache Nutch 2.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)
最佳答案
即使在1.x分支上,我也能够重现此问题。问题是Apache HTTP客户端库内部使用的Java URI类不支持非转义的UTF-8字符:
从java.net.URI
的JavaDoc文档中:
角色类别
RFC 2396精确指定URI引用的各个组件中允许使用哪些字符。以下类别(其中大部分来自该规范)在下面用于描述这些约束:
alpha US-ASCII字母字符,“ A”至“ Z”和“ a”至“ z”
digit US-ASCII十进制数字字符,“ 0”到“ 9”
字母数字所有字母和数字字符
取消保留所有字母数字字符以及字符串“ _- !.〜'()*”中的字符
punct字符串中的字符“,;:$&+ =”
保留所有点字符以及字符串“?/ [] @”中的字符
转义的转义八位位组,即由百分比字符('%')和两个十六进制数字('0'-'9','A'-'F'和'a'-'f')组成的三元组
其他不在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上打开示例网址,然后从地址栏中复制该网址,则会得到转义的表示形式。随时为此打开一个问题(否则,我会做)。同时,您可以尝试使用不使用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:
...
关于java - Apache Nutch 2.3.1 Fetcher提供了无效的uri异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49379007/