【Python】mechanize で Web スクレイピング

Pythonでスクレイピング

開発中のシステムでWEBスクレイピングの必要性があったので、Pythonを勉強中です。
Perl でも Ruby でも良かったのですが機械学習系ライブラリの豊富さと NumPy, Pandas なども揃っているので決めました。

BeautifulSoup

BeautifulSoupはHTML/XMLパーサーです。
セッション管理していないWEBサイトはこれだけで充分使えます。

環境は MacOS X 10.8.2 です。

公式からtar.gzをゲット後展開してインストールするか,

$ sudo python setup.py install 

以下で直接インストールします。(すでに上で入れてました…)

$ sudo easy_install BeautifulSoup4
Searching for BeautifulSoup4
Best match: beautifulsoup4 4.1.3
Adding beautifulsoup4 4.1.3 to easy-install.pth file

mechanize

BeautifulSoupはパーサーなので認証を行うサイトの突破には不十分です。
mechanizeならセッションの保存などを自動的に行ってくれるので、認証系サイトのスクレイピングを行うことが可能です。

$ sudo easy_install mechanize
Searching for mechanize
Reading https://pypi.python.org/simple/mechanize/
Reading https://wwwsearch.sourceforge.net/mechanize/
Best match: mechanize 0.2.5
Downloading https://pypi.python.org/packages/source/m/mechanize/mechanize-0.2.5.tar.gz
Processing mechanize-0.2.5.tar.gz
Running mechanize-0.2.5/setup.py -q bdist_egg --dist-dir /tmp/easy_install-mAAKN4/mechanize-0.2.5/egg-dist-tmp-JgQmKq
Adding mechanize 0.2.5 to easy-install.pth file

mechanizeによるフォーム解析

フォームの情報を取得する例です。

br = mechanize.Browser()
br.open("https://www.google.co.jp")
print [form for form in br.forms()][0]
<f GET https://www.google.co.jp/search application/x-www-form-urlencoded
  <HiddenControl(ie=Shift_JIS) (readonly)>
  <HiddenControl(hl=ja) (readonly)>
  <HiddenControl(source=hp) (readonly)>
  <TextControl(q=)>
  <SubmitControl(btnG=Google ????) (readonly)>
  <SubmitControl(btnI=I'm Feeling Lucky) (readonly)>
  <HiddenControl(gbv=1) (readonly)>>

HTTPメソッドと入力できる情報が取得できます。
この情報を用いてログインID, パスワードを渡すようにします。

Python2系は文字コードが混在しているのがちょっと難点。
主要なライブラリが3系に移行したらPython3に変えてもいいかもしれません。