URLとXPath指定で極悪ぶっこ抜きを行うツールexthtmlのおぼえがき

未来の自分向け

gistに置くことにしました。

http://gist.github.com/40029

いろいろ依存してるモジュールがあるけど、ぜんぶ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
w
次のページに辿るときにこの秒数待つ。
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

ある語を含むWikipediaの見出し語一覧をつくる

%  exthtml -X '//li[@class="nomarker"]/a' /-n '//div[@class="paging"][last()]/a[last()]/@href' /
-d 50 "http://wpedia.goo.ne.jp/list/?w=マラ" > mala.txt

日本の名字一覧を作る

exthtml -X '//tt/a[contains(@href, 'name')]/@href' \
http://www.myshop.co.jp/japancal/fname/name.htm \
| exthtml -X '//a[contains(@href, 'name')]/@href' - \
| perl -ne 'print $_ if /http:.*[01]\d{2,3}/' | sort | uniq \
| exthtml -X '//tr/td[1]/text()' - > myoji.txt

CiNiiのURLリストから論文PDFをダウンロードしまくる

ダウンロードできるブラウザを騙ってから

exthtml -X '//h3[@class="entry"]/a[1]/@href' \
'http://b.hatena.ne.jp/yuiseki/?url=http://ci.nii.ac.jp/' \
| exthtml -X '//a[./img[@alt="CiNii PDF"]]/@href' \
-p '`wget \"$v\"`' -

ToDo

changed March 30 delete history edit