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

轉載自http://guoyunsky.iteye.com/blog/644396

  前面說過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>,中間的值就http://guoyunsky.iteye.com/blog/644396是你想二次抓取的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,下面貼上代碼:

  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.     } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章