【python】mechanizeのインストール・使い方

クローリング、スクレイピングと言った言葉をよく耳にしますが、
pythonでこれらを実装するために使えそうな
モジュールの使い方を紹介します。
 
 
 


使用環境

$ uname -a
Linux ***-E200HA 4.4.0-112-generic #135-Ubuntu SMP Fri Jan 19 11:48:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ python --version
Python 2.7.12

 
 
 


mechanizeのインストール

pipで簡単にインストールできます

$ sudo pip install mechanize

 
 
 


mechanizeのインポート

まずはpythonを起動してmechanizeライブラリをインポートします。

$ python
>>> import mechanize

 
 
 


mechanizeでHTMLを読み込む

>>> br = mechanize.Browser() #ブラウザのインスタンスを作る
>>> br.open("URL") #URLを例えば"http://bttb.s1.valueserver.jp/wordpress/"に置き換える
>>> html = br.read() #htmlには取得した文字列(HTMLで書かれた文章)が入る
>>> print html

 
以下のようなメッセージが表示されることがありますが、
オープン自体はできているようなので、
以下のようにすることでそのまま使うことができます。

>>> br = mechanize.Browser() #ブラウザのインスタンスを作る
>>> br.open("URL")
<response_seek_wrapper at 0x7f336301cab8 whose wrapped object = <closeable_response at 0x7f33627697a0 whose fp = <socket._fileobject object at 0x7f3363046550>>>
>>> response = br.response()
>>> html = response.read()
>>> print html

 
 
 


robots.txtを無視してHTMLを読み込む

robots.txtとはロボット(クローラー)に対する
成約が書かれているファイルのことです。
上のようにbr.open()とした時、robots.txtで成約を受けていると
エラーがでます。

Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 254, in open
    return self._mech_open(url_or_request, data, timeout=timeout)
  File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 310, in _mech_open
    raise response
mechanize._response.httperror_seek_wrapper: HTTP Error 403: request disallowed by robots.txt

mechanizeではrobots.txtを無視することもできます。
その場合は以下のようにします。

>>> br = mechanize.Browser() #ブラウザのインスタンスを作る
>>> br.set_handle_robots(False) #robots.txtを無視するという設定
>>> br.open("URL") #URLを例えば"http://bttb.s1.valueserver.jp/wordpress/"に置き換える
>>> response = br.response()
>>> html = response.read()
>>> print html

ただし、技術的には上記の通り可能ですが、
robots.txtの成約を無視するのはやめましょう。

 
 
 


mechanizeでリンクを探す

リンクに含まれる文字列を検索することができます。

>>> br.find_link(text_regex = 'example')
Link(base_url='http://bttb.s1.valueserver.jp/wordpress/blog/2018/04/17/makeos/', url=u'http://bttb.s1.valueserver.jp/wordpress/blog/category/linux/', text=u'linux', tag=u'a', attrs=[(u'href', u'http://bttb.s1.valueserver.jp/wordpress/blog/category/linux/'), (u'rel', u'category tag')])


 
 

以下のようにURLを検索することもできます。

>>> br.find_link(ulr_regex = 'example')
Link(base_url='http://bttb.s1.valueserver.jp/wordpress/blog/2018/04/17/makeos/', url=u'http://bttb.s1.valueserver.jp/wordpress/blog/category/linux/', text=u'linux', tag=u'a', attrs=[(u'href', u'http://bttb.s1.valueserver.jp/wordpress/blog/category/linux/'), (u'rel', u'category tag')])

 
 
 


mechanizeでリンクをクリック

>>> br.follow_link(text_regex = 'linux')
<response_seek_wrapper at 0x7fec85ad5050 whose wrapped object = <closeable_response at 0x7fec849c39e0 whose fp = <socket._fileobject object at 0x7fec849faad0>>>


これでリンク先に遷移します。

 
 
 


mechanizeでフォームに任意の文字を入力

試しに、本ブログにコメントを送信してみます。

>>> br = mechanize.Browser() #ブラウザのインスタンスを作る
>>> br.open("http://bttb.s1.valueserver.jp/wordpress/blog/2018/04/17/makeos/")
>>> br.select_form(nr=1)
>>> br['comment'] = 'hoge'
>>> br['author'] = 'bttb'
>>> br['email'] = 'abc123@fuga.jp'
>>> response = br.submit()
>>> print response.read()

分かりづらいので解説します。
select_form()でフォームを選択しています。
もし、name=’hoge’のように名前が決まっているようであれば
select_form(name=’hoge’)
のように指定することができます。
決まっていない場合は

select_form(nr=0) #0番目
select_form(nr=1) #1番目

のように順番で指定することもできます。

そして入力欄にそれぞれ値を入力して
submit()でコメントを送信しています。

上記のサンプルでいうところの、
‘comment’
‘author’
‘email’
というのはどのようにして確認したかというと、
ブラウザの開発ツールを使います。

Firefoxでは
ツール→ウェブ開発→開発ツールを表示
で開くことができます。
対象のページで開発ツールを表示させると
そのページのソースが見れます。

今回試したページの一部を掲載します。

 
 
 


その他いろいろ

>>> response = br.open('url')
>>> print br.title() #タイトルを表示
>>> print response.info() #HTMLヘッダーを表示
>>> print response.read() #HTMLボディを表示
>>> br.back() #戻る
>>> br.reload() #再読み込み

 


 
 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です