2013/05/07
by admin
0 comments

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

PythonでWEBスクレイピング

今つくっているシステムでWEBスクレイピング(webからの自動データ抽出)の必要性があったので、Pythonを勉強中です。
perlでもrubyでも良かったのですがラズベリーパイでも少し触ってたのとインターネットスクリプティング系のライブラリもありそうなので決めました。(注)perl/rubyにもあります。


体感的にPythonはCの3倍くらいの生産性があるように思います。
手を加えずにwin/linux/macとどこでも動くのもイイですね。仕事でもシェルの代わりに活躍してくれそう。

やりたい事はけっこう処理が重くなりそうので、先人のお話だと部分的にCで書いた方がいいかもってことは頭の片隅に置いときます。
(pipe的な使い方もできるってこと)

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 http://pypi.python.org/simple/mechanize/
Reading http://wwwsearch.sourceforge.net/mechanize/
Best match: mechanize 0.2.5
Downloading http://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やパスワードを渡すようにします。

UnicodeDecodeError: ‘ascii’ …の対処

上記エラーの対処法。asciiからutf-8に変更する方法です。
/usr/lib/python2.7/site.pyのdef setencoding():の

encoding = “ascii” # Default value set by _PyUnicode_Init()
を encoding = “utf-8″ に書き換えます。

次回は…

まだ、ごく簡単な使い方しかしてないので次回は自動POSTとか書いてみようと思います。