mechanizeちょうべんり

長い休み明けぐらいはまともな記事で。
はてブやらtwitterやらは記事をまとめて書く気力を失わせるな…


最近、業務でサイト上での作業の自動化を検討してたところ、見つけたのがmechanize
元は
perlのWWW::Mechanizepythonに移植したもので、要はブラウザの動作をスクリプトでシミュレートするというもの。
これを使うとurllib2あたりで一々GET/POSTを書かなくても、「ここをクリックしてこのフォームに文字を入力…」みたいな感覚でWebサーバとのアクセスをスクリプトで記述できる。
使い方は本家サイトや後述するサイトを参考して頂くとして、簡単なTipsを。

ファイル選択フォームを使ってファイルをアップロードしたい

Formでファイル入力タイプの項目(input type="file")があった場合はadd_file()メソッドを使う。

from mechanize import Browser

br = Browser()
br.open("http://www.example.com/")
# 使うフォームを指定
br.select_form(nr=1)
# フォームにファイル情報をセット
br.form.add_file(open("hoge.txt"), "text/plain", "hoge.txt")
br.submit()

引数は見ての通りファイルオブジェクト、MIME type、ファイル名の順。
注意点として、バイナリファイル(excelファイルとか)を送信する場合はちゃんとバイナリモードで開く事を忘れないこと。俺は見事に嵌りました。

br.form.add_file(open("hoge.xls", "rb"), "application/vnd.ms-excel", "hoge.xls")

何やっても500が返ってくるからしばらく悩みまくった…

デバッグのためにhttpヘッダなどを表示させたい。

set_debug_http()を使う。

br.set_debug_http(True)

出力先はstdout。
リダイレクトや応答のログ落としにはset_debug_redirects()やset_debug_response()を使う。

フォーム項目がreadonlyで入力しようとしてもエラーになる

mechanizeを使ってreadonlyのフィールドに無理やり値をセットするサンプル - bonlife
参考。
id:bonlife GJ!


あとはpydocでも読んでください。(なげやり)