在centos搭建网络爬虫与搜索引擎环境nutch2.3.1+mysql5.5/hadoop与hbase+solr4.6最佳实践
nutch是Apache组织研发的一款开源的搜索引擎项目(网络爬虫),纯java实现,它提供了构建一个搜索引擎所需要的全部工具和功能。使用Nutch不仅可以建立自己内部网的搜索引擎,同时也可以针对整个网络建立搜索引擎。除了基本的功能之外,Nutch也还有不少自己的特色,如支持Hadoop框架执行真正大数据处理等。
开源算法更加透明, 排名结果更值得大家信赖,使用nutch可以做到:
* 每个月取几十亿网页
* 为这些网页维护一个索引
* 对索引文件进行每秒上千次的搜索
* 提供高质量的搜索结果
Nutch的总体结构
Nutch从总体上看来,分为三个主要的部分:爬行、索引和搜索,各部分之间的关系如图1所示。Web db是Nutch初始运行的URL集合;Fetcher是用来抓取网页的爬行器,也就是平时常说的Crawler;indexer是用来建立索引的部分,它将会生成的索引文件并存放在系统之中;searcher是查询器,用来完成对某一词条的搜索并返回结果。
图 1. Nutch 总体结构
Nutch 的运行流程
在了解了 Nutch 的总体结构之后,再详细的看看 Nutch 具体是如何运行的?Nutch 的运行流程如图2所示。
1. 将起始 URL 集合注入到 Nutch 系统之中。
2. 生成片段文件,其中包含了将要抓取的 URL 地址。
3. 根据URL地址在互联网上抓取相应的内容。
4. 解析所抓取到的网页,并分析其中的文本和数据。
5. 根据新抓取的网页中的URL集合来更新起始URL集合,并再次进行抓取。
6. 同时,对抓取到的网页内容建立索引,生成索引文件存放在系统之中。
图 2. Nutch 的运行流程
安装nutch2.3.1,先安装ant:
配置ant:
执行vi /etc/profile
使环境变量生效:
剔除多余的openjdk:
前面使用yum安装的ant版本太老,删除之:
安装1.9.7 ant:
添加执行权限,并检查是否安装成功:
下面开始配置和编译nutch2.3:
ftp上传到指定目录,然后配置NUTCH_HOME
配置mysql支持:[root@imagehost apache-nutch-2.3.1]# vi ivy/ivy.xml
条目1原来对应的是0.6.1,为了使用sql统计必须退回0.2.1(对于个人用户来说,mysql足够了,hbase什么的不是个人能负担的起的)。
配置数据库连接:
[root@imagehost apache-nutch-2.3.1]# vi conf/gora.properties
修改ddl映射配置
[root@imagehost conf]# vi gora-sql-mapping.xml
修改nutch-site.xml
添加蜘蛛名称:
为了防止网页的反爬虫机制,可以设置名称为某个浏览器的useragent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:48.0) Gecko/20100101 Firefox/48.0
找到并添加内容:
防止爬去网页时报错,添加如下:
配置完毕,开始编译nutch:
出现上面的错误,需要加入jar:
下载sonar-ant-task-2.2.jar,将其拷贝到nutch2.3/lib 目录下面
修改build.xml,引入上面添加的jar包:
<!– Define the Sonar task if this hasn’t been done in a common script –>
<taskdef uri=”antlib:org.sonar.ant” resource=”org/sonar/ant/antlib.xml”>
<classpath path=”${ant.library.dir}” />
<classpath path=”${mysql.library.dir}” />
<classpath><fileset dir=”./lib/” includes=”sonar*.jar” /></classpath>
</taskdef>
漫长的等待。。。(如果长时间没反应,就kill掉重新来过)
直接执行ant,,等待几分钟后激动人心的:
终于成功了:
验证安装成功:
cd ${NUTCH_HOME}/runtime/local
nutch命令对应的java类:
inject=org.apache.nutch.crawl.InjectorJob
hostinject=org.apache.nutch.host.HostInjectorJob
generate=org.apache.nutch.crawl.GeneratorJob
fetch=org.apache.nutch.fetcher.FetcherJob
parse=org.apache.nutch.parse.ParserJob
updatedb=org.apache.nutch.crawl.DbUpdaterJob
updatehostdb=org.apache.nutch.host.HostDbUpdateJob
readdb=org.apache.nutch.crawl.WebTableReader
readhostdb=org.apache.nutch.host.HostDbReader
elasticindex=org.apache.nutch.indexer.elastic.ElasticIndexerJob
solrindex=”org.apache.nutch.indexer.IndexingJob -D solr.server.url=$1″
index=org.apache.nutch.indexer.IndexingJob
solrdedup=org.apache.nutch.indexer.solr.SolrDeleteDuplicates
solrclean=”org.apache.nutch.indexer.CleaningJob -D solr.server.url=$2 $1″
clean=org.apache.nutch.indexer.CleaningJob
parsechecker=org.apache.nutch.parse.ParserChecker
indexchecker=org.apache.nutch.indexer.IndexingFiltersChecker
plugin=org.apache.nutch.plugin.PluginRepository
webapp=org.apache.nutch.webui.NutchUiServer
nutchserver=org.apache.nutch.api.NutchServer
junit=org.junit.runner.JUnitCore
对于nutch中文乱码的处理:conf/gora.properties:注意所有配置文件必须另存为utf8格式,否则后面有空格
gora.sqlstore.jdbc.driver=com.mysql.jdbc.Driver
gora.sqlstore.jdbc.url=jdbc:mysql://localhost:3306/nutch? useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull
gora.sqlstore.jdbc.user=devuser
gora.sqlstore.jdbc.password=devuser
webpage字段的含义:
id
主键,根据网页url生成(格式:reversed domain name:protocol:port and path),因此,Nutch2只能保存当前网页的状态,而不能保存历史信息。
headers
标准的http headers ,其中包含非打印字符。Last-Modified 等信息可能于判断网页是否需要更新(仅需发一个head请求,而不是下载整个网页)
text
合并了解析出来的所有文本字段(utf-8),用于普通的检索,不过现在检索一般使用solr,所以这个字段意义不大。
status
记录抓取状态
1 unfetched
(links not yet fetched due to limits set in regex-urlfilter.txt, -TopN crawl parameters, etc.)
(由于regex-urlfilter.txt,-TopN参数的限制等原因,尚未提取)
2 fetched (page was successfully fetched) (页面成功提取)
3 gone (that page no longer exists) (该网页已不存在)
4 redir_temp (temporary redirection — see reprUrl below for more details) (临时重定向)
5 redir_perm (permanent redirection — see reprUrl below for more details) (永久重定向)
34 retry (重试)
38 not modified (没有修改)
markers
各个任务的标记(如:dist***injmrk_***updmrk_***ftcmrk_***gnmrk_***prsmrk_**)
parseStatus
parse状态,在执行parseJob之前都是NULL。 ParseStatusCodes.html
modifiedTime
最后更改时间
score
网页重要程度(PR),Nutch2.2.1 使用的是OPIC算法
typ
类型(如application/xhtml+xml)
batchId
批次ID,由generate生成( (curTime/1000) + “-” +randomSeed ), fetch时可选择特定batchId的任务
baseUrl
用于将网页源码中相对链接地址的转为绝对地址,通常就是当前网页的地址,有重定向的情况下,是最终定向到的地址
content
完整的网页源码,未经任何处理(字符集也没转)。
title
title标签里的内容 (已转utf-8编码)
reprUrl
重定向url,将在下一轮抓取,不会立即跟入
fetchInterval
抓取间隔,默认是2592000(30天)
prevFetchTime
上次抓取时间
inlinks
入链(url+linktext)
prevSignature
上次更新时网页签名
outlinks
出链(url+linktext)
fetchTime
下次抓取时间,通常是间隔一个月
retriesSinceFetch
重试次数
protocolStatus
ACCESS_DENIED 17
BLOCKED 23
EXCEPTION 16
FAILED 2
GONE 11
MOVED 12
NOTFETCHING 20
NOTFOUND 14
NOTMODIFIED 21
PROTO_NOT_FOUND 10
REDIR_EXCEEDED 19
RETRY 15
ROBOTS_DENIED 18
SUCCESS 1
TEMP_MOVED 13
WOULDBLOCK 22
signature
网页签名,用于判断网页是否改变,默认的实现是:org.apache.nutch.crawl.MD5Signature ,采用content的MD5值,另一个方案是org.apache.nutch.crawl.TextProfileSignature,content抽取文本、分词、排序等一系列操作后计算MD5值 TextProfileSignature
metadata
自定义元数据,可以在种子文件里面加,例如: https://xxxx/xxx.html \t type=news
下载solr4.6:wget https://archive.apache.org/dist/lucene/solr/4.6.1/solr-4.6.1.tgz
解压到指定目录,设定solrhome=/usr/local/solr-4.6.1/example
将NUTCH_DIR/conf/schema-solr4.xml
拷贝到solrhome/solr/collection1/conf/
,重命名为schema.xml,并在标签<fields>...</fields>
最后添加一行(具体解释见Solr 4.2 – what is _version_field?),
<field name="_version_" type="long" indexed="true" stored="true" multiValued="false"/>
重启Solr,
# Ctrl+C to stop Solr
java -jar start.jar
第7步和第8步也和Nutch 1.7那篇博客中的7、8步很类似。主要区别在于,Nutch 2.x的所有数据,不再以文件和目录的形式存放在硬盘上,而是存放到HBase(mysql是mysql对应的数据库)里。
启动
[root@imagehost example]# echo ‘nohup java -jar start.jar &’ > startSolr.sh
日志显示server端口为8983,浏览器访问:
执行抓取命令:
solr后台:
crawl爬行日志:
配置hbase:
先要设置免密码登录,这是为了实现hadoop分布式自动化处理的需要:
配置ssh免密码登录(三个节点m1、s1、s2)
主节点配置:
- 首先到用户主目录(cd ~),ls -a查看文件,其中一个为“.ssh”,该文件价是存放密钥的。待会我们生成的密钥都会放到这个文件夹中。
- 现在执行命令生成密钥: ssh-keygen -t rsa -P “” (使用rsa加密方式生成密钥)回车后,会提示三次输入信息,我们直接回车即可。
- 进入文件夹cd .ssh (进入文件夹后可以执行ls -a 查看文件)
- 将生成的公钥id_rsa.pub 内容追加到authorized_keys(执行命令:cat id_rsa.pub >> authorized_keys)
从节点配置:
- 以同样的方式生成秘钥(ssh-keygen -t rsa -P “” ),然后s1和s2将生成的id_rsa.pub公钥追加到m1的authorized_keys中)
- 在s1中执行命令:scp id_rsa.pub m1:/root/.ssh/id_rsa.pub.s1 ,在s2中执行命令:scp id_rsa.pub m1:/root/.ssh/id_rsa.pub.s2
- 进入m1执行命令:cat id_rsa.pub.s1 >> authorized_keys ,cat id_rsa.pub.s1 >> authorized_keys
- 最后将生成的包含三个节点的秘钥的authorized_keys 复制到s1和s2的.ssh目录下( scp authorized_keys s1:/root/.ssh/, scp authorized_keys s2:/root/.ssh/)
验证ssh免密码登录
- 输入命令ssh localhost(主机名) 根据提示输入“yes”
- 输入命令exit注销(Logout)
- 再次输入命令ssh localhost即可直接登录
。。。此处省略hbase配置。。
注意先启动hadoop,再启动hbase,关闭时相反。
应该先配置hadoop,hadoop启动前执行:
bin/hadoop namenode -format
在hadoop_home/etc/haddop/下设置env.sh的java_Home参数为绝对路径,然后执行启动命令:
启动hbase,登录主页查看
不能加载native lib的老问题,开启debug后日志显示,当前glibc版本低于要求的。
升级2.12.1提示当前assemer too old,只好选择较低版本的升级。。。。
使用centos 7 没有glibc库的问题,直接使用native。
nutch2.3.1编译完成后,一定要把habase lib下的所有以hbase开头的18个jar包覆盖到nutch /runtime/local/lib下,这是hbase的驱动。
打开hbase shell模式:
执行:./crawl ../urls/ udast https://localhost:8983/solr 2
开始抓取:
速度好像有点太快:
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《在centos搭建网络爬虫与搜索引擎环境nutch2.3.1+mysql5.5/hadoop与hbase+solr4.6最佳实践》
本文地址:http://www.xiupu.net/archives-8241.html
关注公众号:
微信赞赏
支付宝赞赏