67

Webサイトを疑似スパイダーする方法を探しています。重要なのは、実際にはコンテンツではなく、URIの単純なリストが必要なことです。オプションを使用してWgetを使用すると、このアイデアにかなり近づくことができ--spiderますが、その出力をで配管する場合、grepそれを機能させるための適切な魔法を見つけることができないようです。

wget --spider --force-html -r -l1 http://somesite.com | grep 'Saving to:'

フィルタは出力grepにまったく影響を与えないようです。wget何か問題がありますか、それともこの種の限定された結果セットを提供することを目的とした別のツールを試す必要がありますか?

アップデート

だから私はオフラインで、デフォルトでwgetstderrに書き込むことを知りました。私はmanページでそれを見逃しました(実際、それがそこにある場合、私はまだそれを見つけていません)。リターンをstdoutにパイプ処理すると、必要なものに近づきました。

wget --spider --force-html -r -l1 http://somesite.com 2>&1 | grep 'Saving to:'

この種のことを行うための他の/より良い手段があれば、私はまだ興味があります。

4

3 に答える 3

62

私がしたい絶対的な最後のことは、すべてのコンテンツを自分でダウンロードして解析することです(つまり、自分のスパイダーを作成します)。Wgetがデフォルトでstderrに書き込むことを知った後、それをstdoutにリダイレクトし、出力を適切にフィルタリングすることができました。

wget --spider --force-html -r -l2 $url 2>&1 \
  | grep '^--' | awk '{ print $3 }' \
  | grep -v '\.\(css\|js\|png\|gif\|jpg\)$' \
  > urls.m3u

これにより、スパイダーされたコンテンツリソース(画像、CSS、またはJSソースファイルではないリソース)のURIのリストが表示されます。そこから、URIをサードパーティのツールに送信して、ニーズに合わせて処理することができます。

出力はまだわずかに合理化する必要があります(上記のように重複が生成されます)が、ほぼそこにあり、自分で解析する必要はありません。

于 2010-05-14T11:52:24.923 に答える
24

いくつかの正規表現を作成して、すべてからアドレスを抽出します

<a href="(ADDRESS_IS_HERE)">.

これが私が使用する解決策です:

wget -q http://example.com -O - | \
    tr "\t\r\n'" '   "' | \
    grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \
    sed -e 's/^.*"\([^"]\+\)".*$/\1/g'

これにより、Webページからすべてのhttp、https、ftp、およびftpsリンクが出力されます。相対URLは提供されず、完全なURLのみが提供されます。

一連のパイプコマンドで使用されるオプションに関する説明:

wget -qを使用すると、過剰な出力が発生しなくなります(クワイエットモード)。wget -O-は、ダウンロードしたファイルがディスクに保存されるのではなく、stdoutにエコーされるようにします。

trはUNIX文字トランスレータであり、この例では、改行とタブをスペースに変換し、正規表現を簡略化できるように一重引用符を二重引用符に変換するために使用されます。

grep -iは、検索で大文字と小文字を区別しないようにします。grep -oは、一致する部分のみを出力します。

sedは、フィルタリングおよび変換操作を可能にするStreamEDitorunixユーティリティです。

sed -eを使用すると、式をフィードできます。

「 http://craigslist.org 」でこの小さなスクリプトを実行すると、かなり長いリンクのリストが生成されました。

http://blog.craigslist.org/
http://24hoursoncraigslist.com/subs/nowplaying.html
http://craigslistfoundation.org/
http://atlanta.craigslist.org/
http://austin.craigslist.org/
http://boston.craigslist.org/
http://chicago.craigslist.org/
http://cleveland.craigslist.org/
...
于 2010-05-10T17:06:33.950 に答える
7

xidelというツールを使用しました

xidel http://server -e '//a/@href' | 
grep -v "http" | 
sort -u | 
xargs -L1 -I {}  xidel http://server/{} -e '//a/@href' | 
grep -v "http" | sort -u

少しハックですが、あなたを近づけます!これは最初のレベルにすぎません。これを自己再帰スクリプトにパックすることを想像してみてください!

于 2013-05-09T16:37:05.213 に答える