2012-04-04 32 views
4

我是新的搜索引擎和網絡爬蟲。現在我想將所有原始頁面作爲html文件存儲在特定網站中,但使用Apache Nutch,我只能獲取二進制數據庫文件。我如何使用Nutch獲取原始html文件?如何保存原點HTML文件與Apache的Nutch

是否Nutch的支持呢?如果沒有,我可以用什麼樣的工具來實現我的目標。(支持分佈式抓取工具更好。)

回答

9

好,Nutch的會寫以二進制形式抓取的數據,所以如果你想,要保存在html格式,你將不得不修改代碼。 (如果你是新手,這會很痛苦)。

如果你想要得到的HTML頁面快速和簡單的解決方案:

  1. 如果頁/你打算已經是相當低的話,最好把它與用於調用wget腳本完成的URL列表每個網址。
  2. 或使用HTTrack工具。

編輯:

寫你自己的Nutch的插件將是巨大的。你的問題將得到解決,你可以通過提交你的作品來貢獻給nutch!如果你是nutch的新手(根據代碼&設計),那麼你將不得不投入大量的時間來構建一個新的插件......否則它很容易做到。

幫助您主動幾個要點:

Here是在談論自己編寫插件Nutch的頁面。

開始Fetcher.java。見行647-648。這是您可以根據網址獲取獲取內容的地方(對於獲取成功的頁面)。

pstatus = output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS); 
updateStatus(content.getContent().length); 

您應該在此之後添加代碼以調用您的插件。通過content對象。到現在爲止,你會猜想content.getContent()是你想要的url的內容。在插件代碼中,將其寫入某個文件。文件名應該基於url名稱,否則很難處理。網址可以通過fit.url獲得。

+0

謝謝你,TejasP。我剛剛聽說Nutch有一個插件機制來擴展它的功能。我想知道我是否可以編寫一些插件來實現它? – Freedom 2012-04-09 09:10:06

+0

@Freedom:看到我上面的編輯。希望能幫助你。 – 2012-04-09 17:53:10

+0

感謝您的詳細信息,這對我非常有幫助。這是我跳入Nutch的指南。非常感謝! – Freedom 2012-04-10 02:25:03

6

您必須run Nutch in Eclipse做修改。

當你能夠運行,打開Fetcher.java之間添加行「內容保護」命令行。

case ProtocolStatus.SUCCESS:  // got a page 
      pstatus = output(fit.url, fit.datum, content, status, CrawlDatum.STATUS_FETCH_SUCCESS, fit.outlinkDepth); 
      updateStatus(content.getContent().length);' 


      //------------------------------------------- content saver ---------------------------------------------\\ 
      String filename = "savedsites//" + content.getUrl().replace('/', '-'); 

      File file = new File(filename); 
      file.getParentFile().mkdirs(); 
      boolean exist = file.createNewFile(); 
      if (!exist) { 
       System.out.println("File exists."); 
      } else { 
       FileWriter fstream = new FileWriter(file); 
       BufferedWriter out = new BufferedWriter(fstream); 
       out.write(content.toString().substring(content.toString().indexOf("<!DOCTYPE html"))); 
       out.close(); 
       System.out.println("File created successfully."); 
      } 
      //------------------------------------------- content saver ---------------------------------------------\\ 
+0

使用這種方法會跳過創建二進制文件嗎? – 2012-12-26 00:06:29

+0

不,這只是在創建二進制文件之前保存原始HTML文件。如果需要,您必須排除二進制文件創建行。不過,我認爲這將是一項艱鉅的工作,因爲Nutch是一個非常龐大而複雜的項目。 – 2012-12-26 00:16:56

5

要更新這個答案 -

它可以從你的crawldb段文件夾上傳過程中的數據,並在閱讀HTML(包括其他數據Nutch的已存儲)直接。

Configuration conf = NutchConfiguration.create(); 
    FileSystem fs = FileSystem.get(conf); 

    Path file = new Path(segment, Content.DIR_NAME + "/part-00000/data"); 
    SequenceFile.Reader reader = new SequenceFile.Reader(fs, file, conf); 

    try 
    { 
      Text key = new Text(); 
      Content content = new Content(); 

      while (reader.next(key, content)) 
      { 
        System.out.println(new String(content.GetContent())); 
      } 
    } 
    catch (Exception e) 
    { 

    } 
0

在apache Nutch 2.3中。1
您可以保存編輯原始的HTML代碼的Nutch首先通過以下https://wiki.apache.org/nutch/RunNutchInEclipse

您結束在eclipse編輯文件FetcherReducer.java ruunning後的Nutch在Eclipse中運行Nutch的,這個代碼添加到輸出方法,運行ant再次蝕重建類

最後,原始的HTML將加入到reportUrl列在你的數據庫

if (content != null) { 
ByteBuffer raw = fit.page.getContent(); 
if (raw != null) { 
    ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(raw.array(), raw.arrayOffset() + raw.position(), raw.remaining()); 
    Scanner scanner = new Scanner(arrayInputStream); 
    scanner.useDelimiter("\\Z");//To read all scanner content in one String 
    String data = ""; 
    if (scanner.hasNext()) { 
     data = scanner.next(); 
    } 
    fit.page.setReprUrl(StringUtil.cleanField(data)); 
    scanner.close(); 
}