zoukankan      html  css  js  c++  java
  • Heritrix源码分析(九) Heritrix的二次抓取以及如何让Heritrix抓取你不想抓取的URL

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

          本博客已迁移到本人独立博客: http://www.yun5u.com/

           欢迎加入Heritrix群(QQ):109148319,10447185 , Lucene/Solr群(QQ) :  118972724 

          前面说过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,下面贴上代码:

          

    Java代码  收藏代码
    1. import java.io.BufferedReader;  
    2. import java.io.File;  
    3. import java.io.FileInputStream;  
    4. import java.io.FileNotFoundException;  
    5. import java.io.IOException;  
    6. import java.io.InputStream;  
    7. import java.io.InputStreamReader;  
    8. import java.io.UnsupportedEncodingException;  
    9. import java.sql.Connection;  
    10. import java.sql.ResultSet;  
    11. import java.sql.SQLException;  
    12. import java.sql.Statement;  
    13.   
    14. import org.archive.crawler.frontier.RecoveryJournal;  
    15.   
    16. public class UrlToRecoverUtil {  
    17.     /** 
    18.      * 从文件中导入URl到recover.gz以便URL不再被抓取 
    19.      *  
    20.      * @param sourceFilePath        URL来源文件 
    21.      * @param sourceFileEncoding    URL来源文件的编码  
    22.      * @param recoverGzPath         要写到的recover.gz文件目录 
    23.      * @param recoverGzFileName     recover.gz文件名,可以为空 
    24.      * @return 
    25.      */  
    26.     public static boolean urlToRecoverUtilByFile(String sourceFilePath,String sourceFileEncoding,String recoverGzDir,String recoverGzFileName){  
    27.         boolean result=false;  
    28.           
    29.         InputStream is=null;  
    30.         InputStreamReader isr=null;  
    31.         BufferedReader br=null;  
    32.         File sourceFile=null;  
    33.           
    34.         String line=null;  
    35.         RecoveryJournal recover = null;  
    36.           
    37.         try {  
    38.             sourceFile=new File(sourceFilePath);  
    39.               
    40.             //recover.gz文件为空则采用默认名字  
    41.             if(recoverGzFileName==null||recoverGzFileName.equals("")){  
    42.                 recoverGzFileName="recover.gz";  
    43.             }  
    44.             recover=new RecoveryJournal(recoverGzDir,recoverGzFileName);//构造recover.gz对象  
    45.               
    46.             //读取文件内容  
    47.             is=new FileInputStream(sourceFile);  
    48.             isr=new InputStreamReader(is,sourceFileEncoding);  
    49.             br=new BufferedReader(isr);  
    50.               
    51.             //一行一行写入recover.gz文件  
    52.             while((line=br.readLine().trim())!=null){  
    53.                 if(!line.equals("")){  
    54.                     recover.writeLine(RecoveryJournal.F_SUCCESS, line);  
    55.                 }  
    56.                   
    57.             }  
    58.             result=true;  
    59.               
    60.         } catch (FileNotFoundException e) {  
    61.             e.printStackTrace();  
    62.         } catch (UnsupportedEncodingException e) {  
    63.             e.printStackTrace();  
    64.         } catch (IOException e) {  
    65.             e.printStackTrace();  
    66.         }finally{  
    67.             try {  
    68.                 if(recover!=null){  
    69.                     recover.close();  
    70.                 }  
    71.                 if(br!=null){  
    72.                     br.close();  
    73.                 }  
    74.                 if(isr!=null){  
    75.                     isr.close();  
    76.                 }  
    77.                 if(is!=null){  
    78.                     is.close();  
    79.                 }  
    80.             } catch (IOException e) {  
    81.                 e.printStackTrace();  
    82.             }  
    83.               
    84.         }  
    85.           
    86.         return result;  
    87.     }  
    88.     /** 
    89.      * 从ResultSet结果集中获取URL导入到recover.gz以便URl不再被抓取 
    90.      *  
    91.      * @param rs                ResultSet结果集 
    92.      * @param filedName         ResultSet结果集中要获取URL对应的字段名        
    93.      * @param recoverGzDir      要写到的recover.gz文件目录 
    94.      * @param recoverGzFileName recover.gz文件名,可以为空 
    95.      * @return 
    96.      */  
    97.     public static boolean urlToRecoverUtilByResultSet(ResultSet rs,String filedName,String recoverGzDir,String recoverGzFileName){  
    98.         boolean result=false;  
    99.           
    100.         String line=null;  
    101.         RecoveryJournal recover = null;  
    102.           
    103.         try {  
    104.             if(recoverGzFileName==null||recoverGzFileName.equals("")){  
    105.                 recoverGzFileName="recover.gz";  
    106.             }  
    107.             recover=new RecoveryJournal(recoverGzDir,recoverGzFileName);  
    108.             if(rs!=null){  
    109.                 while(rs.next()){  
    110.                     line=rs.getString(filedName).trim();  
    111.                     if(!line.equals("")){  
    112.                         recover.writeLine(RecoveryJournal.F_SUCCESS, line);  
    113.                     }  
    114.                       
    115.                 }  
    116.                 result=true;  
    117.             }  
    118.         } catch (SQLException e) {  
    119.             e.printStackTrace();  
    120.         } catch (IOException e) {  
    121.             e.printStackTrace();  
    122.         }finally{  
    123.             try {  
    124.                 if(rs!=null){  
    125.                     rs.close();  
    126.                 }  
    127.                 if(recover!=null){  
    128.                     recover.close();  
    129.                 }  
    130.             } catch (SQLException e) {  
    131.                 e.printStackTrace();  
    132.             }  
    133.         }     
    134.           
    135.         return result;  
    136.     }  
    137.       
    138.       
    139.       
    140.     /** 
    141.      * @param args 
    142.      */  
    143.     public static void main(String[] args) {  
    144.         /* 
    145.          * 示例,从结果集中写入URL到recover.gz 
    146.          */  
    147.         Connection con=null;  
    148.         Statement stmt=null;  
    149.         ResultSet rs=null;  
    150.         String sql="SELECT CLASSIFY_INFO_URL FROM CLASSIFY_INFO";  
    151.         boolean result=false;  
    152.         try {  
    153.             con=DatabaseUtil.getConnection_Mysql_CrawlServer_Local();//获取Connection  
    154.             stmt=con.createStatement();  
    155.             rs=stmt.executeQuery(sql);  
    156.             result=urlToRecoverUtilByResultSet(rs,"CLASSIFY_INFO_URL","D:/HeritrixRecover/",null);  
    157.             System.out.println("从结果集中导入URL到recover.gz文件:"+(result?"成功!":"失败!"));  
    158.               
    159.         } catch (SQLException e) {  
    160.             // TODO Auto-generated catch block  
    161.             e.printStackTrace();  
    162.         }finally{  
    163.             DatabaseUtil.closeConnection(con, stmt, rs);//关闭Connection、Statement、ResultSet  
    164.         }  
    165.           
    166.   
    167.     }  
    168.   
    169. }  

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

  • 相关阅读:
    CF1109D Sasha and Interesting Fact from Graph Theory 组合数
    和与或 数位dp
    G
    E. String Multiplication dp
    Obtain a Permutation 乱搞
    CF1061E Politics 费用流
    mysql连接报错
    编译安装nginx
    SQL四种语言:DDL,DML,DCL,TCL
    Linux 常用管理命令
  • 原文地址:https://www.cnblogs.com/seurain/p/3198359.html
Copyright © 2011-2022 走看看