今天使用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是一款开源的网络爬虫项目,主要用于抓取和索引互联网上的网页内容。它由Apache软件基金会开发,是Hadoop大数据生态系统的一部分,利用Java语言编写。本资料包围绕Nutch爬虫,提供了相关的参考书籍和源代码分析...
1. **种子URL生成**:爬虫的起点是种子URL列表,这些URL决定了Nutch将首先访问哪些网站。用户可以自定义种子URL,或者从已有的列表导入。 2. **发现阶段**:Nutch 使用HTTP协议向种子URL发起请求,获取网页内容。...
本篇将深入探讨Nutch乱码的问题,以及如何进行修复。 乱码通常发生在以下几个阶段:网页抓取、解析HTML、存储和检索索引。Nutch默认使用UTF-8编码,但如果网页或数据库的编码与之不匹配,就会出现乱码现象。 1. **...
然而,在实际使用过程中,由于编码问题,Nutch可能会出现部分网页乱码的情况。本篇文章将深入探讨这个问题,并提供具体的代码修复方案。 网页乱码通常是由于字符编码不匹配导致的。在Nutch中,当它抓取到不同编码...
nutch爬虫系统分析 Nutch爬虫系统是基于Java语言开发的一款开源网络爬虫框架,旨在提供一个灵活、可扩展、可靠的爬虫解决方案。下面是对Nutch爬虫系统的分析。 Nutch简介 Nutch是一款基于Java语言开发的网络爬虫...
- Nutch遵循Robots Exclusion Protocol,尊重网站通过Robots.txt设置的抓取规则。 3. **更新WebDB**: - 抓取的网页会被处理并存储在Segment中。每个Segment代表一次抓取周期的结果,按时间命名以便管理。 - ...
Nutch使用Hadoop进行分布式处理,能够处理海量数据,适合大型网站的爬取需求。 1.1 URL管理和调度:Nutch使用URL数据库存储待抓取的网页,并通过一个策略算法(如FIFO或Priority Queue)决定下一个要抓取的URL。 ...
当你提到“nutch 爬到的 CSDN 数据”,这意味着有人或某个项目使用 Nutch 抓取了 CSDN 网站上的信息。 **Nutch 爬虫的基本工作流程:** 1. **种子列表生成**:爬虫开始时需要一份种子URL列表,这些是爬虫首先访问的...
对于内部网爬行,Nutch 提供了一个简单的 `crawl` 命令,适合抓取特定的少数网站。你只需要指定初始的URL列表,Nutch 就会按照预定的深度和范围进行抓取。 **互联网爬行** 对于全面的互联网爬行,Nutch 使用一组...
在抓取过程中,Nutch遵循Robots Exclusion Protocol,尊重网站的robots.txt文件,避免对同一主机的过度抓取。 在Nutch中,Crawler的操作是通过一系列子命令执行的: 1. 使用`admin db -create`创建一个新的WebDb。...
5. **安全抓取**:Nutch 可以遵循 robots.txt 规则,尊重网站的抓取限制,避免对目标网站造成压力。 Nutch 的强大之处在于其模块化的设计,允许用户根据实际需求定制和扩展。通过熟练掌握 Nutch 的使用,你可以建立...
6. **更新与重爬(Crawling)**:Nutch会定期检查已爬取的页面是否发生变化,如果发现变化,则重新抓取并更新索引。 **Nutch与Lucene的结合** Nutch利用Lucene的强大索引和搜索能力,实现了从网页抓取到搜索结果...
nutch应用,nutch中文分词,nutch中文乱码
Nutch爬虫系统分析设计论文 Nutch爬虫系统是当前最流行的开源爬虫系统之一,广泛应用于搜索引擎、数据挖掘、文本分析等领域。本文将对Nutch爬虫系统进行详细的分析和设计,介绍Nutch的体系结构、抓取部分、配置文件...
关于nutch爬虫一些需要监测的网站,为舆情系统或者监控系统或者全控媒体系统做数据的支撑。
nutch爬虫系统分析报告.doc
Nutch 爬虫系统分析设计论文 Nutch 是一个开源的网页爬虫系统,主要用于从互联网上爬取大量的网页数据,并对其进行处理和存储。该系统的设计目的是为了满足高效、可扩展和可靠的网页爬取需求。 Nutch 体系结构 ...
Nutch 是一个开源的Web爬虫系统,专为大规模网络数据收集而设计,它被广泛应用于搜索引擎、学术研究以及大数据分析等领域。这篇毕业论文详细分析了Nutch爬虫系统的各个方面,旨在深入理解其工作原理和架构。 1. ...
一个已经部署好的 nutch1.7爬虫。 导入到 eclipse里面就能用了。假如不能用的话。 还是装个cygwin 吧 找到org.apache.nutch.crawl.Crawl 这个类。 run configuration 在 Programa argument 里面 输入 crawl urls -...