Seleniumはweb関連の機能テストを自動で行うために用いられるツールです.
Webサイトの校正や原稿収集で,スクリーンショットを保存する際に有用です.

目次

  1. インストール
  2. インストール後のテスト
  3. スクリーンショット
  4. ソースの取得
  5. ログイン
    1. Basic認証
    2. 会員制サイト

インストール

以下の環境におけるインストール例です.

  • macOS 12.4
  • python 3.10.1
  • Google Chrome 103.0.5060.53
pip install selenium
pip install webdriver-manager

インストール後のテスト

まず,Pythonを起動します.

python3

そして,以下を実行します.

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://example.com')
driver.get_screenshot_as_file("test.png")
driver.quit()

すると,次の通り動作します.

  • chromedriver_binaryと,seleniumよりwebdriverをインポート
  • Google Chromeを立ち上げ
  • https://example.comというURLを取得
  • test.pngという名前でスクリーンショットをカレントディレクトリに作成
  • Google Chromeを終了

スクリーンショット

それでは,pngのスクリーンショットを撮影してまわります.
予めlist.txtの各行にURLを列挙しておき,以下を実行します.

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time

with open('list.txt', 'r') as f:
urls = f.read().split("\n") # URLの読み込み

options = webdriver.ChromeOptions()
options.add_argument('--headless') # ブラウザを起動せず実行できるようにする
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.set_window_size(900, 600) # ウィンドウサイズ

for i, url in enumerate(urls):
driver.get(url)
time.sleep(2) # webページの読み込み時間として2秒確保
fileName = 'img_' + i.__str__() + '.png'
driver.get_screenshot_as_file(fileName)

driver.quit()

撮影ページが多い場合に余計な負荷をかけぬよう,options.add_argument('--headless')でブラウザを起動しないで実行する方針をとっています.
ここをコメントアウトすれば,実行されている様子が確認できます.

time.sleep(2)によりwebページの読み込みに2秒確保していますが,開くのが遅いページがあるようなら,もっと長めに確保してください.

ソースの取得

サイトのソースはdriver.page_sourceで取得できます.
その書き出しは,上でスクリーンショットを撮影しているところで,

fileName = 'file_' + i.__str__() + '.html'
with open(fileName, mode='w') as f:
f.write(driver.page_source)

とすることで行えます.

ログイン

Basic認証

Basic認証がかけられたサイトを撮影する場合,列挙するURLにid:password@という部分を加えます.
idpasswordは適当なものを代入してください.

https://id:password@example.com

会員制サイト

WordPress ver.5.5のログインページでの例です.
driver.get(url)した後,IDとパスワードを入力フォームに投げ込み,ボタンを押下します.

user_id = 'ログインID'
user_pw = 'パスワード'

login_id = driver.find_element_by_xpath("//input[@id='user_login']")
login_pw = driver.find_element_by_xpath("//input[@id='user_pass']")
login_id.send_keys(user_id)
login_pw.send_keys(user_pw)
login_btn = driver.find_element_by_xpath("//input[@id='wp-submit']")
login_btn.click()