「Python」とWebテストツールとして有名な「Selenium」を使用して、
ログインが必要なWebページのスクレイピング・クローリングを行う手順を紹介します。
最近のログインが必要ページは「メールアドレス」、「パスワード」以外にも、
「Cookie」や「ハッシュ値」などの情報も裏ではログイン時に送っています。
アプローチ方法として「requests」ライブラリや「Scrapy」がありますが、
どちらも学習コストが高く簡単には使いこなせません。
そのため、初心者でも簡単に扱うことが出来る「Selenium」が大変オススメになります。
今回は「Selenium」の「Google Chrome」ドライバーを使用したWebページのスクレイピング・クローリングを行っていきます。
「Selenium」の扱い方については以下の記事にもまとめていますので参考にしてみてください。
初心者がSeleniumを使う理由
「requests」ライブラリは「Cookie」や「Header情報」など設定する必要があり、
初心者では実際にスクレイピング・クローリングまで実装できません。
「Seleninum」はブラウザを直接使ってWebスクレイピング・クローリングを行います。
ただし「Seleninum」は速度が少々遅いので、
より性能が求められる場合は「Scrapy」などを使用しましょう。
Seleniumのインストール
まずはSeleniumのインストールを行います。
「pip」を使用してインストールします。
pip install selenium
PyCharmを使用している場合は下の記事を参考にインストールしてみてください。
これでSeleniumのインストールは完了です。
ドライバーの入手とインストール
次にドライバーの入手とインストールをします。
今回は「GoogleChrome用のドライバー」のダウンロード方法を紹介します。
「ダウンロードサイト:ChromeDriver – WebDriver for Chrome」にアクセスします。
「ChromeDriver」を選択しましょう。
Latest Releseの「ChromeDriver」を選択します。
各OSに合わせたドライバーをダウンロードしましょう。
**Windowsは64Bit版だとしても、「chromedriver_win32.zip」を利用できます。
**下がメジャーブラウザのドライバーのダウンロードサイトになります。
- GoogleChrome:https://sites.google.com/a/chromium.org/chromedriver/
- Firefox:https://github.com/mozilla/geckodriver/
- Microsoft Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
- Opera:https://github.com/operasoftware/operachromiumdriver/releases
ダウンロードしたメディアをOS上の所定の場所に配置します。
今回はメディアを下に配置します。
C:\webdriver\chromedriver.exe
ログインIDとパスワードを入力する要素を特定
「”Yahoo”ログインページ」にログインしてみたいとと思います。
初めにGoogleChromeでログインIDとパスワードを入力する要素にどんなセレクタが適用しているか確認します。
GoogleChromeで「https://login.yahoo.co.jp/config/login」で開きましょう。
次にWindowsでは「F12」、Macでは「Control + Option + I」で「検証モード」を開きます。
まずは「ログインID」を入力する「nputタグを調べてみましょう。
inputタグのidは「username」となっているのでこちらで指定しましょう。
「次へ」buttonのidは「btnNext」ということが分かります。
「パスワード」のinputタグは「passwd」ということが分かります。
「ログイン」buttonのidは「btnSubmit」ということが分かります。
以上のようにそれぞれの要素をidで指定してPythonに操作させましょう。
id属性が無い場合にはclassなどでも特定することができます。
「selenium」でYahoo Japanにログインする
今回用意したサンプルコードは以下になります。 以下のコードを実行してみましょう。
# coding: UTF-8
from time import sleep
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
if __name__ == '__main__':
# URL関連
url = https://login.yahoo.co.jp/config/login
login = ログインIDをここに入力
password = パスワードをここに入力
# ヘッドレスモードの設定。
# True => ブラウザを描写しない。
# False => ブラウザを描写する。
options = Options()
options.add_argument('--headless')
# Chromeを起動
driver = webdriver.Chrome(executable_path=C:\webdriver\chromedriver.exe, chrome_options=options)
# ログインページを開く
driver.get(url)
# ログオン処理
# ユーザー名入力
driver.find_element_by_id(username).send_keys(login)
driver.find_element_by_id('btnNext').send_keys(Keys.ENTER)
# ブラウザの描写が完了させるためにsleep
sleep(10)
# パスワード入力
driver.find_element_by_id(passwd).send_keys(password)
driver.find_element_by_id(btnSubmit).send_keys(Keys.ENTER)
# soupオブジェクトを作成
soup = BeautifulSoup(driver.page_source, lxml)
# ログイン後のトップページのソースを表示
print(soup)
# ドライバーをクローズ
driver.close()
driver.quit()
12行目と13行目でログインIDとパスワードを入力します。
29行目と36行目で事前に調べたinputタグのidに値を渡しています。
30行目と37行目で事前に調べたButtonタグのidに対してクリックしています。