nutch抓取实验

1. 背景

入门教程:http://wiki.apache.org/nutch/NutchTutorial

下载:http://nutch.apache.org/downloads.html

下载全网抓取的种子文件: wget http://rdf.dmoz.org/rdf/content.rdf.u8.gz
gunzip content.rdf.u8.gz

快速入门:

  1. http://cn.soulmachine.me//blog/20140121/
  2. http://www.jianshu.com/p/8e166881dd47
  3. http://www.oschina.net/translate/nutch-tutorial?cmp
  4. 源码的一些操作:https://github.com/CrawlScript/nutcher
  5. 重要:http://www.open-open.com/doc/view/ddc19d98a0d043ddab0d896456415f6a

nutch与hadoop集成别人的博客:

http://www.open-open.com/lib/view/open1328670771405.html http://www.dataguru.cn/thread-240156-1-1.html

Nutch数据包含3个目录结构,分别是:

  1. Crawldb:用于存储Nutch将要检索的url信息,以及检索状态(是否检索、何时检索)
  2. Linkdb:用于存储每一个url所包含的超链接信息(包括锚点)
  3. Segments:一组url的集合,他们作为一个检索单元,可用于分布式检索

代理:

  1. http://proxy.mimvp.com/
  2. http://www.kuaidaili.com/apidoc/
  3. http://www.xicidaili.com/
  4. http://www.kuaidaili.com/free/

2. 我的开发

2.1 软件存放地址:

1) nc043:/disk2/zhaowei/nutch/apache-nutch-1.7
源码编译的话,需要把默认的maven中央库地址 http://repo1.maven.org/maven2/ 替换成国内OSC提供的镜像: http://maven.oschina.net/content/groups/public/或者有道的:http://nexus.corp.youdao.com/nexus/content/groups/public/

2)hadoop本地: hadoop-2.7.2/bin已加入~/.bash_profile

3)hdfs目录: /user/dict/crawler/nutch/seeds

4)dmoz的存放地址:

抽取部分的url: bin/nutch org.apache.nutch.tools.DmozParser ../../dmoz/content.rdf.u8 -subset 5000 > ../../dmoz/urls

抽取全部的url: bin/nutch org.apache.nutch.tools.DmozParser ../../dmoz/content.rdf.u8 > ../../dmoz/urls

注意如果subset 设置过大,会解析不出来任何的url.

有可能最新的是解压失败的,我就遇到了。84M,一直解压不了。 于是换了这个2011年的:dmoz content下载.

5)我的种子存放的目录 odfs:/user/dict/crawler/nutch/seeds/20160608,本地:nc043:/disk2/zhaowei/nutch/apache-nutch-1.11/seed_urls/,选择了一些如沪江等双语的站点作为起始站点。

