`
h140465
  • 浏览: 21827 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Nutch爬去中文网站乱码

阅读更多

    今天使用Nutch1.7抓取中文网站的时候,发现抓取后的数据是乱码,网上找了很多资料都没有解决。于是查看源代码发现,Nutch解析文件使用的是HtmlParser类,此类中有获取网页编码的代码:

 

 // NUTCH-1006 Meta equiv with single quotes not accepted
  private static Pattern metaPattern =
    Pattern.compile("<meta\\s+([^>]*http-equiv=(\"|')?content-type(\"|')?[^>]*)>",
                    Pattern.CASE_INSENSITIVE);
  private static Pattern charsetPattern =
    Pattern.compile("charset=\\s*([a-z][_\\-0-9a-z]*)",
                    Pattern.CASE_INSENSITIVE);

 

private static String sniffCharacterEncoding(byte[] content) {
    int length = content.length < CHUNK_SIZE ? 
                 content.length : CHUNK_SIZE;

    // We don't care about non-ASCII parts so that it's sufficient
    // to just inflate each byte to a 16-bit value by padding. 
    // For instance, the sequence {0x41, 0x82, 0xb7} will be turned into 
    // {U+0041, U+0082, U+00B7}. 
    String str = "";
    try {
      str = new String(content, 0, length,
                       Charset.forName("ASCII").toString());
    } catch (UnsupportedEncodingException e) {
      // code should never come here, but just in case... 
      return null;
    }

    Matcher metaMatcher = metaPattern.matcher(str);
    String encoding = null;
    if (metaMatcher.find()) {
      Matcher charsetMatcher = charsetPattern.matcher(metaMatcher.group(1));
      if (charsetMatcher.find()) 
        encoding = new String(charsetMatcher.group(1));
    }

    return encoding;
  }

 获得网页中的charset后,会通过detector.guessEncoding方法获取最匹配的编码

 

 

EncodingDetector detector = new EncodingDetector(conf);
detector.autoDetectClues(content, true);
detector.addClue(sniffCharacterEncoding(contentInOctets), "sniffed");
String encoding = detector.guessEncoding(content, defaultCharEncoding);

 其中EncodingDetector类的guessEncoding方法:

public String guessEncoding(Content content, String defaultValue) {
    /*
     * This algorithm could be replaced by something more sophisticated;
     * ideally we would gather a bunch of data on where various clues
     * (autodetect, HTTP headers, HTML meta tags, etc.) disagree, tag each with
     * the correct answer, and use machine learning/some statistical method
     * to generate a better heuristic.
     */

    String base = content.getBaseUrl();

    if (LOG.isTraceEnabled()) {
      findDisagreements(base, clues);
    }

    /*
     * Go down the list of encoding "clues". Use a clue if:
     *  1. Has a confidence value which meets our confidence threshold, OR
     *  2. Doesn't meet the threshold, but is the best try,
     *     since nothing else is available.
     */
    EncodingClue defaultClue = new EncodingClue(defaultValue, "default");
    EncodingClue bestClue = defaultClue;

    for (EncodingClue clue : clues) {
      if (LOG.isTraceEnabled()) {
        LOG.trace(base + ": charset " + clue);
      }
      String charset = clue.value;
      if (minConfidence >= 0 && clue.confidence >= minConfidence) {
        if (LOG.isTraceEnabled()) {
          LOG.trace(base + ": Choosing encoding: " + charset +
                    " with confidence " + clue.confidence);
        }
        return resolveEncodingAlias(charset).toLowerCase();
      } else if (clue.confidence == NO_THRESHOLD && bestClue == defaultClue) {
        bestClue = clue;
      }
    }

    if (LOG.isTraceEnabled()) {
      LOG.trace(base + ": Choosing encoding: " + bestClue);
    }
    return bestClue.value.toLowerCase();
  }

 debug发现,网页中的charset是GBK,而最终获取的编码是GB18030。造成此结果的原因是EncodingDetector的默认设置,将GBK使用GB18030来解析:

static {
    DETECTABLES.add("text/html");
    DETECTABLES.add("text/plain");
    DETECTABLES.add("text/richtext");
    DETECTABLES.add("text/rtf");
    DETECTABLES.add("text/sgml");
    DETECTABLES.add("text/tab-separated-values");
    DETECTABLES.add("text/xml");
    DETECTABLES.add("application/rss+xml");
    DETECTABLES.add("application/xhtml+xml");
    /*
     * the following map is not an alias mapping table, but
     * maps character encodings which are often used in mislabelled
     * documents to their correct encodings. For instance,
     * there are a lot of documents labelled 'ISO-8859-1' which contain
     * characters not covered by ISO-8859-1 but covered by windows-1252.
     * Because windows-1252 is a superset of ISO-8859-1 (sharing code points
     * for the common part), it's better to treat ISO-8859-1 as
     * synonymous with windows-1252 than to reject, as invalid, documents
     * labelled as ISO-8859-1 that have characters outside ISO-8859-1.
     */
    ALIASES.put("ISO-8859-1", "windows-1252");
    ALIASES.put("EUC-KR", "x-windows-949");
    ALIASES.put("x-EUC-CN", "GB18030");
    ALIASES.put("GBK", "GB18030");
    //ALIASES.put("Big5", "Big5HKSCS");
    //ALIASES.put("TIS620", "Cp874");
    //ALIASES.put("ISO-8859-11", "Cp874");

  }

 修改代码

  static {
    DETECTABLES.add("text/html");
    DETECTABLES.add("text/plain");
    DETECTABLES.add("text/richtext");
    DETECTABLES.add("text/rtf");
    DETECTABLES.add("text/sgml");
    DETECTABLES.add("text/tab-separated-values");
    DETECTABLES.add("text/xml");
    DETECTABLES.add("application/rss+xml");
    DETECTABLES.add("application/xhtml+xml");
    /*
     * the following map is not an alias mapping table, but
     * maps character encodings which are often used in mislabelled
     * documents to their correct encodings. For instance,
     * there are a lot of documents labelled 'ISO-8859-1' which contain
     * characters not covered by ISO-8859-1 but covered by windows-1252.
     * Because windows-1252 is a superset of ISO-8859-1 (sharing code points
     * for the common part), it's better to treat ISO-8859-1 as
     * synonymous with windows-1252 than to reject, as invalid, documents
     * labelled as ISO-8859-1 that have characters outside ISO-8859-1.
     */
    ALIASES.put("ISO-8859-1", "windows-1252");
    ALIASES.put("EUC-KR", "x-windows-949");
    ALIASES.put("x-EUC-CN", "GB18030");
    ALIASES.put("GBK", "GBK");
    //ALIASES.put("Big5", "Big5HKSCS");
    //ALIASES.put("TIS620", "Cp874");
    //ALIASES.put("ISO-8859-11", "Cp874");

  }

 就解决乱码问题了

 

分享到:
评论

相关推荐

    nutch爬虫资料

    Nutch是一款开源的网络爬虫项目,主要用于抓取和索引互联网上的网页内容。它由Apache软件基金会开发,是Hadoop大数据生态系统的一部分,利用Java语言编写。本资料包围绕Nutch爬虫,提供了相关的参考书籍和源代码分析...

    nutch 爬虫数据nutch 爬虫数据nutch 爬虫数据nutch 爬虫数据

    1. **种子URL生成**:爬虫的起点是种子URL列表,这些URL决定了Nutch将首先访问哪些网站。用户可以自定义种子URL,或者从已有的列表导入。 2. **发现阶段**:Nutch 使用HTTP协议向种子URL发起请求,获取网页内容。...

    nutch乱码BUG修正

    本篇将深入探讨Nutch乱码的问题,以及如何进行修复。 乱码通常发生在以下几个阶段:网页抓取、解析HTML、存储和检索索引。Nutch默认使用UTF-8编码,但如果网页或数据库的编码与之不匹配,就会出现乱码现象。 1. **...

    nutch部分网页乱码BUG修正

    然而,在实际使用过程中,由于编码问题,Nutch可能会出现部分网页乱码的情况。本篇文章将深入探讨这个问题,并提供具体的代码修复方案。 网页乱码通常是由于字符编码不匹配导致的。在Nutch中,当它抓取到不同编码...

    nutch爬虫系统分析.doc

    nutch爬虫系统分析 Nutch爬虫系统是基于Java语言开发的一款开源网络爬虫框架,旨在提供一个灵活、可扩展、可靠的爬虫解决方案。下面是对Nutch爬虫系统的分析。 Nutch简介 Nutch是一款基于Java语言开发的网络爬虫...

    Nutch爬虫工作流程及文件格式详细分析.doc

    - Nutch遵循Robots Exclusion Protocol,尊重网站通过Robots.txt设置的抓取规则。 3. **更新WebDB**: - 抓取的网页会被处理并存储在Segment中。每个Segment代表一次抓取周期的结果,按时间命名以便管理。 - ...

    nutch爬虫+java+eclipse

    Nutch使用Hadoop进行分布式处理,能够处理海量数据,适合大型网站的爬取需求。 1.1 URL管理和调度:Nutch使用URL数据库存储待抓取的网页,并通过一个策略算法(如FIFO或Priority Queue)决定下一个要抓取的URL。 ...

    nutch 爬到的CSDN数据 nutch crawl

    当你提到“nutch 爬到的 CSDN 数据”,这意味着有人或某个项目使用 Nutch 抓取了 CSDN 网站上的信息。 **Nutch 爬虫的基本工作流程:** 1. **种子列表生成**:爬虫开始时需要一份种子URL列表,这些是爬虫首先访问的...

    nutch爬虫说明文档

    对于内部网爬行,Nutch 提供了一个简单的 `crawl` 命令,适合抓取特定的少数网站。你只需要指定初始的URL列表,Nutch 就会按照预定的深度和范围进行抓取。 **互联网爬行** 对于全面的互联网爬行,Nutch 使用一组...

    Nutch爬虫工作流程及文件格式详细分析

    在抓取过程中,Nutch遵循Robots Exclusion Protocol,尊重网站的robots.txt文件,避免对同一主机的过度抓取。 在Nutch中,Crawler的操作是通过一系列子命令执行的: 1. 使用`admin db -create`创建一个新的WebDb。...

    nutch网页爬取总结

    5. **安全抓取**:Nutch 可以遵循 robots.txt 规则,尊重网站的抓取限制,避免对目标网站造成压力。 Nutch 的强大之处在于其模块化的设计,允许用户根据实际需求定制和扩展。通过熟练掌握 Nutch 的使用,你可以建立...

    学习lucene和nutch爬虫代码

    6. **更新与重爬(Crawling)**:Nutch会定期检查已爬取的页面是否发生变化,如果发现变化,则重新抓取并更新索引。 **Nutch与Lucene的结合** Nutch利用Lucene的强大索引和搜索能力,实现了从网页抓取到搜索结果...

    nutch中文分词

    nutch应用,nutch中文分词,nutch中文乱码

    大学毕设论文--nutch爬虫系统分析设计论文.doc

    Nutch爬虫系统分析设计论文 Nutch爬虫系统是当前最流行的开源爬虫系统之一,广泛应用于搜索引擎、数据挖掘、文本分析等领域。本文将对Nutch爬虫系统进行详细的分析和设计,介绍Nutch的体系结构、抓取部分、配置文件...

    nutch日常监控网站

    关于nutch爬虫一些需要监测的网站,为舆情系统或者监控系统或者全控媒体系统做数据的支撑。

    nutch爬虫系统分析报告.doc

    nutch爬虫系统分析报告.doc

    nutch爬虫系统分析设计论文.doc

    Nutch 爬虫系统分析设计论文 Nutch 是一个开源的网页爬虫系统,主要用于从互联网上爬取大量的网页数据,并对其进行处理和存储。该系统的设计目的是为了满足高效、可扩展和可靠的网页爬取需求。 Nutch 体系结构 ...

    毕业论文-nutch爬虫系统分析.doc

    Nutch 是一个开源的Web爬虫系统,专为大规模网络数据收集而设计,它被广泛应用于搜索引擎、学术研究以及大数据分析等领域。这篇毕业论文详细分析了Nutch爬虫系统的各个方面,旨在深入理解其工作原理和架构。 1. ...

    nutch1.7 爬虫

    一个已经部署好的 nutch1.7爬虫。 导入到 eclipse里面就能用了。假如不能用的话。 还是装个cygwin 吧 找到org.apache.nutch.crawl.Crawl 这个类。 run configuration 在 Programa argument 里面 输入 crawl urls -...

Global site tag (gtag.js) - Google Analytics