Python3にMechanizeはないのでMechanicalSoupを使え!!

概要

Python3にMechanizeはない!!!

Webサイトとのやり取りを自動化するためにMechanizeを使いたい。しかし、Python3との互換性がなく開発が非アクティブです。しかし、Mechanizeの使い慣れたAPIを使いたいユーザも多い。MechanicalSoupはPython3に対応したライブラリでありながらMechanizeと同様のAPIを提供しています。 (githubからの引用)

これが嘘だと分かるブログである。

環境構築

環境

インストール

$sudo pip3 install MechanicalSoup

import

import mechanicalsoup

はい、完了!!!

確認事項

  • 取得後の用途に問題は無いか
  • 欲しい情報にAPIが存在しないか

取得後用途には結構厳しい制約があるので各自、確認お願いします。また、APIがあればAPIを使ったほうが安全です。しかし、提供されているAPIがイケてない…。スクレイピングするときは、くれぐれも相手のサイトに負荷をかけないように間隔をあけて作業するようにプログラムを組むことが求められる。

How to used

写真を任意のユーザーと共有したい時に使うべきWebサイトです(笑)

このページに対してログインを後タイトルの取得を行ってみようと思います。

login方法の解析

<div class="input_t">
            合い言葉を入力してください
          </div>
          <p>
            <input id="password" name="password" tabindex="1" type="text" class="input_text_large" />
          </p>
<div class="submit_center">
            <input id="submit_image" tabindex="2" type="image" src="/assets/album/btn_album_login_active-3eb371f7b48ecf30b3578e3ac2cfc344.gif" value="アルバムを見る" />
          </div>
          <p>共有のコンピュータをお使いの方は、写真を見終わったらブラウザを終了してください。</p>
        </div>

ここでログインに必要なのがpasswordの入力とsubmitだけと分かりますね♥。

ログイン後タイトルを取得しましょう。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import mechanicalsoup
import time

URL_login = "***"
#URL/ユーザー名/アルバム番号/login
URL_get = "***"
#URL/ユーザー名/アルバム番号/
password = "***"

#ブラウザ起動
br = mechanicalsoup.Browser()
#login pageの指定
login_page = br.get(URL_login)

#ログインフォームをしていする。
#br.select_form(nr=0)と同じような意味
login_form = login_page.soup.select("form")[0]

#値の入力
login_form.select("#password")[0]['value'] = password
#submit フォーム
br.submit(login_form,login_page.url)

time.sleep(5)
page = br.get(URL_get)
print(page.soup.title.text)

結果

  • Mechanizeほどの手軽さがなくbs4のような機能もあるためとっつきにくい
  • Mechanizeの後継を謳いながら全体として大きく仕様が変わっているので使いにくさが否めない。
  • 一つのサービスに一つの機能の枠から大きく外れるが慣れるとこれも楽

参考

GitHub - MechanicalSoup/MechanicalSoup: A Python library for automating interaction with websites.

岡崎市立中央図書館事件 - Wikipedia