本博客屬原創(chuàng )文章,歡迎轉載!轉載請務(wù)必注明出處:http://guoyunsky.javaeye.com/blog/644396
歡迎加入Heritrix群(QQ):10447185
前面說(shuō)過(guò)Heritrix可以在某個(gè)抓取基礎上(這里假設為A)繼續抓取,因為Heritrix對每一個(gè)URL都會(huì )有相應的日志處理,同時(shí)還有checkpoint(備份中心)。所以只要通過(guò)A上的日志就可以完全按照該基礎A繼續抓取,不會(huì )重復抓取任何A抓過(guò)的任何東西,也會(huì )繼續抓取A沒(méi)有抓過(guò)的URL。做到這個(gè)有兩種方法,一種是針對Web啟動(dòng)的,還有一種是針對我上次寫(xiě)的不通過(guò)Web啟動(dòng)的方式(啟動(dòng)方式見(jiàn)博客:Heritrix源碼分析(五) 如何讓Heritrix在Ecplise等IDE下編程啟動(dòng)).
1)下面介紹這兩種啟動(dòng)方式,第一種,通過(guò)Web啟動(dòng):
進(jìn)入頁(yè)面,選擇:Jobs->Base on a recovery->然后再選擇你要二次抓取的Job中的recover-log->然后再點(diǎn)擊按鈕Submit Job。之后回到Console頁(yè)面,點(diǎn)擊Start。之后就開(kāi)始再你想要的基礎上抓取了。你可以進(jìn)入這個(gè)新建的抓取JOB下的logs目錄,發(fā)現里面有個(gè)recover.gz大小跟你想要二次抓取JOB中的recover.gz大小一般大。以及你去查看該job下的order.xml中的<string name="recover-path"></string>中間的值發(fā)現就是你要二次抓取job下recover.gz的絕對目錄
2)不通過(guò)Web方式啟動(dòng):
這個(gè)相對簡(jiǎn)單,只要修改order.xml中<string name="recover-path">D:/recover.gz</string>,中間的值就是你想二次抓取的JOB中logs目錄下recover.gz的絕對路徑。
同時(shí)最好更新一下值為:
<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>
至于為什么要這樣設置,請參考我關(guān)于order.xml介紹的博客:Heritrix源碼分析(二) 配置文件order.xml介紹
同時(shí)可能你已經(jīng)知道某些URL不需要抓取,比如從數據庫導出來(lái)的,而這些URL你的Heritrix并沒(méi)有處理過(guò)。所以這些外部的URL就無(wú)法通過(guò)以上兩種辦法導入Heritrix了。這里我寫(xiě)了個(gè)工具類(lèi),有兩種方式,一種是你將URL都放在文件中,然后通過(guò)這個(gè)工具類(lèi)從這個(gè)文件中讀取這些URL(必須一行一個(gè)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來(lái)源文件* @param sourceFileEncoding URL來(lái)源文件的編碼* @param recoverGzPath 要寫(xiě)到的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);//一行一行寫(xiě)入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 要寫(xiě)到的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) {/** 示例,從結果集中寫(xiě)入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();//獲取Connectionstmt=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 blocke.printStackTrace();}finally{DatabaseUtil.closeConnection(con, stmt, rs);//關(guān)閉Connection、Statement、ResultSet}}}
這個(gè)工具類(lèi)其實(shí)主要也只是生成recover.gz文件。如果你采用Web方式啟動(dòng),你只要找到一個(gè)你抓取過(guò)的JOB,然后用這個(gè)生成的recover.gz目錄覆蓋你找到j(luò )ob下logs目錄中的recover.gz即可。而如果你采用非Web啟動(dòng)就更簡(jiǎn)單了,只要將order.xml中<string name="recover-path">D:/recover.gz</string>中的值改成你生成recover.gz絕對路徑即可!
聯(lián)系客服