[置頂] Nutch2.3.1 新聞分類爬蟲


Contents

項目介紹

本項目基於https://github.com/xautlx/nutch-ajax.git,xautlx的nutch-ajax項目功能很強大,本項目在此基礎上,對nutch-ajax項目做了一些精簡和優化,對Nutch版本進行升級,引入Mybatis進行數據存儲層處理,使用清華大學自然語言處理實驗室推出的中文文本分類工具包來做文本分類的工作,形成一個可以對新聞進行分類的爬蟲。在解決了一些jar包沖突問題后,使得本項目可以在ide、單機、偽分布式、完全分布式環境下都可以運行。對本項目中的訓練模型文件進行替換,可以很容易實現一個分布式主題爬蟲系統。對xautlx在我開發過程中提供的幫助在此一並謝過。

配置文件

下載下來代碼后進入apache-nutch-2.3.1目錄,項目默認的mongodb、mysql、solr都是本地配置的,如果不是在本地配置的,則需要修改配置文件。
mongodb的配置文件在conf/gora.properties中,如果mongodb不是在本地配置的,則把localhost換成mongodb所在機器的ip即可

############################
# MongoDBStore properties #
############################
gora.datastore.default=org.apache.gora.mongodb.store.MongoStore
gora.mongodb.override_hadoop_configuration=false
gora.mongodb.mapping.file=/gora-mongodb-mapping.xml
gora.mongodb.servers=localhost:27017
gora.mongodb.db=nutchFocuse
#gora.mongodb.login=login
#gora.mongodb.secret=secret

mysql配置項在conf/mybatis-config.xml中,修改為你自己的mysql配置即可

<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/nutchClassify"/>
<property name="username" value="lq"/>
<property name="password" value="123456"/>
</dataSource>

solr的配置在conf/nutch-site.xml文件中,如果把“solr.server.url”屬性配置為空,則不進行索引

<!--可基於Solr實際配置運行地址配置此參數-->
<property>
<name>solr.server.url</name>
<value>http://localhost:8080/solr</value>
</property>

在conf目錄下新增了svmmodel文件夾,主要用於存儲THUCTC訓練的分詞模型。
新增crawl-data-mapper.xml文件,為mybatis的mapper.xml文件
新增mybatis-config.xml文件,用於配置mybatis的數據源

本地抓取

修改完配置后,直接ant clean,ant,第一次ant時間會很長,耐心等待就好

ant clean

ant成功后如下圖所示:

ant

我設置的種子URL是一些與體育相關的主題新聞網站,urls/seed.txt文件內容如下

#新浪體育
http://sports.sina.com.cn/
#搜狐體育
http://sports.sohu.com/
#騰訊體育
http://sports.qq.com/
#網易體育
http://sports.163.com/

然后輸入

lq-pcdeMacBook-Pro:apache-nutch-2.3.1 lq$ runtime/local/bin/crawl urls test 1

開始本地抓取。抓取截圖如下,開始抓取:

開始抓取

抓取結束:

抓取結束

最后打開solr界面可以查詢到剛才添加的索引,通過設置查詢條件可以對新聞的類別和內容進行索引,如下圖所示:
不設置查詢條件,查詢所有記錄

不設置查詢條件

設置查詢條件:content:手機

content:手機
設置查詢條件:category:財經

category:財經

由於分類選擇的語料(訓練集)是新浪新聞RSS訂閱頻道2005~2011年間的歷史數據,已經比較老了,所以用來對現在的新聞分類效果可能不是很好。具體可以參見THUCTC:http://thuctc.thunlp.org/

如果不需要使用索引,把conf/nutch-site.xml中的solr.server.url,設置為空即可抓取過程中,url使用mongodb存儲,數據庫配置參見apache-nutch-2.3.1/conf/gora.properties抓取的內容使用mysql存儲,具體配置參見conf/nutch-site.xml文件以jdbc.開頭的屬性
mysql建表語句:

