解决Heritrix镜像方式存储路径中文乱码的解决方案

针对Heritrix网络爬虫在抓取含有中文URL的网页时出现的乱码问题,通过修改源代码中的字符编码处理方法,成功解决了中文文件名的乱码问题。

[声明:本文系作者原创,转载请声明转自http://home.cnblogs.com/u/sunt2012/谢谢合作]

利用heritrix做网络爬虫,当选择以镜像方式存储heritrix下的文档时,如果URL中存在中文或者访问的文件名是中文时,在下载文件的镜像目录路径就会有乱码(如下图)。

在解决此问题前先看看为何会出现乱码。

中国文物网为例,下面的一个路径下有图片,如下

http://www.wenwuchina.com/uploads/conew_刘亚东老师现场弹奏《潇湘水云》_conew1.jpg

,当在浏览器输入该地址时,浏览器会将其编码为如下地址

http://www.wenwuchina.com/uploads/conew_%E5%88%98%E4%BA%9A%E4%B8%9C%E8%80%81%E5%B8%88%E7%8E%B0%E5%9C%BA%E5%BC%B9%E5%A5%8F%E3%80%8A%E6%BD%87%E6%B9%98%E6%B0%B4%E4%BA%91%E3%80%8B_conew1.jpg

红色部分就是浏览器对中文进行编码后的路径。

Heritrix就是以此路径来访问该资源的,当以镜像方式存储下载的资源时,最终就会以conew_%E5%88%98%E4%BA%9A%E4%B8%9C%E8%80%81%E5%B8%88%E7%8E%B0%E5%9C%BA%E5%BC%B9%E5%A5%8F%E3%80%8A%E6%BD%87%E6%B9%98%E6%B0%B4%E4%BA%91%E3%80%8B_conew1.jpg的文件名来存储该资源,就产生的所谓的乱码。

解决方案就是在其创建路径时对路径名进行编码,主要代码在org.archive.crawler.writer. MirrorWriterProcessor类下的方法LumpyString方法。

为了尊重源码,我没有对原来的方法进行改动,新建了org.archive.crawler.writer. MirrorWriterForWenwuchinaProcessor类,来对heritrix进行扩展。复制了org.archive.crawler.writer. MirrorWriterProcessor类中所有代码,并对LumpyString进行必要的改动。如下(红色为修改的部分)

 

复制代码
 1 LumpyString(String str,  int beginIndex,  int endIndex,  int padding,
 2                      int maxLen, Map characterMap, String dotBegin)  {
 3              if (beginIndex < 0) {
 4                  throw  new IllegalArgumentException("beginIndex < 0: "
 5                                                    + beginIndex);
 6             }
 7              if (endIndex < beginIndex) {
 8                  throw  new IllegalArgumentException("endIndex < beginIndex "
 9                     + "beginIndex: " + beginIndex + "endIndex: " + endIndex);
10             }
11              if (padding < 0) {
12                  throw  new IllegalArgumentException("padding < 0: " + padding);
13             }
14              if (maxLen < 1) {
15                  throw  new IllegalArgumentException("maxLen < 1: " + maxLen);
16             }
17              if ( null == characterMap) {
18                  throw  new IllegalArgumentException("characterMap null");
19             }
20              if (( null != dotBegin) && (0 == dotBegin.length())) {
21                  throw  new IllegalArgumentException("dotBegin empty");
22             }
23 
24              //  Initial capacity.  Leave some room for %XX lumps.
25               //  Guaranteed positive.
26              int cap = Math.min(2 * (endIndex - beginIndex) + padding + 1,
27                                maxLen);
28             string =  new StringBuffer(cap);
29             aux =  new  byte[cap];
30              for ( int i = beginIndex; i != endIndex; ++i) {
31                  String s=str.substring(i, i + 1);
32                  try {
33                      s =  new  String(s.getBytes(),"GB2312");
34                 }  catch (UnsupportedEncodingException e) {
35                      //  TODO Auto-generated catch block
36                     e.printStackTrace();
37                 }
38                 String lump;  //  Next lump.
39                  if (".".equals(s) && (i == beginIndex) && ( null != dotBegin)) {
40                     lump = dotBegin;
41                 }  else {
42                     lump = (String) characterMap.get(s);
43                 }
44                  if ( null == lump) {
45                      if ("%".equals(s) && ((endIndex - i) > 2)
46                             && (-1 != Character.digit(str.charAt(i + 1), 16))
47                             && (-1 != Character.digit(str.charAt(i + 2), 16))) {
48 
49                          //  %XX escape; treat as one lump.
50                         lump = str.substring(i, i + 3);
51                         i += 2;
52                     }  else {
53                         lump = s;
54                     }
55                 }
56                  if ((string.length() + lump.length()) > maxLen) {
57                      assert checkInvariants();
58                      return;
59                 }
60                 append(lump);
61             }
62              assert checkInvariants();
63         }
复制代码

 

 

然后在Processor.options里加入org.archive.crawler.writer. MirrorWriterForWenwuchinaProcessor选项,在Job里添加该处理器,进行抓取后,乱码消失。(如下图)

 

PS:对中文资源什么的出现乱码,网络上有很多解决方案了,大家可以自己查一下,也很简单,只需改动一行代码即可。

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值