爬虫之nutch


此处简介

这阵子主要研究的爬虫方向,主要以java为语言基础,nutch为自动框架,jsoup作为自主爬虫插件开发基础,进行了一些有针对性的实站,在这些过程中,也遇到了一些问题和心得,觉得有必要总结一下

爬虫之nutch

nutch使用体验与感悟

在这里之所以以nutch开篇,因为在接触爬虫之前就一直有听过它的大名,知道它是我们java语言栈中的爬虫利器,而且因为它,诞生了hadoop这一重器,后者在如今天大数据技术圈的名头,应该是无人不晓吧。所以,多种因素的促使下,让我入了nutch的坑。而本文虽是不仅针对nutch的总结,但主要还是以nutch为主。

经过一阵的实际体验,nutch给我的感觉,老实说确实是强,百科中说nutch的目的是“Nutch 致力于让每个人能很容易, 同时花费很少就可以配置世界一流的Web搜索引擎. 为了完成这一宏伟的目标, Nutch必须能够做到”,能有这么宏伟的目标,自然得有相应的实力来支撑。但就我体验来说,它确实是强,经过简单的配置后,几个简单的指令就能对页面进行抓取,但我觉得也有几个比较明显的让人体验不太好的地方

  1. 对动态生成的网页内容的抓取不理想,或要通过其它的插件,但插件的引入也不如想像般顺利
  2. 版本太多,且很多版本之间的差异明显。在后面会尝试说明一下。
  3. 资料太少,有很多场景国外都没有有效的解决策略(公网检索下),国内环境就更差了,为了搜集资料我多次去过国家图书馆,逛过书店等,都没太找到特别详尽且有针对性的资料,所以nutch的整个踩坑过程是很痛苦的,我后面会将我目前调使的nutch抓取服务配置和一些踩坑进行详细的总结,我觉得,就我之前对网上的搜集资料的掌握的情况来看,接下来我给出的总结,或者能带来一些更可靠的价值。
    综上,我对nutch的感悟是又爱又恨。爱得是它确实是能很便利的帮忙爬取一些东西,恨的是它又不完全是那么便利

nutch搭建与踩坑回顾

前文中已经提到过nutch有很多版本,目前最新版本2.3.1,它的多个版本间是有很多差异的,比如1.X的版本间的持久层是没有抽象出来的,所以1.X版本的持久化形式比较单一。而2.X版本中持久层被抽象出来,通过一不同的配置即可实现多元的持久层存储。如mysql、hbase、avro等。但在2.3.X开始就不支持mysql,官网是明确公示过,或者说从2.2.X开始就不支持了,但就实际操作来看2.2.X还是能适配mysql的,而2.3.X在我的实际操作中是不行的。另在这里说一下,我的持久层主要以mysql为主,后面可能还会再试试hbase,而一开始不采用hbase不是我没尝试,而是尝试过,发现nutch目前适配的hbase版本太低,而我服务器上已经搭建的hbase集群环境的版本相对高了不少,无法适配。我想没有必要为此就针对hbase的版本进行更替,所以采用mysql作为持久层,这是坑一
在使用nutch之前,对其是一点都不了解的,或者说对爬虫需求也都是不熟悉的。所以,对其的功能是寄于厚望,一开始就配一个网站的首页url,就设置多线程,多层抓取。但经过多次实站后,发现有些网站中一部份或大部份都不能抓取。再随着深入观察发现,很多是动态生成的内容。更甚者,有些内容的加载是页面加载后,再发送ajax来加载页面的一些关键内容。而原本考虑nutch是支持插件扩展的,原想直接通过检索,求助于互联网,希望直接就能找到一款ajax扩展的插件,然而,几经周折,都未成行。这是坑二

其它还有一些小坑,具体我在下面搭建环节具体结细节处再提,虽小,但影响也挺大,而且比较坑人。以上都是主要通过人力暂未能直接解决的坑。所以先列出来,下面,我回顾下我的nutch搭建环节,其中会给出一些小坑与相应的解决方案

搭建

nutch的搭建分为分布式与单机版,我目前主要涉猎的是nutch单机版。具体的版本选择,我尝试过nutch1.2与nutch1.7以上的所有版本,1.X与2.X的主要差异在于2.X将持久层给抽象出来了。总得来说nuthc2.x的实用性相对高些。而我以我目前具体使用的版本2.2.1为例,进行介绍
step 1.获取nutch2.2.1 http://archive.apache.org/dist/
这个url能定位到apache很多软件和历史版本。进入这里,然后找到nutch,下载相应的版本(该连接有时可能打不开,翻墙试试)。
step 2. 对ivy下的ivy.xml与ivysetting.xml进行修改。
这里就有之前提到的坑一了,这里可能配置对持久层的依赖了。我这以mysql配置。

