Nutch版本信息
2.2.1
数据库版本
Mysql 5.7.18
Nutch用到配置
nutch-site.xml
调试用到的配置
<property>
<name>fetcher.job.resume</name>
<value>true</value>
</property>
说明:官方说明应该是接着上次的fetch job继续工作。默认为false。
自己的理解:通常情况下,我们调试fetch时,都是走走停停,重复运行。将此值改成true,可跳过数据库中已经fetch的URL,即state=1的URL。
<property>
<name>parse.job.resume</name>
<value>true</value>
</property>
说明:官方说明应该是接着上次的parse job继续工作。默认为false。
自己的理解:通常情况下,我们调试fetch时,都是走走停停,重复运行。将此值改成true,可跳过数据库中已经parse的URL,即state=2的URL。
通过查看源码分析,以上两个配置有如下代码段:
//parserJob.java中
if (shouldResume && Mark.PARSE_MARK.checkMark(page) != null) {
if (force) {
LOG.info("Forced parsing " + unreverseKey + "; already parsed");
} else {
LOG.info("Skipping " + unreverseKey + "; already parsed");
return;
}
} else {
LOG.info("Parsing " + unreverseKey);
}
//FetcherJob.java中
if (shouldContinue && Mark.FETCH_MARK.checkMark(page) != null) {
LOG.info("Skipping " + TableUtil.unreverseUrl(key) + "; already fetched");
if (LOG.isDebugEnabled()) {
LOG.debug("Skipping " + TableUtil.unreverseUrl(key) + "; already fetched");
}
return;
}
判断条件中,shouldResume/shouldContinue由配置文件决定,默认为false;
Mark.PARSE_MARK.checkMark(page)/Mark.FETCH_MARK.checkMark(page)为数据库中某条记录的markers字段。
markers字段:每条记录经过(Inject)、generate、fetch、parse、(index)都会在markers里生成标记,该标记的生成和batchId有关。
<property>
<name>parse.abide.nofollow</name>
<value>false</value>
</property>
说明:通过修改parse-html插件代码,使用配置文件控制爬虫是否可以爬取ref=nofollow的标签(加入外链)。
参考: Nutch修改插件源代码+打包
优化Nutch爬取速度的配置
<!-- 小点合适,但实际看min.delay的设置 -->
<property>
<name>fetcher.server.delay</name>
<value>1.0</value>
</property>
说明:在相同服务器的连续请求之间,抓取器将延迟的秒数。
个人理解:同一域名下抓取的间隔。
<!-- 此处我设置为0,但并发不应太高 -->
<property>
<name>fetcher.server.min.delay</name>
<value>0.0</value>
</property>
说明:提取器在连续请求到相同服务器之间延迟的最小秒数。 如果fetcher.threads.per.host大于1(即主机屏蔽已关闭),此值才适用。
特别注意:fetcher.threads.per.host在Nutch2.X中已经改为fetcher.threads.per.queue,做优化的同学们注意啦
<!-- 和上面的搭配使用,并发数 -->
<property>
<name>fetcher.threads.per.queue</name>
<value>30</value>
</property>
说明:此数字是一次应允许访问队列的最大线程数。
个人理解:访问同一队列的并发线程数。经过试验知,该数字较大时在网络不顺畅的情况下,会出现大量的连接超时错误。
<property>
<name>fetcher.threads.fetch</name>
<value>200</value>
</property>
说明:FetcherThreads的数量,该抓取器应该使用。这也决定了一次进行的请求的最大数量(每个FetcherThread处理一个连接)。 以分布式模式运行的线程总数将为每个节点具有一个映射任务的获取线程数*节点数。
个人理解:该值看服务器的性能,单机情况下200不会有什么问题。
<property>
<name>fetcher.queue.depth.multiplier</name>
<value>200</value>
</property>
说明:根据[host | domain | IP](参见param fetcher.queue.mode),提取器将传入的URL缓存到队列中。 队列的深度是该参数值的次数。 大值需要更多的内存,但是当提取列表中的URLS的顺序不是最佳时,可以提高抓取的性能。
个人理解:提取外链中的URL时,向queue的注入任务的最大值和该参数有关。
其他配置
<property>
<name>http.agent.name</name>
<value>Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident</value>
</property>
<property>
<name>http.agent.version</name>
<value>6.0)</value>
</property>
说明:某些情况下,爬虫会得到手机访问的页面,此处改为IE6.0的模拟浏览器。
<property>
<name>http.timeout</name>
<value>30000</value>
<description>The default network timeout, in milliseconds.
</description>
</property>
说明:Http连接超时的默认值。防止某些页面过大或服务器压力大造成时延,此处从1W修改到3W,即30秒。
regex-urlfilter.txt
该配置是关于过滤器的使用,使用+/-通过或过滤正则表达式的URL。
gora.properties
该文件配置gora。
通常需要修改以下代码块:
gora.sqlstore.jdbc.driver=数据库驱动名
gora.sqlstore.jdbc.url=数据库URL
gora.sqlstore.jdbc.user=用户名
gora.sqlstore.jdbc.password=密码