URLとXPath指定で極悪ぶっこ抜きを行うツールexthtmlのおぼえがき
未来の自分向け
http://fuba.moaningnerds.org/src/exthtml.pl
いろいろ依存してるモジュールがあるけど、ぜんぶCPANにあるので適当にとってきてください。
- 基本的な使い方としては-xでxpath, 最後の引数がURL
- 強力なオプションとして-nで次のページのURLを示すXPathなどなど
- めんどくさいので設定ファイル読むようにはしないつもり
- ふだんつかう設定はaliasでも使って書いとくとべんりですね。
alias exthtml="perl /Users/ec/bin/exthtml.pl -a Mozilla -c ~/Library/Cookies/Cookies.plist"
Options
- x | xpath
- 抽出対象となるノード、リストのXPath
- e | referer
- リファラ
- c | cookie-jar
- cookieのパス
- a | agent
- UA
- n | nextlink
- 次のページのURLを示すXPath、//a/@hrefみたいなかんじでちゃんと属性値指定しないとだめ
- d | depth
- 次のページ辿る回数、デフォルトは0
- s | as-source
- HTML::Elementがヒットしてた場合はHTMLを吐く
- f
- 抽出対象となっているURLを結果出力前に1行吐き、結果にはタブが頭に入ってる。使い道よくわからないのでそのうち仕様かえるとおもう。
- p | procedure
- perlコードをわたせる、$vには出力される値(文字列)、$nにはマッチしたノード、$uには現在抽出対象になってるページのURL(URIのオブジェクト)、コード中で最後に評価された値が出力とおきかわる。
- URLのかわりに -
- 標準入力から一行ずつURLをよむ
cookbook
cookie、UAはaliasで設定ずみという前提で。 あとよくでてくる
% xargs -n1 curl -O
は、標準入力に与えられたURLを1行ずつcurlでダウンロードします。その仕様でいろいろ固有の問題を解決する自前ダウンローダをつくってURLだけでよきにはからってくれるようにしとくとべんりかなーとおもったけど、pオプションを使ってバッククォートで実行したほうが今はもう楽かもしれません。
簡単にできる大量画像一括保存
GUIむずかしくてぼくわかりません
% exthtml -X '//a[contains(@href, ".jpg")]/@href' -p 'if($v!~/s\.jpg/){`curl -O $v`}' \
http://ansokuwww.blog50.fc2.com/blog-entry-203.html
TwitterのFollowingリストをつくる
FollowersリストもURL変えるだけでできるので、diffもかんたんにとれますね。
% exthtml -X '//a[contains(@class, "uid")]' \ -n '//div[@class="pagination"]/a[contains(text(), 'Next')]/@href' \ -d 100 http://twitter.com/friends > following.txt
ためしに4U元画像ぜんぶダウンロード
http://d.hatena.ne.jp/kusaker/20080621/1214063713 をhtmlextをつかってやってみる。
% for url in http://4u.straightline.jp/\?page={1..327}; do echo $url; done \
| exthtml -X "//p[@class='entry-img-src']" -\
| perl -ne 's/\?v\=\d+//;print "http://$_"' \
| xargs -n1 curl -O
zshのブレース展開をつかってURLを展開、URLリストに対してexthtmlを適用し、perlでflickr対策、ダウンロード。どうかんがえても最初のforの中で実行したほうがいいですね。
二次裏imgの新着カタログ画像をぶっこぬく
モザイクでも作ればたのしそうですね。
% exthtml -X "//td/a/img/@src" -p '`curl -O $v`' "http://img.2chan.net/b/futaba.php?mode=cat"
はてブのfavoritesを使って観測範囲ブックマークランキングをつくる
5ページ辿ってsort|uniq -c|sortでランキング。
% exthtml -X "//a[@class='bookmark']/@href" \ -n '//div[@class="pager"]/p/a[last()]/@href' \ -d 5 http://b.hatena.ne.jp/fuba/favorite \ | sort | uniq -c | sort -r 8 http://blog.yappo.jp/yappo/archives/000594.html 5 http://tunes.labolo.net/ 4 http://www.akiyan.com/blog/archives/2008/06/post_112.html 4 http://d.hatena.ne.jp/Yoshiori/20080630/1214814814 3 http://www8.atwiki.jp/mainichi-matome/pages/26.html 3 http://www.zakzak.co.jp/top/2008_06/t2008063010_all.html 3 http://www.itmedia.co.jp/bizid/articles/0806/30/news045.html 3 http://www.gizmodo.jp/2008/06/windows_8.html
Tumblrのdashboardの画像をかたっぱしからダウンロード
ダウンロード先ディレクトリをOSのスクリーンセーバに指定してcronで回したりするとたのしそうですね。
% exthtml -X "//img[@class='image']/@src" -n "id('pagination')/a/@href" \
-d 10 -p 'if($v=~s/_400\./_500\./){$v}' \
http://www.tumblr.com/show/photos/by/everyone
| xargs -n1 curl -O
photo.awalker.jp
再配布すると危険なものは自分であつめましょう
% exthtml -X '//a[contains(@href, "http://photo.awalker.jp/pup.php?ID=")]/@href' \ -n '//a[contains(text(), "次")]/@href' -d 5 http://photo.awalker.jp/*****/ \ | exthtml -X '//img/@src' -p '`curl -e \"$u\" -O $v`' -
はてブがかぶりがちな人リストを作る
おすすめユーザ的なアレ。tamaotをフォローしたっ
% exthtml -X '//dd[@class="users"]//a/@href' \ -n '//div[@class="pager"]/p/a[last()]/@href' -d 10 http://b.hatena.ne.jp/fuba/ \ | exthtml -X '//li/a/img/@alt' - | sort | uniq -c | sort -r 50 fuba 26 Ubuntu 11 yuiseki 6 ultraist 5 lurker 4 yachimon 4 tamaot 4 retlet 4 otsune 4 hejihogu 3 yamifuu 3 westerndog 3 pikayan 3 nyancy1011 3 nisshi9 3 nekozea 3 momonger 3 memoclip 3 korn_freak 3 koakoa_view 3 hirose504 3 graph 3 fs001493 3 denken 3 cloverleaf24 3 bunoum 3 brainparasite 3 WinterMute 3 I11 3 F-name 3 Doen
筒井康隆の最新の日記の画像をぶっこぬく
% exthtml -X '//a[@class="book-cover-link-new"]/@href' http://shokenro.jp/shokenro/book-cover/ \ | exthtml -X '//img[@width="740"]/@src' -d 3 \ -n "//div[contains(@class, 'book-contents-pagelink-left book-contents-pagelink')]/a/@href" - http://shokenro.jp/img/17 http://shokenro.jp/img/18
高遠るいのマンガでわかるソウルキャリバーをぶっこぬく
最後のページの次へのリンクが最初のページにループしてるけど、同じページには辿れない仕様になってるのでページ数は考えずにてきとうに10とかにしちゃってもだいじょうぶです。
% exthtml -X 'id("photorep_current_img")//img/@src' -n '//a[@class="next black"]/@href' \
-d 10 http://japan.gamespot.com/slideshow/story/0,3800079162,20376026,00.htm
ToDo
- Windows対応
- WindowsだとEncode::Detect削除と、オプションをsjisでdecodeするようにしたら動いた
- Encode::Detectはevalで逃げ
- オプションはいい方法さっぱりわからない、App::なんとかからなんとかしてるフレームワークをさがしてみる、あるのかな
- とりあえず定数にして変更箇所へらした
- ロケールはWindowsでもつかえるっぽい
- App::なんとかにしたいですね