修改${APACHE_NUTCH_HOME}/ivy/ivy.xml文件

将以下行的注释取消

org=”mysql” name=”mysql-connector-java” rev=”5.1.18″ conf=”*->default”/>

修改以下行。从默认的
org="org.apache.gora" name="gora-core" rev="0.3" conf="*->default"/>
改成
org="org.apache.gora" name="gora-core" rev="0.2.1" conf="*->default"/>

取消以下行的注释
org="org.apache.gora" name="gora-sql" rev="0.1.1-incubating" conf="*->default" />

如果按默认的不做修改,将会在抓取网页时遇到以下错误。

e8f001bf53174dd985d3ffd36c6fb32d-image.png

然后配置ivysetting.xml,这个文件类似maven的.setting.xml文件,主要修改相应的软件仓库源,默认地址可能会出现下载缓慢的情况,建议换成国内源,贴一个我配的阿里的。
ffc49faa6d304b2694313bd5c206ee94-image.png

速度杠杠的。
这时就可以进行编译了,通过终端进nutch文件地址进执行ant

然后配置持久层的配置文件,gora.properties
33e8c343b9854449897c28dd5177409f-image.png

接下来配另mysql的映射文件gora-sql-mapping.xml,可以这么说,这个地方出现的坑是我遇到的坑最多的地方之一。因为我是事后总结,平日也有工任务,所以,在出现坑的时侯,我首要的考虑的是解决的它,所以解决这些问题后,可能能记得是大致是什么状况,但无法具体复现,我在这以总结,提练式的对这些小坑进行叙述,就不贴具体的错误日志了。

首先,文件中的默认配置id的大小是512.这个对于以unicode,准确的说以utf8为编码格式的mysql来说是过长的,会在inject就报sql初始化错误,id too long
解决方式
将id的长度改小,我设置的是180,nutch默认一般以target url拼接成id,所以一般来讲,180的id是妥妥够用的。

类似的问题还会出现一些如text ,content过长的问题,初次搭建我这先建议改小试试,后面还有根治的方式。

修改了gora-sql-mapping.xml文件后,执行抓取指令,以bin/nutch crawl urlfile -threads number -deepth num 这是nutch 普遍用的一个指行指令,这个指令执行时会默认将数据持久化到webpage的表中,这种方式缺点是不太灵活,复杂任务的时候不好操作。

另一种bin/crawl urlfile -crawlId name (这个name会作为对应的表名组成部份) “solrrl” “num”用于指定解析程度
这种方式相对而言更灵活,后面我主要采用这种方式。这里有个小细节,bin/crawl 这个脚本是可以尝试更改的,它默认执行任务时只创建了50,而这种方式无法像上面那样指定创建线程数,所以我更改了crawl文件的初始值,将参数调值2000.所以可以根据自己需求,酌情更改。

bin/nutch parse 有些fetch 任务执行完成后,parse数据同步至数据库时可能会产生一些错误,那么可以通过这个指令尝试进行解析。
示例:bin/nutch parse -crawlId name -all
这里容易出现前面提到过的一个问题,就是在解析时,content 或text 中的内容格式不对,或text 内容中出现在了emoji等情况,都可能使解析任务中断。我经过一翻调整,算是有一个统一解决方案:在这里贴出来参考
1、将数据库编码格式设置为utf8mb4;
2、将text和content的gora-mapping.xml文件中添加jdbc-type=“text” 或jdbc-type=”blob”的设置,即指明其数据库中对应的类型,避免长度等问题
3、上两者结合的一个情况,text存入文中的内容有编码格式,相对读取轻松,blob以二进制形式存放,取值需要转码,所以在不出错的情况下优先设为text,而这时,数据库设为utf8mb4时就不要在jdbc url 中设置utf8格式了,这样反而会出现问题。
ae5a036dcc9c45a29fdfa0ed2d345eca-image.png

至此 nutch日常的主要使用指令就这两个,还有些 如果bin/nutch fetch bin/nutch gernate
这些相对出错较少,出错的影响和对策网上也相对较多,就不再缀述了。


至此爬虫服务的总结就要告一段落了,这篇文章体量相对较大,我是断断续续逐步完成的,所以,后面更多是凭回忆出的之前深刻影响且在网上少有明确解决方案的一些问题,给出我的解决方式,所以,如果这篇总结针对的算是nutch使用过程中,尝试更进一步的助力,而非特别基础的。如果看到此篇文章的你对nutch还有其它的一些问题,可以尝试留言,我们一起探讨。


Author: Kuiq Wang
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Kuiq Wang !
  TOC