2.2 完整的部署

  1. wget http://archive.apache.org/dist/nutch/1.7/apache-nutch-1.7-src.zip
    用1.7,前人的经验更有用

  2. cp /global/exec/zhaowei/software/hadoop/hadoop-2.7.2/etc/hadoop/* conf/

  3. vi ivy/ivysetting.xml,修改:
    <property name="repo.maven.org"> <value="http://nexus.corp.youdao.com/nexus/content/groups/public/" override="false"/>

  4. ant一下,有可能会磁盘不足。
  5. 修改nutch-default.xml

    <name>http.agent.name</name> <value>your name</value> ... <name>http.content.limit</name> <value>165536</value> ... <name>http.redirect.max</name> <value>3</value> ... <name>http.useHttp11</name> <value>true</value> </code></Pre> ... 让英文的权重更低一些,主要还是中文和小语言的抓取,如果只抓取某种语言,需要,后面全部删除。 <name>http.accept.language</name>
    <value>en-us,en-gb,en;q=0.1,*;q=0.9</value> ... <name>generate.update.crawldb</name>
    <value>true</value>
    是否在generator完成之后,更新crawldb,主要是更新CrawlDatum的_ngt_字段为此次执行generator的时间,防止下次generator(由参数crawl.gen.delay指定的时间之内开始的另一个generator),加入相同的url(备注:即使下次generator加入相同的url,也不会造成逻辑错误,只是会浪费资源,重复爬取相同URL),详见nutch-default.xml ... <name>fetcher.server.min.delay</name>
    <value>5</value>

  6. 准备种子,下载dmoz
    抽取部分的url: bin/nutch org.apache.nutch.tools.DmozParser ../../dmoz/content.rdf.u8 -subset 5000 > ../../dmoz/urls 抽取全部的url: bin/nutch org.apache.nutch.tools.DmozParser ../../dmoz/content.rdf.u8 > ../../dmoz/urls 注意如果subset 设置过大,会解析不出来任何的url.

    有可能最新的是解压失败的,我就遇到了。84M,一直解压不了。 于是换了这个2011年的:http://rdf.dmoz.org/rdf/archive/2011-03-08/,然后解压成功了,但是url提取失败

    提取到的url每行一个,我在这个基础上,再加了一下自己整理的语言方面的80个链接,,如沪江等双语的站点,组成了seed.txt,共4383859个链接。

    执行:hadoop fs -put seed.txt /user/dict/crawler/nutch/seeds/20160608/seed.txt

    我的种子存放的目录:odfs:/user/dict/crawler/nutch/seeds/20160608,本地:nc043:/disk2/zhaowei/nutch/apache-nutch-1.7/seed.txt/

  7. 执行

    hadoop jar ./runtime/deploy/apache-nutch-1.7.job org.apache.nutch.crawl.Crawl /user/dict/crawler/nutch/seeds/20160608/seed.txt -dir /user/dict/nutch/data -depth 3

    这种方法其实并不好,建议还是用crawler, 配置机器数还是很方便的:

    nohup ./runtime/deploy/bin/crawl /user/dict/crawler/nutch/seeds/20160608/seed.txt -dir /user/dict/crawler/nutch/data -depth 5 &

    这个crawl包括了以下3个步骤

    1. ./runtime/deploy/bin/nutch inject /user/dict/crawler/nutch/data/crawldb /user/dict/crawler/nutch/seeds/20160608 ``` 开始迭代:
    2. 生成列表: ./runtime/deploy/bin/nutch generate -D mapred.reduce.tasks=40 -D mapred.child.java.opts=-Xmx1000m -D mapred.reduce.tasks.speculative.execution=false -D mapred.map.tasks.speculative.execution=false -D mapred.compress.map.output=true /user/dict/crawler/nutch/data/crawldb /user/dict/crawler/nutch/data/segments -topN 10000000 -numFetchers 20 -noFilter

    3. 开始抓取: ./runtime/deploy/bin/nutch fetch -D mapred.reduce.tasks=40 -D mapred.child.java.opts=-Xmx1000m -D mapred.reduce.tasks.speculative.execution=false -D mapred.map.tasks.speculative.execution=false -D mapred.compress.map.output=true -D fetcher.timelimit.mins=180 /user/dict/crawler/nutch/data/segments/20160610204830 -noParsing -threads 100

    4. parse nohup ./runtime/deploy/bin/nutch parse -D mapred.reduce.tasks=40 -D mapred.child.java.opts=-Xmx500m -D mapred.reduce.tasks.speculative.execution=false -D mapred.map.tasks.speculative.execution=false -D mapred.compress.map.output=true -D fetcher.timelimit.mins=180 -D mapred.skip.attempts.to.start.skipping=2 -D mapred.skip.map.max.skip.records=1 /user/dict/crawler/nutch/data/segments/20160610204830 &

  8. update种子:

  9. 查看jobs
    http://ws001:8094/cluster

  10. 查看现在数据跑得怎么样了

    1)进入runtime/deploy,执行: ./runtime/deploy/bin/nutch readdb hdfs://ws001:8000/user/dict/crawler/nutch/data/crawldb -stats ws001:8000是在conf/core-site.xml中的配置

    2)查看segments里面的数据状态: ./runtime/deploy/bin/nutch readseg -dump /user/dict/crawler/nutch/data/segments/20160610204830 . -nofetch -nogenerate -noparse -noparsedata -noparsetext

    数据太多可能会导致运行失败: 所以copy了一个part出来,注意一下,dump的目标目录是{output}/dump,如果之前有这个目录了,会尝试删除之前的。目标目录也是hdfs上面的,而不是本地的。

    ./runtime/deploy/bin/nutch readseg -dump /user/zhaowei/temp/segments/ /user/zhaowei/temp -nofetch -nogenerate -noparse -noparsedata -noparsetext

    如果想再放在本地,可以hadoop fs -text /user/zhaowei/temp/dump/ > del.txt,这样打印下来。

    3)hadoop本身信息: hadoop dfsadmin -report:查看整体信息,如dfs的容量和利用率 http://ws001:8094/cluster/nodes: 查看所有的node
    hadoop job -list

    如果觉得不爽,可以直接kill job: hadoop job -kill job1461653885351125542

3. solr本地尝试

solr的作用是创建索引,相当一个搜索引擎
solr:nc043:/disk2/zhaowei/nutch/apache-nutch-1.11/solr/solr-6.0.1

解压后直接执行:bin/solr start -e cloud -noprompt

然后加入一些数据: bin/post -c gettingstarted docs/

就可以在http://host:8983/solr/#/gettingstarted/query 中进行搜索了。

注意一下:http://lucene.apache.org/solr/quickstart.html 这个教程是5.的,可能对于6.会存在不太适合的情况。 所有的solr的命令都可以用bin/solr -help来查看。 [附件:apache-solr-ref-guide-6.0.pdf]

为了看到nutch的数据,还需要集成一下nutch: 倒排: bin/nutch invertlinks presult/linkdb -dir presult/segments

索引: bin/nutch solrindex http://localhost:8983/solr presult/crawldb/ -linkdb presult/linkdb/ p_result/segments/* ```

comments powered by Disqus