[声明:本文系作者原创,转载请声明转自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:对中文资源什么的出现乱码,网络上有很多解决方案了,大家可以自己查一下,也很简单,只需改动一行代码即可。

转载于:https://www.cnblogs.com/sunt2012/archive/2012/07/09/heritrix_1.html

[原创]解决Heritrix镜像方式存储路径中文乱码的解决方案相关推荐

  1. php mysql存储中文为空_PHP如何解决MySQL存储数据中文乱码

    PHP如何解决MySQL存储数据中文乱码?本文主要介绍了PHP+MySQL存储数据常见中文乱码问题,针对php+mysql常见的中文乱码问题予以总结分析,并给出了解决方法供大家参考.需要的朋友可以参考 ...

  2. Activiti保存.png 流程图片文件且解决idea中保存图片时显示中文乱码的解决方法

    Activiti保存.png 流程图片文件且解决idea中保存图片时显示中文乱码的解决方法 Eclipse 工具中的操作 流程图片生成的两种方式: 使用 activiti-designer 设计流程图 ...

  3. bug:生产问题,Golang解决csv文件用excel打开中文乱码问题及常见编码和BOM头关系

    bug:Golang解决csv文件用excel打开中文乱码问题 1 场景及分析 场景:今天在生成csv文件之后,测试发现用office和wps打开乱码 分析:经过测试之后发现使用记事本打开不乱码,同时 ...

  4. 解决SpringMvc后台接收json数据中文乱码问题

    2019独角兽企业重金招聘Python工程师标准>>> 1.使用ajax从前台页面传输数据到后台controller控制器的时候,出现中文乱码(问号???). 之前在网上找了各种解决 ...

  5. php excelreader 中文,如何解决php excel reader导出excel中文乱码?

    解决php excel reader导出excel中文乱码的方法:1.如果不使用dump函数,可以通过修改[_defaultEncoding]变量解决问题:2.如果使用dump函数导出excel,需要 ...

  6. python2中文输出代码_解决vscode python print 输出窗口中文乱码的问题

    解决vscode python print 输出窗口中文乱码的问题 发布时间:2020-09-17 23:53:25 来源:脚本之家 阅读:119 一.搭建 python 环境 在 VSC 中点击 F ...

  7. php写入文本乱码,如何解决PHP用fwrite写入文件中文乱码的问题

    如何解决PHP用fwrite写入文件中文乱码的问题 发布时间:2020-07-15 13:52:07 来源:亿速云 阅读:220 作者:Leah 这期内容当中小编将会给大家带来有关如何解决PHP用fw ...

  8. 怎么解决svn清理失败且路径显示乱码问题

    怎么解决svn清理失败且路径显示乱码问题 参考文章: (1)怎么解决svn清理失败且路径显示乱码问题 (2)https://www.cnblogs.com/moyand/p/5465225.html ...

  9. ajax传输json数据格式乱码_解决Ajax加载JSon数据中文乱码问题

    一.问题描述 使用zTree的异步刷新父级菜单时,服务器返回中文乱码,但项目中使用了SpringMvc,已经对中文乱码处理,为什么还会出现呢? 此处为的异步请求的配置: Java代码 async: { ...

  10. 解决@ResponseBody注解返回的json中文乱码问题

    解决@ResponseBody注解返回的json中文乱码问题 参考文章: (1)解决@ResponseBody注解返回的json中文乱码问题 (2)https://www.cnblogs.com/hu ...

最新文章

  1. 放弃java转战kotlin,我的心路历程
  2. Cissp-【第1章 安全和风险管理】-2020-12-31(58页-85页)
  3. 《代码大全》阅读笔记02
  4. 服务部署如何做到高可用?这份“三级跳”秘籍送给你
  5. [置顶] CopyU!v2插件合集 [2013年7月18日更新]
  6. 20个堪称神器的命令行软件
  7. scrapy爬虫循环抓取同一个url,避免同一URL使爬虫关闭
  8. 带你学 Redis:Redis简介(一)
  9. spring+mybatis 多数据源切换
  10. vuex 在typescript中的写法
  11. 机器学习(一):数据预处理
  12. java dht 爬虫_python开发的 dht网络爬虫
  13. 电子商务B2C网店购物系统走势
  14. html网页中加入音乐播放器,[HTML5]简单网页本地音乐播放器
  15. 线性方程组、齐次线性方程组和非线性方程组的最小二乘解
  16. 计算机桌面都有说明,电脑重启后桌面所有的图标都没了怎么解决
  17. NLP逻辑回归模型(LR)实现分类问题实例详解
  18. 用深度学习实现自然语言处理:word embedding,单词向量化
  19. c语言编程求完全平方数,菜鸟求助,要怎么求完全平方数?
  20. 修改pdf文件内容可以使用什么编辑工具

热门文章

  1. 【AI初识境】从3次人工智能潮起潮落说起
  2. [Extjs6] 修改默认的日期月份格式
  3. 海外抖音推荐算法,玩转tiktok短视频内容运营
  4. 无纸化办公模式如何取代传统办公模式
  5. ffmpeg转换参数和对几种视频格式的转换分析
  6. nginx实现rtmp,flv,mp4流媒体服务器
  7. 数字转为大写金额(C#)
  8. vscode的pip安装
  9. html手机表白弹窗,怎么制作抖音弹窗表白代码 制作抖音弹窗表白代码的教程
  10. 字节跳动笔试难题 扑克牌的移动