環境:Windows10Pro64bit、Ruby2.4
【注意事項】
- スクレイピングはWebサイトの注意事項等を読んで適切に行いましょう。
- ログインに機能に何かしらごにょごにょしたものが実装されていた場合、すぐにseleniumにシフトしたほうがいいと思います。個人的にmechanizeは一般的なログインフォームに利用します。
イメージ
Webの情報取得方法に関して、勝手に順番をつけています。
- nokogiri
- mechanize
- selenium
今回はシンプルなログイン認証を突破してWeb情報を取得する方法です。
流れは次のイメージです。
- Mechanizeをnewする(インスタンス化する)
- ログインURLを準備する
- ログインページを取得する(アカウント入力フォームがあるページ)
- アカウント入力フォームを取得する
- フォームに値を割り当てる
- submitして認証を得る(Mechanizeのインスタンス「agent」にセッションが保存される…らしい)
- アカウント権限の範囲内でWeb情報を取得できる
コード+解説
#1. Mechanizeをnewする(インスタンス化する)
agent = Mechanize.new
#2. ログインURLを準備する
loginpage_url = "https://www~~~~"
#3. ログインページを取得する(アカウント入力フォームがあるページ)
login_page = agent.get(loginpage_url) #1と2を省略して、3から始めてもいい。4から始めてもいい
#4. アカウント入力フォームを取得する
login_form = login_page.form_with(name: "form") #フォームを特定できる属性と値
#5. 各フォームに値を割り当てる(テキスト入力しているというイメージ)
login_form.field_with(name: "user").value = "username"
login_form.field_with(name: "password").value = "ppassword"
#6. submitして認証を得る(Mechanizeのインスタンス「agent」にセッションが保存される…らしい)以下、どちらでもいい
agent.submit(login_form)
mypage_top = agent.submit(login_form)
#7. アカウント権限の範囲内でWeb情報を取得できる
locked_page = agent.get("https://~~~~~")
コードのみ
agent = Mechanize.new
page = agent.get("https://~~~")
form = page.form_with(name: "form")
form.field_with(name: "user").value = "username"
form.field_with(name: "password").value = "password"
agent.submit(form)
#【余談】フォーム取得のもう一つのメソッド
form = page.forms[0]
もっと簡単な流れ
- ログインページアクセス
- ログインフォーム取得
- フォーム入力
- 送信
- セッションゲット
認証突破後のWeb情報取得
Mechanizeのまま行うか、Nokogiriに移行するか。
mechanizeのまま行うと良いこともあります。
リンクやボタンを押すことができるので、そのままページ移動・ページ取得ができる。
Google検索「ruby mechanize メソッド 一覧」などで検索すると色々出てきます。
Nokogiriに移行するのに利用するメソッド「.content」
返り値はStringです。この「content」メソッドを利用してNokogiriに渡します。
#pageはagent.get()で取得したもの
nokogiri = Nokogiri::HMTL(page.content.toutf8)
i_want = nokogiri.css("div #test") #普通のスクレイピングのように活用できる
最後に
最初の注意にも書きましたが、ログインフォームをごにょごにょ何かしたトランスフォーマーしていたら、私はすぐにseleniumで実装したほうが無難かなと思いっています。