CREATE DATABASE nutchClassify DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `crawl_data` (
`url` text NOT NULL,
`content` varchar(255) NOT NULL,
`category` varchar(45) NOT NULL,
`fetch_time` varchar(45) NOT NULL,
`id` varchar(255) NOT NULL,
`relevance_score` double NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Mysql數據庫截圖,由於給的都是跟體育相關的優秀種子網站,所以分類效果還是很不錯的。

mysql截圖

分布式環境配置

如果網頁的爬取過程中不需要ajax支持,那么直接運行是沒有問題的,修改conf/nutch-site.xml中的plugin.includes屬性使用nutch自帶的插件protocol-http。每次修改配置文件后,需要重新ant打包。如果要支持ajax,就要對hadoop進行修改。因為selenium和htmlunit需要httpclient4.3,httpcore-4.3以上的版本,然而apach-nutch-2.3.1官方建議使用的是Apache Hadoop 1.2.1 and 2.5.2,這兩個我都試過,用1.2.1需要修改更多的jar包,包括升級log4j等,不建議使用hadoop-1.2.1,目前我使用的是hadoop-2.5.2,它自帶的是httpclient-4.2.5.jar,httpcore-4.2.5.jar,分布式環境運行的時候會加載hadoop-2.5.2/share/hadoop/common/lib這下面的jar包,這樣會出現很多稀奇古怪的錯誤,由於我對hadoop本身沒有任何研究,所以我索性將hadoop-2.5.2/share/hadoop/common/lib下的httpclient和httpcore進行升級,升級為對應selenium和htmlunit需要的httpclient和httpcore版本。
正如官網所說,建議所有的開發者和用戶都升級到2.3.1,這點我很能理解,因為之前的2.3別說分布式了,就算是單機腳本都很難跑起來,bug多的飛起。

nutch

分布式抓取前首先把種子url目錄加入hdfs

lq@RfidLabMaster:~/Nutch-NewsClassify/apache-nutch-2.3.1$ hdfs dfs -rm -r /urls/seed.txt

運行分布式命令:

nohup runtime/deploy/bin/crawl  /urls test 1 > crawlLog 2>&1 &

一段時間后出現”Done”,表示執行完畢,也可以通過查看crawlLog文件看當前執行的情況

lq@RfidLabMaster:~/Nutch-NewsClassify/apache-nutch-2.3.1$ 
[1]+ Done nohup runtime/deploy/bin/crawl /urls test 1 > crawlLog 2>&1

可以通過訪問鏈接:http://rfidlabmaster:50070/logs/userlogs/ 來查詢運行日志

開發環境配置

下載下來代碼后進入apache-nutch-2.3.1目錄,
修改配置文件,conf/nutch-site.xml把以下內容取消注釋

<property>
<name>plugin.folders</name>
<value>./src/plugin</value>
</property>

然后在該目錄下執行ant clean,ant,ant eclipse,然后打開intellij idea import Project->選擇apache-nutch-2.3.1目錄->import project from external model(選擇eclipse),之后一路next即可。

用idea打開工程后需要調整依賴順序
1.前三個依賴順序為conf,Module source,1.8(jdk)

依賴圖1
2.將parse-lq調整到lucene開頭的jar包之前

依賴圖2
3.需要對哪個plugin進行開發,就選中plugin/src下的java文件夾,然后右鍵Mark Directory As –>Sources Root,完成以上步驟就可以開始愉快的進行開發了。

4.由於nutch2.x后取消了crawl類,我把crawl腳本“直譯”成了一個java類來方便調試,org.apache.nutch.crawl.Crawl.java

solr 4.10.3配置

  1. 下載安裝solr
    在我的home目錄(/home/lq)已經安裝了apache-tomcat-8.0.29,在/home/lq目錄下下輸入
wget archive.apache.org/dist/lucene/solr/4.10.3/solr-4.10.3.tgz

輸出如下所示

[lq@lq-ALiYun ~]$ ls -l
總用量 40
drwxr-xr-x 9 lq lq 4096 213 05:49 apache-tomcat-8.0.29
-rw-rw-r-- 1 lq lq 34420 33 17:43 deploy.log
[lq@lq-ALiYun ~]$ pwd
/home/lq
[lq@lq-ALiYun ~]$ wget archive.apache.org/dist/lucene/solr/4.10.3/solr-4.10.3.tgz
--2016-03-18 21:13:08-- http://archive.apache.org/dist/lucene/solr/4.10.3/solr-4.10.3.tgz
正在解析主機 archive.apache.org (archive.apache.org)... 192.87.106.229, 140.211.11.131, 2001:610:1:80bc:192:87:106:229
正在連接 archive.apache.org (archive.apache.org)|192.87.106.229|:80... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度:150010621 (143M) [application/x-tar]
正在保存至: “solr-4.10.3.tgz”

100%[====================================================================================================================================>] 150,010,621 46.2KB/s 用時 2h 36m

2016-03-18 23:49:25 (15.6 KB/s) - 已保存 “solr-4.10.3.tgz” [150010621/150010621])

