poorな環境でのスクレイピングのやり方(あるいはshell script mechanize)

wgetぐらいしか無いようなpoorな場所で、WebページスクレイピングをShell Scriptで書いてみる。

キモはwgetのオプション。 重要なのは下記の3つを付与すること。

  • --save-cookies=<Cookieファイル名> <cookieファイル名>にCookieを保存してくれる。
  • --load-cookies=<Cookieファイル名> <cookieファイル名>があればCookieを読んで、リクエスト時に送信してくれる。
  • --keep-session-cookies TTLがSessionのCookieも保存してくれる。

shで書くときには下記のようにaliasを切って使う事が多い。

alias mywget="wget -q -O - --save-cookies=${cookie_file} --load-cookies=${cookie_file} --keep-session-cookies"

あとは

# login 時のPOST
mywget --post-data "user_id=${user_id}&password=${password}" http://www.example.com/login > /dev/null

# データのGET
mywget http://www.example.com/some/list.csv > my_list.csv

のようにリクエストを五月雨で打っていけば、大抵のWebサイトなら読み書き出来る。

JSONで返ってくるような場合はjqを、XMLで返ってくるような場合はxmllintでゴニョゴニョやるのが良さそう。 特にjqはバイナリ一本で動くのでポータブルでよろしい。