1. 如何绕过目标站点的robots.txt限制
多数站点都是只允许百度、google等搜索引擎抓取的,所以会在robots.txt里限制其他爬虫。

nutch自然是会遵循robots协议的,但是我们可以通过修改nutch源码来绕过限制。

相关代码位于(nutch版本1.5.1,其他版本未测试):

org.apache.nutch.fetcher.Fetcher的run方法.

找到以下几行代码并注释掉就OK了。

  1. if (!rules.isAllowed(fit.u)) {
  2. // unblock
  3. fetchQueues.finishFetchItem(fit, true);
  4. if (LOG.isDebugEnabled()) {
  5. LOG.debug("Denied by robots.txt: " + fit.url);
  6. }
  7. output(fit.url, fit.datum, null, ProtocolStatus.STATUS_ROBOTS_DENIED, CrawlDatum.STATUS_FETCH_GONE);
  8. reporter.incrCounter("FetcherStatus", "robots_denied", 1);
  9. continue;
  10. }

2. url掉转导致html parse不成功的问题

在抓取百度百科的景点数据时,发现部分页面不会走html parse部分的逻辑,而我的plugin是基于HtmlParserFilter扩展点的,因而没有生效。

后来发现请求部分页面的链接返回的http状态为301,跳转之后才会到真正页面,而nutch默认是不会抓取跳转后的页面的.这时需要修改
nutch-site.xml,加入以下配置即可,nutch-default.xml里的默认值是0,我们这里改成一个大于0的值,nutch就会继续
抓取跳转后的页面了。

  1. <property>
  2. <name>http.redirect.max</name>
  3. <value>2</value>
  4. <description>The maximum number of redirects the fetcher will follow when
  5. trying to fetch a page. If set to negative or 0, fetcher won't immediately
  6. follow redirected URLs, instead it will record them for later fetching.
  7. </description>
  8. </property>

3. 抽取的过程中发现某些属性老是抽不到,而在不使用nutch抓取的情况下是能抽到的,进而怀疑nutch抓取的页面不全。于是去google了一下"nutch content limit",发现nutch有这么一个配置项:

  1. <property>
  2. <name>http.content.limit</name>
  3. <value>65536</value>
  4. <description>The length limit for downloaded content using the http://
  5. protocol, in bytes. If this value is nonnegative (>=0), content longer
  6. than it will be truncated; otherwise, no truncation at all. Do not
  7. confuse this setting with the file.content.limit setting.
  8. </description>
  9. </property>

用来限制抓取内容的大小,放大10倍后,问题解决。

需要注意的是nutch还有一个很容易混淆的配置项:

  1. <property>
  2. <name>file.content.limit</name>
  3. <value>65536</value>
  4. <description>The length limit for downloaded content using the file://
  5. protocol, in bytes. If this value is nonnegative (>=0), content longer
  6. than it will be truncated; otherwise, no truncation at all. Do not
  7. confuse this setting with the http.content.limit setting.
  8. </description>
  9. </property>

两个配置用于的协议不同,前者是http协议,后者是file协议,我一开始就配置错了,折腾了半天。。。

PS:最后推荐两篇介绍nutch的文章,在官方文档不那么给力的情况下,这两篇文章给了我不小的帮助,感谢下作者。

http://www.atlantbh.com/apache-nutch-overview/ 对nutch的整体流程做了介绍

http://www.atlantbh.com/precise-data-extraction-with-apache-nutch/ 用实际例子介绍了nutch plugin的开发和部署

