selenium × Chrome によるログイン処理
requestsなどのHTTPの送受信のみを行うインターフェイスと違いブラウザの自動操作系のインターフェイスの利点の一つにログイン処理を楽に行えるという点があります。
そもそもJavaScriptによってBot判定がなされているサイトもあり、ブラウザ利用以外でのログインが難しい場合も多いです。
selenium を使ってChromeを操作すれば、それらの認証を通過して、ログインユーザーにしか扱えないページにBotアクセスすることが可能になります。
selenium × ChromeでYahoo!にログインする
ヤフーのログインフォームを入力するサンプルです。
from selenium import webdriver import time driver = webdriver.Chrome() #立ち上げ driver.get('https://login.yahoo.co.jp/config/login') #ログインページへ login_id = 'ログインid' login_pass = 'ログインpass' driver.find_element_by_css_selector('#username').send_keys(login_id) #id入力 driver.find_element_by_css_selector('#btnNext').click() #submitボタンをクリック time.sleep(1) driver.find_element_by_css_selector('#passwd').send_keys(login_pass) #passを入力 driver.find_element_by_css_selector('#btnSubmit').click() #submitボタンをクリック time.sleep(1)
これでヤフーにログインした状態のブラウザの状態を作り出すことが出来ます。
一行ずつ追っていけば、普通のマクロ的な動作しかしていないので、割と簡単ですね。
ログイン状態を維持したまま操作をrequestsで行う
seleniumによるログイン処理は普通にブラウザからアクセスするのと同じ操作をトレースすることで可能になりますので、非常に実装が楽になります。
ただ、情報を収集したり、変化を監視するといった用途のBotを組んでいく場合、seleniumは動作の速度や安定性に欠ける部分があります。
ブラウザの描画が必要な分、多少仕方ない部分ではありますが、ログイン処理後の動作にJavaScriptのエンジンが必要でない場合、その先をrequestsによって行うことが出来ます。
それぞれのライブラリに得意な部分のみを担当させるイメージです。
- ログイン処理 → selenium × Chrome
- クロール処理→ requests × BeautifulSoup
HTTPと言うプロトコルは、一度のリクエストで完結し、前後の処理の相関を保持することが出来ません。簡単にいうと、一回ぽっきり。すぐに忘れます。つまり、HTTPはログインしたことなど、覚えていません。
では、何故ページをめくってWebサイトの中を回遊してもログイン状態が維持されているのか?というと、ログインセッションと言うのは基本的にCookieを使って管理されているからです。
Cookieと言うのはクライアント側(ブラウザ)に書き込まれる、メモ書きのようなもので、色々な用途に利用されますが、ログインの判定はその代表例です。
つまり、特定サイトにログインした状態のCookieがあり、尚且つ、そのCookieが有効期限内であれば、別のインターフェイスからそのサイトにアクセスしてもログイン状態を維持することが出来ます。
import requests session = requests.session() #sessionインスタンスを作成 #Chromeが持っているCookieを全てsessionに引き渡す for cookie in driver.get_cookies(): session.cookies.set(cookie["name"], cookie["value"]) session.get('login後操作したいURL')
上記処理で、seleniumでログインした状態のChromeブラウザのクッキーをrequestsのsessionインスタンスに引き渡すことが可能です。
その後はログインユーザー用のページをsession.get()で取得可能になります。
サイトの構造によっては使えないパターンもありますが、多くのサイトで使えるはずです。
まとめ
Webクローリングにおいて、ログイン処理というのは避けては通れない部分です。requestsでやろうとすると、hidden属性になっているinputをpostしなければいけなかったり、何かと解析に時間がかかるパターンが多いですが、seleniumを使えばあっけないほど簡単にログイン処理を作れます。
ログイン後は動作が早くて安定性の高いrequestsで操作することも可能ですので、是非覚えておきたいテクニックです。
コメント