2016-11-01 1 views
0

良い精度を得るためにいくつかのWebページを使用してNLPモデルを訓練したいと思います。 私はWebページを持っていないので、Amazon EMRでWebクローラーを使用することを検討しています。 私は、robots.txtルールを尊重した、拡張性のある拡張性の高いオープンソースソリューションを使いたいと思っています。いくつかの研究の後、私はApache Nutchを採用することに決めました。Nutch 2.3.1で取得されたページの生のHTMLを取得する

Nutchの主な投稿者Julien Niocheによるthis videoが発見されました。 最新バージョンのHadoop(Amazon 2.7.3)とNutch(2.3.1)を使用していましたが、小さなサンプルジョブを正常に完了できました。

しかし、私はNutchの出力から生のhtmlファイルを取得する簡単な方法を見つけることができませんでした。この問題の解決策を探しているうちに、Nutch自身のwikitutorialページに加えて、他にも役立つリソースがいくつか見つかりました。

それらのいくつか(のようなthis answerまたはthis pageは)新しいプラグイン(または既存のものを修正する)を実装することをお勧め:全体的なアイデアは、実際にファイルの内容を保存する数行のコードを追加することですフェッチされたhtmlページがセグメントに送信される前に。

その他のもの(this answerなど)は、セグメントにアクセスし、そこに含まれるすべてのレコードを調べ、htmlページのように見えるコンテンツをファイルに保存する簡単な後処理ツールを実装することを推奨します。

これらのリソースはすべて、(多かれ少なかれ正確な)説明とコード例を含んでいますが、非常に古いバージョンのNutchを参照しているため、実行しようとしたときには運がありませんでした。また、Nuth 2.3.1にそれらを適用しようとする私の試みは、リソース/文書の不足のせいで失敗しました。

たとえば、私はHtmlParserparse-htmlプラグインのコア)の末尾に次のコードを付加しますが、指定したフォルダに保存されます、すべてのファイルが空である:他には

String html = root.toString(); 
if (html == null) { 
    byte[] bytes = content.getContent(); 
    try { 
     html = new String(bytes, encoding); 
    } catch (UnsupportedEncodingException e) { 
     LOG.trace(e.getMessage(), e); 
    } 
} 
if (html != null) { 
    html = html.trim(); 
    if (!html.isEmpty()) { 
     if (dumpFolder == null) { 
      String currentUsersHomeFolder = System.getProperty("user.home"); 
      currentUsersHomeFolder = "/Users/stefano"; 
      dumpFolder = currentUsersHomeFolder + File.separator + "nutch_dump"; 
      new File(dumpFolder).mkdir(); 
     } 
     try { 
      String filename = base.toString().replaceAll("\\P{LD}", "_"); 
      if (!filename.toLowerCase().endsWith(".htm") && !filename.toLowerCase().endsWith(".html")) { 
       filename += ".html"; 
      } 
      System.out.println(">> " + dumpFolder+ File.separator +filename); 
      PrintWriter writer = new PrintWriter(dumpFolder + File.separator + filename, encoding); 
      writer.write(html); 
      writer.close(); 
     } catch (Exception e) { 
      LOG.trace(e.getMessage(), e); 
     } 
    } 
} 

場合は、代わりに、私は(それがプロローグに言及したが、それはまた私のパズルので、私は好き)、次のエラーを得た:

[Fatal Error] data:1:1: Content is not allowed in prolog. 

ので、Nutchの1.xのに自分の設定をダウングレードすることを検討する前に、私の質問は:いずれかを持つあなたは最近のバージョンのNutchでこの問題に直面し、それをうまく解決しなければなりませんでしたか?

もしそうなら、あなたはそれをコミュニティと共有したり、少なくともソリューションへの有用な指針を提供できますか?

事前に感謝します。


PS:あなたが適切にIntelliJのにNutchのソースを開く方法を疑問に思う場合は、this answerは実際には正しい方向に向けてあなたを指している可能性があります。

+0

の重複http://stackoverflow.coにreportUrl欄に追加されるクラスに再構築するために、再度アリ日食を実行しますm/questions/10098169/map-reduce-friendly-format-rq = 1のWebページから抽出されたWebページ。 –

答えて

1

動画が見つかったらうれしいです。 NLPモデルを訓練するためのWebページだけが必要な場合は、なぜCommonCrawlデータセットを使用しないのですか?それは何十億ものページを含み、無料で大規模なWebクローリングの手間を省くでしょうか?

質問に答えるには、カスタムIndexWriterを記述し、必要なページの内容を書き込むことができます。私はNutch 2.xを使用しません。なぜなら、1.xはより速く、より多くの機能を持ち、使いやすくなっています(私は実際にStormCrawlerをもっと好むが、私は偏っています)。 Nutch 1.xにはCommonCrawlで使用されているのと同じWARC形式でデータダンプを生成できるWARCExporterクラスがあります。さまざまな形式でエクスポートするための別のクラスもあります。

+0

非常に緑豊かな! すべての有用なヒントをお寄せいただきありがとうございました。 –

+0

あなたは歓迎されていますが、上記の答えを受け入れてマークアップして、それをアップビューしてください –

0

あなたはNutchのコード は、まずあなたが日食の編集ファイルFetcherReducer.javaでNutchのをruunning終わったらhttps://wiki.apache.org/nutch/RunNutchInEclipse

に従うことにより、EclipseでNutchのを実行し、編集することによって、生のHTMLを保存することができ、 は、出力メソッドにこのコードを追加します、

が最後に生のHTMLは、データベースおそらく

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(); 
    } 
関連する問題