Nutch 问题杂记的更多相关文章

  1. [Erlang 0118] Erlang 杂记 V

       我在知乎回答问题不多,这个问题: "对你职业生涯帮助最大的习惯是什么?它是如何帮助你的?",我还是主动回答了一下.    做笔记 一开始笔记软件做的不好的时候就发邮件给自己, ...

  2. Nutch搜索引擎(第1期)_ Nutch简介及安装

    1.Nutch简介 Nutch是一个由Java实现的,开放源代码(open-source)的web搜索引擎.主要用于收集网页数据,然后对其进行分析,建立索引,以提供相应的接口来对其网页数据进行查询的一 ...

  3. Ubuntu杂记——Ubuntu下用虚拟机共享上网

    由于最近把自己电脑环境换成了Ubuntu,但学校的网络是电信的闪讯,大学里用过的人都知道这货有多坑,而且没有Linux客户端,上网都是问题,怪不得国内用Linux的人那么少,特别是高校的学生(让我瞎逼 ...

  4. 一个ubuntu phper的自我修养(杂记)

    ubuntu使用杂记 1.flatabulous安装使用. flatabulous是一个ubuntu图标主题. 使用它,必须得安装tweak插件. sudo add-apt-repository pp ...

  5. Nutch插件原理

    本文目的:讲解Nutch的插件运行时加载原理

  6. Apache Nutch build文件解析

    本文目的:分析Apache Nutch 1.9的build.xml文件,从而让读者了解nutch的build全部流程

  7. Nutch主要类代码分析之一(Injector)

    Injector(org.apache.nutch.crawl.Injector): 输入:种子列表文件所在的目录 输出:crawldb(保存URL以及其相应信息的数据库) 作用:把种子URL注入到c ...

  8. 读取nutch爬取内容方法

    读取nutch内容有如下两种方法: 1 通过Nutch api SegmentReader读取. public Content readSegment(String segPath,String ur ...

  9. Nutch源码阅读进程5---updatedb

    看nutch的源码仿佛就是一场谍战片,而构成这精彩绝伦的谍战剧情的就是nutch的每一个从inject->generate->fetch->parse->update的环节,首 ...

随机推荐

  1. ROS多线接入和多线对外提供服务的完整做法,谁进谁出,电信进电信出,联通进联通出,移动进移动出

    1.网卡接入: 电信移动联通,三线接入,LAN是局域网. 5.从www.tcp5.com,下载联通和移动的路由表,并导入.这边简单说下导入步骤,下载rsc文件,上传到ROS的FTP上,然后用命令imp ...

  2. 各种装饰器demo及优化

    #!/usr/bin/python3# -*- coding: utf-8 -*-# @Time    : 2018/5/28 14:06# @File    : lianxi.py ## impor ...

  3. 关于python-生成HTMLTestRunner测试报告

    一.HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展,它可以生成 HTML的 测试报告. 1.首先要下 HTMLTestRunner.py 文件,将下载的文件 ...

  4. 温故而知新-array_walk和sizeof和array_count_values()和extract()

    1 array_walk对数组的每一个元素应用任何函数 用户自定义函数中的第一个参数指定为引用:&$value,来改变数组元素的值 如果对一个参数使用取地址,那么会改变数组元素的值 2 siz ...

  5. 普通方法调用,Invoke,begininvoke三者的区别总结及异步与同步的区别总结

    (1)普通方法调用(直接调用)与Invoke()方法调用方法 使用的线程Id是一样的 即属于同步. (2)BeginInvoke(<输入和输出变量>,AsyncCallback callb ...

  6. leetcode58

    public class Solution { public int LengthOfLastWord(string s) { s = s.Trim(); || s.Trim().Length == ...

  7. div高度自适应的问题

    对象height:100%并不能直接产生效果,是因为跟其父对象有关. #center{height:100%;} 上面的css样式是无效的,不会产生任何效果. 需要改写:   html,body{ m ...

  8. Redis搭建(七):Redis的Cluster集群动态增删节点

    一.引言 上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点和3个从节点的Cluster的环境.当然,大家可以使用 Cluster info 命令查看Cluste ...

  9. Linux学习---linux系统下安装配置Jenkins

    1.首先准备java环境,安装JDK 2.下载jenkins至Linux服务器 下载地址:https://wiki.jenkins-ci.org/display/JENKINS/Installing+ ...

  10. 修改数据库的instance_name和db_name

    分成两个步骤,先修改instance_name,在修改db_name 修改SID1.全备份数据库RMAN> backup as compressed backupset database inc ...