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とか書いてみようと思います。
