nutch的定时增量爬取

译文来着:

http://wiki.apache.org/nutch/Crawl

介绍(Introduction)

注意:脚本中没有直接使用Nutch的爬去命令(bin/nutch crawl或者是“Crawl”类),所以url过滤的实现并不依赖“conf/crawl-urlfilter.txt”,而是应该在“regex-urlfilter.txt”中设定实现。

爬取步骤(Steps)

脚本大致分为8部:

  1. Inject URLs(注入urls)
  2. Generate, Fetch, Parse, Update Loop(循环执行:产生待抓取URL,抓取,转换得到的页面,更新各DB)
  3. Merge Segments(合并segments)
  4. Invert Links(得到抓取到的页面的外连接数据)
  5. Index(索引)
  6. Dedup(去重)
  7. Merge Indexes(合并索引)
  8. Load new indexes(tomcat重新加载新索引目录)

两种执行模式(Modes of Execution)

脚本可以两种模式执行:-

  • Normal Mode(普通模式)
  • Safe Mode(安全模式)

Normal Mode

用 ‘bin/runbot‘命令执行, 将删除执行后所有的目录。

注意: 这意味着如果抓取过程因某些原因中断,而且crawl DB 是不完整的, 那么将没办法恢复。

Safe Mode

用‘bin/runbot safe‘ 命令执行安全模式,将不会删除用到的目录文件. 所有临时文件将被以"BACK_FILE"备份。如果出错,可以利用这些备份文件执行恢复操作。

Normal Mode vs. Safe Mode

除非你可以保证一切都不出问题,否则我们建议您执行安全模式。

Tinkering

根据你的需要设定 ‘depth‘, ‘threads‘, ‘adddays‘ and ‘topN‘。如果不想设定‘topN‘,就将其注释掉或者删掉。

NUTCH_HOME

如果你不是在 nutch的‘bin/runbot‘ 目录下执行该脚本, 你应该在脚本中设定 ‘NUTCH_HOME‘ 的值为你的nutch路径:-

if [ -z "$NUTCH_HOME" ]
then
  NUTCH_HOME=.

ps:如果你在环境变量中已经设定了 ‘NUTCH_HOME‘的值,则可以忽略此处。

CATALINA_HOME

‘CATALINA_HOME‘ 指向tomcat的安装路径。需要在脚本或者环境变量中对其设置,类似 ‘NUTCH_HOME‘的设定:-

if [ -z "$CATALINA_HOME" ]
then
  CATALINA_HOME=/opt/apache-tomcat-6.0.10

Can it re-crawl?

Can it re-crawl?

虽然作者自己使用过多次,但是否能够适合你的工作,请先测试一下。如果不能很好的执行重爬,请联系我们。

脚本内容(Script)

# runbot script to run the Nutch bot for crawling and re-crawling.
# Usage: bin/runbot [safe]
#        If executed in ‘safe‘ mode, it doesn‘t delete the temporary
#        directories generated during crawl. This might be helpful for
#        analysis and recovery in case a crawl fails.
#
# Author: Susam Pal

depth=2
threads=5
adddays=5
topN=15 #Comment this statement if you don‘t want to set topN value

# Arguments for rm and mv
RMARGS="-rf"
MVARGS="--verbose"

# Parse arguments
if [ "$1" == "safe" ]#判断是以哪种模式执行
then
  safe=yes
fi

if [ -z "$NUTCH_HOME" ]#判断 ‘NUTCH_HOME‘是否设定
then
  NUTCH_HOME=.
  echo runbot: $0 could not find environment variable NUTCH_HOME
  echo runbot: NUTCH_HOME=$NUTCH_HOME has been set by the script
else
  echo runbot: $0 found environment variable NUTCH_HOME=$NUTCH_HOME
fi

if [ -z "$CATALINA_HOME" ]#判断tomcat路径是否设置
then
  CATALINA_HOME=/opt/apache-tomcat-6.0.10
  echo runbot: $0 could not find environment variable NUTCH_HOME
  echo runbot: CATALINA_HOME=$CATALINA_HOME has been set by the script
else
  echo runbot: $0 found environment variable CATALINA_HOME=$CATALINA_HOME
fi

