0

Web ページをクロールし、キーワードをその頻度とともに保存したいと考えています。たとえば、URL: http://www.dmoz.org/Arts/からカテゴリ Arts をクロールし、単語のリストを頻度とともに保存します。だから私は次の出力が欲しい

単語頻度
映画 400
歌 100
雑誌 120

それを達成する最も簡単な方法はどれですか?どの言語のツールやライブラリも非常に役立ちます。

4

1 に答える 1

1

では、行きましょう。

(20110316 の主に文法のためのマイナーな編集)

問題に対する最も単純で、本番環境に対応していない解決策を紹介する時間しかありません。1 回限りのソリューションが必要な場合は、これにより多くの時間を節約できます。プロダクション レベルのツールを探している場合は、これをまったく別の方法で行う必要があります。特に、html を単純なテキストに煮詰める方法です。ここで「awk html parser」を検索して、このソリューションがどれほど間違っているかを確認してください;-)(これについては以下で詳しく説明します)...とにかく...

1 -- ファイルへのスパイダー/キャプチャ テキスト

wget -nc -S       -r -l4 -k -np -w10 --random-wait  http://www.dmoz.org/Arts/
     #noClobber
         #server Responses
                # -r recursive
                    # -l4 4 levels
                     # -k (convert) make links in downloaded HTML point to local files.
                        # -np no-parent.  don't ascend to the parent directory.
                              #  -w10 wait 10 secs between
                                    # --random-wait randomize that 10 secs above from 0-10

これにより、すべての www.dmoz.org ファイルが、www.dmoz.org を先頭にして現在のディレクトリのディレクトリ構造に配置されます。必要に応じて、そこに移動して生データを表示します。

2 -- 必要最小限の HTML ストリッパー スクリプトを次のように作成します。

$: cat rmhtml3

#! /bin/awk -f
{
        gsub(/[{<].*[>}]/, "")
        gsub("&nbsp;", "")
        gsub(/[ \t][ \t]*/, " ")
        if ($0 !~ /^[ \t]*$/) {
                print $0
        }
}

これにより、「awk での html の解析についても気にしないでください」という警察が私たちに降りかかります ;-) ので​​、上記よりもクリーンな仕事をする単純なコマンド ライン xslt プロセッサ (またはその他) を誰かが推奨するかもしれません。私は最近、これのいくつかを理解し、UNIX スクリプト環境に適合する適切なソリューションを探しています。または、 Wikipedia の webCrawlers エントリにリストされているオープンソースの Web クローラーを確認できます。

3 -- 大きな UNIX パイプラインを作成して、必要な出力を取得します。

find . -name '*.html' | xargs ./rmhtml3 \
| awk 'BEGIN {RS=" ";};{ print $0}' \
| sort | uniq -c \
| sort +0n | tail -50

これを簡単に分解して、各フェーズがプロセスに追加するものを確認できます。

珍しいビットは

awk 'BEGIN{RS=" ";};{print $0}'

これにより、awk RecordSeparator がスペース char にリセットされ、各単語が個別の行に出力されます。

次に、それらを並べ替え、一意のアイテムの数を取得し、並べ替え出力の先頭の番号で並べ替え、最後の 50 エントリのみを表示するのは簡単です。(明らかに、これを便利だと思われる任意の数に変更できます。)

すべてのノイズ ワード (the、at、it、.... など) を見たくない場合は、それらの単語をファイルに入れて使用します。

.... | fgrep -vif skipwords | sort | uniq -c ...

4 -- スパイダーを 1/2 時間実行した後の出力を見ていると、パイプラインに追加したいものが他にもいくつかあることがわかります。これは演習として残しておきます ;-)

   sort -i # ignore upper-lower case while sorting
   sed 's/[,]//g  # delete all commas. Add any other chars you find inside the []

これが役立つことを願っています

于 2011-03-15T16:38:04.833 に答える