轉載自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,下面貼上代碼:
- 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
- }
- }
- }