if [ -n "$topN" ]#topN设定
then
  topN="-topN $topN"
else
  topN=""
fi

steps=8
echo "----- Inject (Step 1 of $steps) -----"#注入种子urls
$NUTCH_HOME/bin/nutch inject crawl/crawldb urls

echo "----- Generate, Fetch, Parse, Update (Step 2 of $steps) -----"#循环执行抓取
for((i=0; i < $depth; i++))
do
  echo "--- Beginning crawl at depth `expr $i + 1` of $depth ---"
  $NUTCH_HOME/bin/nutch generate crawl/crawldb crawl/segments $topN       -adddays $adddays
  if [ $? -ne 0 ]
  then
    echo "runbot: Stopping at depth $depth. No more URLs to fetch."
    break
  fi
  segment=`ls -d crawl/segments/* | tail -1`

  $NUTCH_HOME/bin/nutch fetch $segment -threads $threads
  if [ $? -ne 0 ]
  then
    echo "runbot: fetch $segment at depth `expr $i + 1` failed."
    echo "runbot: Deleting segment $segment."
    rm $RMARGS $segment
    continue
  fi

  $NUTCH_HOME/bin/nutch updatedb crawl/crawldb $segment
done

echo "----- Merge Segments (Step 3 of $steps) -----"#合并Segments
$NUTCH_HOME/bin/nutch mergesegs crawl/MERGEDsegments crawl/segments/*
if [ "$safe" != "yes" ]
then
  rm $RMARGS crawl/segments
else
  rm $RMARGS crawl/BACKUPsegments
  mv $MVARGS crawl/segments crawl/BACKUPsegments
fi

mv $MVARGS crawl/MERGEDsegments crawl/segments

echo "----- Invert Links (Step 4 of $steps) -----"#得到外连接数据
$NUTCH_HOME/bin/nutch invertlinks crawl/linkdb crawl/segments/*

echo "----- Index (Step 5 of $steps) -----"#建索引
$NUTCH_HOME/bin/nutch index crawl/NEWindexes crawl/crawldb crawl/linkdb     crawl/segments/*

echo "----- Dedup (Step 6 of $steps) -----"#去重
$NUTCH_HOME/bin/nutch dedup crawl/NEWindexes

echo "----- Merge Indexes (Step 7 of $steps) -----"#合并索引
$NUTCH_HOME/bin/nutch merge crawl/NEWindex crawl/NEWindexes

echo "----- Loading New Index (Step 8 of $steps) -----"#tomcat重新加载索引目录
${CATALINA_HOME}/bin/shutdown.sh

if [ "$safe" != "yes" ]
then
  rm $RMARGS crawl/NEWindexes
  rm $RMARGS crawl/index
else
  rm $RMARGS crawl/BACKUPindexes
  rm $RMARGS crawl/BACKUPindex
  mv $MVARGS crawl/NEWindexes crawl/BACKUPindexes
  mv $MVARGS crawl/index crawl/BACKUPindex
fi

mv $MVARGS crawl/NEWindex crawl/index

${CATALINA_HOME}/bin/startup.sh

echo "runbot: FINISHED: Crawl completed!"
echo ""
时间: 2024-10-12 14:19:59

nutch的定时增量爬取的相关文章

webmagic 增量爬取

webmagic  是一个很好并且很简单的爬虫框架,其教程网址:http://my.oschina.net/flashsword/blog/180623 webmagic参考了scrapy的模块划分,分为Spider(整个爬虫的调度框架).Downloader(页面下载).PageProcessor(链接提取和页面分析).Scheduler(URL管理).Pipeline(离线分析和持久化)几部分.只不过scrapy通过middleware实现扩展,而webmagic则通过定义这几个接口,并将其

scrapy-deltafetch实现增量爬取

详情:https://blog.csdn.net/zsl10/article/details/52885597 安装:Berkeley DB # cd /usr/local/src # wget http://download.oracle.com/berkeley-db/db-4.7.25.NC.tar.gz # tar zxvf db-4.7.25.NC.tar.gz # cd build_unix # ../dist/configure # make&&make install 安装

爬取电影天堂最新电影的名称和下载链接(增量爬取mysql存储版)

这次的程序是在上次的基础上进行修改,把持久化储存方式改成mysql,并增加了断点续爬功能. import requests import re from fake_useragent import UserAgent import random import time import pymysql from hashlib import md5 from lxml import etree class DianyingtiantangSpider(object): def __init__(se

为什么列表增量爬取要单线程?

适用于对数据同步要求高,每天的增量数据不太大的情况. 1.防止漏爬,单线程时刚爬完第1页有新数据产生,在爬第2页的时候首条数据已经爬过,出现重复而已,不会丢失:多线程时比如3个线程,每页10条分别为1-10,11-20,21-30,第3页被先爬取了,此时服务器新增了一条,另一个线程刚好抓取第2页,原来的第20条数据被顶到第3页了,可第3页已经爬过了,这样就漏掉了一条数据. 2.增量停止,既然是增量爬,就得知道什么时候停止,比如根据时间.记录数等,就是得知道上次爬到哪了,如果列表没有规律那就瞎了,

爬虫 + 数据分析 - 7 CrawlSpider(全站爬取), 分布式, 增量式爬虫

一.全站爬取(CrawlSpider) 1.基本概念 作用:就是用于进行全站数据的爬取 - CrawlSpider就是Spider的一个子类 - 如何新建一个基于CrawlSpider的爬虫文件 - scrapy genspider -t crawl xxx www.xxx.com - LinkExtractor连接提取器:根据指定规则(正则)进行连接的提取 - Rule规则解析器:将链接提取器提取到的链接进行请求发送,然后对获取的页面数据进行 指定规则(callback)的解析 - 一个链接提

爬取百万数据的采集系统从零到整的过程

目录 需求 分析 设计 实现 框架 采集 遇到的问题 demo 数据 效果 数据 关注关注我的公众号啊 前言:记录下在上家公司负责过的一个采集系统从零到整的过程,包括需求,分析,设计,实现,遇到的问题及系统的成效,系统最主要功能就是可以通过对每个网站进行不同的采集规则配置对每个网站爬取数据,目前系统运行稳定,已爬取的数据量大概在600-700万之间(算上一些历史数据,应该也有到千万级了),每天采集的数据增量在一万左右,配置采集的网站1200多个,这个系统其实并不大,但是作为主要的coding人员

垂直爬虫爬取分页数据

为了爬取全部详情页,一般从列表页开始多线程并发爬取,并发线程数受网络环境(一般表现为超时)和服务器性能影响(一般表现为http响应500). 1.第一页作为抓取入口url,解析出详情页url及其他分页url,详情页优先爬,避免缓存的url过多: 2.查看总共多少页(如果分页中没有总共多少页,通过总记录数/每页记录数计算出多少页),爬取过程不解析分页url,一次性添加全部分页url, 当然也可以在爬第一页的时候添加全部分页,每爬完一页解析出详情页url,详情页优先爬: 3.有些网站在详情页提供上一

Python-定时爬取指定城市天气(一)-发送给关心的微信好友

一.背景 上班的日子总是3点一线,家里,公司和上班的路径,对于一个特别懒得我来说,经常遇到上班路上下雨了,而我却没带伞,多么痛的领悟.最近对python有一种狂热的学习热情,写了4年多的C++代码,对于python我不能说简单,但是他做东西确实太快了,现有的第三方资源真的炒鸡多,用的我也是不亦乐乎.除了上班忘记带伞,每天重复性的工作还有很多,比如上下班打卡.每个礼拜的周报,还有如果有关心的女神,也可以做定时发送心里话,或者定时提醒等各种服务.有时候想如果有一个人能按时提醒我就好了,这种想法也就停

爬取Ajax动态加载网页

常见的反爬机制及处理方式 1.Headers反爬虫 :Cookie.Referer.User-Agent 解决方案: 通过F12获取headers,传给requests.get()方法 2.IP限制 :网站根据IP地址访问频率进行反爬,短时间内进制IP访问 解决方案: 1.构造自己IP代理池,每次访问随机选择代理,经常更新代理池 2.购买开放代理或私密代理IP 3.降低爬取的速度 3.User-Agent限制 :类似于IP限制 解决方案: 构造自己的User-Agent池,每次访问随机选择 5.