`
guoyunsky
  • 浏览: 839195 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
3d3a22a0-f00f-3227-8d03-d2bbe672af75
Heritrix源码分析
浏览量:203212
Group-logo
SQL的MapReduce...
浏览量:0
社区版块
存档分类
最新评论

Heritrix源码分析(九) Heritrix的二次抓取以及如何让Heritrix抓取你不想抓取的URL

阅读更多

             本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/644396

       欢迎加入Heritrix群(QQ):109148319

 

      前面说过Heritrix可以在某个抓取基础上(这里假设为A)继续抓取,因为Heritrix对每一个URL都会有相应的日志处理,同时还有checkpoint(备份中心)。所以只要通过A上的日志就可以完全按照该基础A继续抓取,不会重复抓取任何A抓过的任何东西,也会继续抓取A没有抓过的URL。做到这个有两种方法,一种是针对Web启动的,还有一种是针对我上次写的不通过Web启动的方式(启动方式见博客:Heritrix源码分析(五) 如何让Heritrix在Ecplise等IDE下编程启动).

       1)下面介绍这两种启动方式,第一种,通过Web启动:

              进入页面,选择:Jobs->Base on a recovery->然后再选择你要二次抓取的Job中的recover-log->然后再点击按钮Submit Job。之后回到Console页面,点击Start。之后就开始再你想要的基础上抓取了。你可以进入这个新建的抓取JOB下的logs目录,发现里面有个recover.gz大小跟你想要二次抓取JOB中的recover.gz大小一般大。以及你去查看该job下的order.xml中的<string name="recover-path"></string>中间的值发现就是你要二次抓取job下recover.gz的绝对目录

       2)不通过Web方式启动:

               这个相对简单,只要修改order.xml中<string name="recover-path">D:/recover.gz</string>,中间的值就是你想二次抓取的JOB中logs目录下recover.gz的绝对路径。

               同时最好更新一下值为:
               <boolean name="checkpoint-copy-bdbje-logs">true</boolean>
               <boolean name="recover-retain-failures">false</boolean>
               <boolean name="recover-scope-includes">false</boolean>
               <boolean name="recover-scope-enqueues">false</boolean>

               至于为什么要这样设置,请参考我关于order.xml介绍的博客:Heritrix源码分析(二) 配置文件order.xml介绍

 

      同时可能你已经知道某些URL不需要抓取,比如从数据库导出来的,而这些URL你的Heritrix并没有处理过。所以这些外部的URL就无法通过以上两种办法导入Heritrix了。这里我写了个工具类,有两种方式,一种是你将URL都放在文件中,然后通过这个工具类从这个文件中读取这些URL(必须一行一个URL),导入到Heritrix中。还有一种方法是针对数据库的,你只要提供相应的ResultSet以及该URL对应数据库的字段名,也可以导入Heritrix,下面贴上代码:

      

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.archive.crawler.frontier.RecoveryJournal;

public class UrlToRecoverUtil {
	/**
	 * 从文件中导入URl到recover.gz以便URL不再被抓取
	 * 
	 * @param sourceFilePath		URL来源文件
	 * @param sourceFileEncoding	URL来源文件的编码 
	 * @param recoverGzPath			要写到的recover.gz文件目录
	 * @param recoverGzFileName		recover.gz文件名,可以为空
	 * @return
	 */
	public static boolean urlToRecoverUtilByFile(String sourceFilePath,String sourceFileEncoding,String recoverGzDir,String recoverGzFileName){
		boolean result=false;
		
		InputStream is=null;
		InputStreamReader isr=null;
		BufferedReader br=null;
		File sourceFile=null;
		
		String line=null;
		RecoveryJournal recover = null;
		
		try {
			sourceFile=new File(sourceFilePath);
			
			//recover.gz文件为空则采用默认名字
			if(recoverGzFileName==null||recoverGzFileName.equals("")){
				recoverGzFileName="recover.gz";
			}
			recover=new RecoveryJournal(recoverGzDir,recoverGzFileName);//构造recover.gz对象
			
			//读取文件内容
			is=new FileInputStream(sourceFile);
			isr=new InputStreamReader(is,sourceFileEncoding);
			br=new BufferedReader(isr);
			
			//一行一行写入recover.gz文件
			while((line=br.readLine().trim())!=null){
				if(!line.equals("")){
					recover.writeLine(RecoveryJournal.F_SUCCESS, line);
				}
				
			}
			result=true;
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if(recover!=null){
					recover.close();
				}
				if(br!=null){
					br.close();
				}
				if(isr!=null){
					isr.close();
				}
				if(is!=null){
					is.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
		
		return result;
	}
	/**
	 * 从ResultSet结果集中获取URL导入到recover.gz以便URl不再被抓取
	 * 
	 * @param rs				ResultSet结果集
	 * @param filedName			ResultSet结果集中要获取URL对应的字段名		
	 * @param recoverGzDir		要写到的recover.gz文件目录
	 * @param recoverGzFileName	recover.gz文件名,可以为空
	 * @return
	 */
	public static boolean urlToRecoverUtilByResultSet(ResultSet rs,String filedName,String recoverGzDir,String recoverGzFileName){
		boolean result=false;
		
		String line=null;
		RecoveryJournal recover = null;
		
		try {
			if(recoverGzFileName==null||recoverGzFileName.equals("")){
				recoverGzFileName="recover.gz";
			}
			recover=new RecoveryJournal(recoverGzDir,recoverGzFileName);
			if(rs!=null){
				while(rs.next()){
					line=rs.getString(filedName).trim();
					if(!line.equals("")){
						recover.writeLine(RecoveryJournal.F_SUCCESS, line);
					}
					
				}
				result=true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if(rs!=null){
					rs.close();
				}
				if(recover!=null){
					recover.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}	
		
		return result;
	}
	
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/*
		 * 示例,从结果集中写入URL到recover.gz
		 */
		Connection con=null;
		Statement stmt=null;
		ResultSet rs=null;
		String sql="SELECT CLASSIFY_INFO_URL FROM CLASSIFY_INFO";
		boolean result=false;
		try {
			con=DatabaseUtil.getConnection_Mysql_CrawlServer_Local();//获取Connection
			stmt=con.createStatement();
			rs=stmt.executeQuery(sql);
			result=urlToRecoverUtilByResultSet(rs,"CLASSIFY_INFO_URL","D:/HeritrixRecover/",null);
			System.out.println("从结果集中导入URL到recover.gz文件:"+(result?"成功!":"失败!"));
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			DatabaseUtil.closeConnection(con, stmt, rs);//关闭Connection、Statement、ResultSet
		}
		

	}

}

 

这个工具类其实主要也只是生成recover.gz文件。如果你采用Web方式启动,你只要找到一个你抓取过的JOB,然后用这个生成的recover.gz目录覆盖你找到job下logs目录中的recover.gz即可。而如果你采用非Web启动就更简单了,只要将order.xml中<string name="recover-path">D:/recover.gz</string>中的值改成你生成recover.gz绝对路径即可!

 

更多技术文章、感悟、分享、勾搭,请用微信扫描:

6
0
分享到:
评论
1 楼 zzzz3621 2011-12-14  
  <boolean name="checkpoint-copy-bdbje-logs">true</boolean>
               <boolean name="recover-retain-failures">false</boolean>
               <boolean name="recover-scope-includes">false</boolean>
               <boolean name="recover-scope-enqueues">false</boolean>
的介绍在Heritrix源码分析(二) 配置文件order.xml介绍里是没有的呀

相关推荐

    heritrix抓取指南

    heritrix抓取指南heritrix抓取指南 heritrix抓取指南

    heritrix抓取的操作和扩展

    对heritrix抓取的操作和扩展 里面有MirrorWriterProcessor扩展的类文件修改

    web爬虫Heritrix.zip

    用户可以使用它来从网上抓取想要的资源。Heritrix设计成严格按照robots.txt文件的排除指示和META robots标签。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。 Heritrix是一个爬虫框架,其组织结构...

    heritrix 配置

    Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。本文详细介绍了 Heritrix 在 Eclipse 中的配置、运行。

    heritrix-3.4.0-SNAPSHOT-src.zip

    Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。官网下载好像要翻墙,我下下来方便大家使用,这是3.4版本,配合heritrix-3.4.0-SNAPSHOT-dist.zip使用

    Heritrix lucene开发自己的搜索引擎(源码)1

    注:随光盘附带的mirror.rar文件是使用Heritrix从pconline网上抓取的手机信息页面(以网站镜象格式存储),在本书最后搜索引擎完整实例中需要使用到。由于光盘容量有限,笔者删除了原始镜像目录中一部分的网页,可能...

    Heritrix爬虫框架 完整版

    Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑

    heritrix网络爬虫

    Heritrix是一个开源,可扩展的web爬虫...用户可以使用它来从网上抓取想要的资源。Heritrix设计成严格按照robots.txt文件的排除指示和META robots标签。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。

    基于Lucene_Heritrix的垂直搜索引擎的研究与应用

    Heritrix是一个由Java开发的、开源的Web网络爬虫,用户可以使用它从网络上抓取想要的资源。探讨了Lucene和Heritrix在构建垂直搜索引擎中的应用。 1、垂直搜索引擎的基本介绍 2、基于Java 的全文检索引擎—Jakarta ...

    heritrix-3.4.0-SNAPSHOT-dist.zip

    Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。官网下载好像要翻墙,我下下来方便大家使用,这是3.4版本

    Heritrix—开发自己的搜索引擎

    开发自己的搜索引擎,Heritrix是一种网页抓取的有效工具

    Heritrix lucene开发自己的搜索引擎(源码)3

    注:随光盘附带的mirror.rar文件是使用Heritrix从pconline网上抓取的手机信息页面(以网站镜象格式存储),在本书最后搜索引擎完整实例中需要使用到。由于光盘容量有限,笔者删除了原始镜像目录中一部分的网页,可能...

    Heritrix在windows下运行成功

    抓取网上的内容 信息采集

    Heritrix1.14.4

    网络爬虫工具Heritrix1.14.4,包中包含完整的Heritrix程序,并附带着一个抓取网易的扩展接口,很适合刚刚接触Heritrix工具的新手

    Java爬虫技术框架之Heritrix框架详解

    Heritrix是一个由Java开发的开源Web爬虫系统,用来获取完整的、精确的站点内容的深度复制, 具有强大的可扩展性,运行开发者任意选择或扩展各个组件,实现特定的抓取逻辑。 一、Heritrix介绍 Heritrix采用了模块化的...

    搜索引擎系统中网页抓取模块研究

    如今互联网资源迅速膨胀,搜索引擎能够...的基本工作原理,分析网页抓取模块的工作流程,研究开源网络蜘蛛Heritrix 的几个关 键组件,在充分了解Heritrix 构架的基础上扩展Extractor 组件,成功实现个性化的抓 取逻辑。

    heritrix-1.14.3-src.zip

    Heritrix是一个纯由Java开发的、开源的Web网络爬虫,用户可以使用它从网络上抓取想要的资源

    heritrix3-master.zip

    Heritrix是一个开源,可扩展的web爬虫...用户可以使用它来从网上抓取想要的资源。Heritrix设计成严格按照robots.txt文件的排除指示和META robots标签。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。

    开发自己的搜索引擎lucene and heritrix

    注:随光盘附带的mirror.rar文件是使用Heritrix从pconline网上抓取的手机信息页面(以网站镜象格式存储),在本书最后搜索引擎完整实例中需要使用到。由于光盘容量有限,笔者删除了原始镜像目录中一部分的网页,可能...

    heritrix-3.0.0-src.zip

    目前罪行的heritrix网络爬虫工具,是学习lucene的提高选择,可以大批量的抓取网上资源!

Global site tag (gtag.js) - Google Analytics