web-dev-qa-db-ja.com

Webサイトをスパイダーし、URLのみを返す

Webサイトを擬似スパイダーする方法を探しています。重要なのは、実際にコンテンツが欲しいのではなく、URIの単純なリストが欲しいということです。 Wget を使用して--spiderオプションですが、grepを介してその出力をパイピングするとき、それを機能させる適切な魔法を見つけることができないようです。

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

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

[〜#〜] update [〜#〜]

それで、デフォルトでwgetがstderrに書き込むことをオフラインで見つけました。私はマニュアルページでそれを見逃しました(実際、そこにある場合はまだ見つかりませんでした)。リターンを標準出力にパイプすると、必要なものに近づきました。

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

私は、もしあれば、この種のことをするための他の/より良い手段に興味があります。

57
Rob Wilkerson

絶対的なlast私がやりたいことは、すべてのコンテンツを自分でダウンロードして解析することです(つまり、自分のスパイダーを作成します)。 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を送信できます。

出力はまだ少し合理化する必要があります(上記のように重複を生成します)が、ほとんどそこにあり、自分で解析する必要はありません。

47
Rob Wilkerson

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

<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はStream EDitor unixユーティリティで、フィルタリングおよび変換操作を可能にします。

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/
...
21
Jay Taylor

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

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

6
Rick