自作ツール&スクリプト

【Google Chrome】自動でログインしてスクレイピングする方法[Selenium]

google-chrome-selenium-scraping

すいみん(@cg_method)です!

以前からやってみたかったブラウザのオートメーションツール、Selenium(セレニウム)に触れてみました。

スクリプトで複雑なブラウザー操作ができるので、かなり自動化できる表現の幅が広がりそうです。

seleniumの環境構築

Pythonのインストール

インストーラーをダウンロードしてWindowsにPython 3.7.4(Windows x86-64 web-based installer)を入れます。

https://www.python.org/downloads/windows/

Add Python 3.4 to PATHにチェックを入れていれば環境変数にパスが追加されます。

C:\Users\ユーザー名\AppData\Local\Programs\Python\Python37\
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python37\Scripts\

seleniumのインストール

コマンドプロンプトを開いて、下記のコマンドを入力

pip install selenium

ChromeDriverのダウンロード

まずChromeを開いてスリードットメニュー>ヘルプ>Chromeについてからバージョンを確認します。

次に下記のリンクからChromeのバージョンと合わせたドライバーをダウンロード(ChromeDriver 76.0.3809.68)
http://chromedriver.chromium.org/downloads

seleniumの実行

Chromeを起動してGoogleを開く

test.pyという名前で中身は下記のコードにしたものをコマンドプロンプトで実行してみます。

python C:\Users\ユーザー名\Desktop\test.py

※もちろん.pyをダブルクリックでもOKです。

from selenium import webdriver
driver = webdriver.Chrome("C:/chromedriver_win32/chromedriver.exe")
driver.get("https://google.co.jp")

※Windowsの場合は\ではなくバックスラッシュ(/)でパスを区切ること!
※文字エンコードは「UTF-8」

テストして、Chromeが起動すればOKです。
※ブラウザーとドライバーのバージョンが合わせないと起動しません

Googleで「CGメソッド」と検索する

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome("C:/chromedriver_win32/chromedriver.exe")
driver.get("https://www.google.co.jp/")
search = driver.find_element_by_name("q")
search.send_keys("CGメソッド")
search.send_keys(Keys.RETURN)

このブログ内で「恋声」と検索する

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome("C:/chromedriver_win32/chromedriver.exe")
driver.get("https://www.cg-method.com")

xpath = '//*[@id="s"]'
search = driver.find_elements_by_xpath(xpath)[1]
search.send_keys("恋声")
search.send_keys(Keys.RETURN)

※検索BOXが複数ある場合はdriver.find_elements_by_xpath(xpath)[1]と記述する

Twitterアナリティクスにログインして今月のツイート数を取得する

一番身近なのでテストとしてTwitterを選びましたが、本来はスクレイピング禁止なので実用化は非推奨です!

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys

twitter()

account = 'アカウント'
password = 'パスワード'

def twitter():
    driver = webdriver.Chrome("C:/chromedriver_win32/chromedriver.exe")
    driver.get('https://analytics.twitter.com/user/cg_method/home')
    time.sleep(3)

    element_account = driver.find_element_by_class_name("js-username-field")
    element_account.send_keys(account)
    time.sleep(3)

    element_pass = driver.find_element_by_class_name("js-password-field")
    element_pass.send_keys(password)
    time.sleep(3)

    element_login = driver.find_element_by_xpath('//*[@id="page-container"]/div/div[1]/form/div[2]/button')
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    element_login.click()
    time.sleep(3)

    selector = "body > div.container > div > div.home-content > div > div.home-columns > div.home-column-secondary > div:nth-child(2) > div > div > div:nth-child(1) > div > div"
    tweetsNum = driver.find_element_by_css_selector(selector)
    print("今月のツイート数:",tweetsNum.text)

取得したい要素を拾う方法

  1. 要素を選択して右クリック>検証

  2. さらに右クリックしてCSSなりXpathなりをコピーするだけです。

[追記]フレーム単位でアクセスするスクリプト例

フレームで別れている場合に手間取ったのでメモ。

上部のフレームにスイッチ▶一度上の階層に戻って▶下のフレームにスイッチする。

参考

https://selenium-python.readthedocs.io/locating-elements.html
https://qiita.com/mastar_3104/items/0a1ce2bfa1d29287bc35
https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a

まとめ

Selenium(セレニウムを使うことで、ログインして数値を取得して、スプレッドシートシートに記入する(下記の記事)とほしい数字をデータベース化できそうです!

【Google Spreadsheet】POST通信からスプレットシートに書き込む方法