下載完成后

tar -zxvf solr-4.10.3.tgz
cp solr-4.10.3/example/webapps/solr.war ~/apache-tomcat-8.0.29/webapps/

重新啟動一次tomcat,在apache-tomcat-8.0.29/webapps/會生成一個solr文件夾,然后把剛才拷貝的war包刪除

[lq@lq-ALiYun ~]$ ~/apache-tomcat-8.0.29/bin/startup.sh
[lq@lq-ALiYun ~]$ rm apache-tomcat-8.0.29/webapps/solr.war

修改~/apache-tomcat-8.0.29/webapps/solr/WEB-INF/web.xml文件中的以下內容,修改前:

<!--
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/put/your/solr/home/here</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
-->

修改后

<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/home/lq/solr-4.10.3/example/solr</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>

復制jar包

cp -r  solr-4.10.3/example/lib/ext/.  apache-tomcat-8.0.29/webapps/solr/WEB-INF/lib/

然后訪問
http://機器ip:8080/solr,如下圖即安裝成功
此處輸入圖片的描述

  1. 中文分詞器
    下載中文分詞器 鏈接:http://git.oschina.net/wltea/IK-Analyzer-2012FF 下載玩后復制jar包和詞典文件,如果沒有classes文件夾就手動創建一個
cp IK-Analyzer-2012FF/dist/IKAnalyzer2012_FF.jar apache-tomcat-8.0.29/webapps/solr/WEB-INF/lib/
cp IK-Analyzer-2012FF/dist/IKAnalyzer.cfg.xml apache-tomcat-8.0.29/webapps/solr/WEB-INF/classes/
cp IK-Analyzer-2012FF/dist/stopword.dic apache-tomcat-8.0.29/webapps/solr/WEB-INF/classes/

修改solr-4.10.3/example/solr/collection1/conf/schema.xml配置文件,
添加分詞器:

<!-- 自定義添加IK Analyzer 分詞插件-->
<fieldType name="text" class="solr.TextField">
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>

重啟tomcat,重新進入solr界面,選擇collection1->Analysis,Analyse Fieldname / FieldType選為text_ik,隨便輸入一句話,測試中文分詞效果。如下圖:

中文分詞效果

要使用本項目進行索引的話,還需要配置

<field name="fetch_time" type="string" indexed="false" stored="false" multiValued="true"/>

修改content和category的屬性如下

<field name="category" type="text_ik" indexed="true" stored="true" multiValued="true"/>
<field name="content" type="text_ik" indexed="true" stored="true" multiValued="true"/>
<field name="relevance_score" type="double" indexed="true" stored="true" />

如果solr默認的查找元素為text,則需要copyField到text上用於搜索

<copyField source="category" dest="text"/>
<copyField source="relevance_score" dest="text"/>

修改配置后需要重啟solr服務器 或者在網頁上點擊Core Admin->Reload按鈕才能生效

要想刪除索引,可以直接清除data目錄下的內容

rm -r solr-4.10.3/example/solr/collection1/data/*

hadoop2.5.2安裝部署

Hadoop 2.5.2分布式集群配置:http://blog.csdn.net/lqleo323/article/details/50803799

項目下載地址

https://github.com/LQZYC/Nutch-NewsClassify

聯系作者

All copyright reserved


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com