【ドライバ不要】javascriptが動作するサイトをSeleniumでスクレイピングする

多くのウェブサイトがJavaScriptを活用してデータを読み込むようになり、シンプルなスクレイピングツールでは対応できないことがあります。
今回は、Seleniumを使ってJavaScriptが動作するWebサイトのスクレイピングをし、さらにDockerを組み合わせた環境を整えることで、ドライバーの動作不良を回避する環境を作り上げます。
まず、seleniumのdocker imageを利用するため以下のコードを記載したdocker-compose.ymlを作成します。

# docker-compose.yml
services:
  selenium:
    image: selenium/standalone-chromium
    ports:
        - '4444:4444'
        - '5900:5900'
        - '7900:7900'

コマンドラインでdocker-compose.ymlがあるフォルダに移動してdocker composeを起動します。

# docker-compose.ymlがあるフォルダ(ここではxx/xxとします)に移動
$ cd xx/xx
 
# docker-composeを起動します。
$ docker compose up

うまく動作すればローカル上でSeleniumのhttp://localhost:4444にアクセスするとSeleniumの管理画面にアクセスすることができます。

この段階で動作しない場合はdockerがインストールされているか確認する、もしくは、lsコマンドなどでdocker-compose.ymlがフォルダ内に存在するかを確認してください。

Seleniumを用いてWebサイトにアクセスして情報を取得するために以下のPythonファイルを作成します。

# Pythonファイルを作成
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time

# 変数設定
url = "https://<<ここにスクレイピングしたいURLを記載>>"
command_executor='http://localhost:4444/wd/hub'

# ドライバー設定
options = webdriver.ChromeOptions()

# ヘッドレスドライバーを選択
options.add_argument('--headless')

# docker上のメモリ上限を解放
options.add_argument("--disable-dev-shm-usage")

# デバイスをiPhone SEに設定
options.add_experimental_option("mobileEmulation", {"deviceName": "iPhone SE"})

# ドライバーを起動
driver = webdriver.Remote(command_executor=command_executor,
                            options=options,
                            desired_capabilities=DesiredCapabilities.CHROME.copy())

# webサイトへアクセス
driver.get(url)

# javascriptの動作時間を確保
time.sleep(1)

# htmlの取得
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

# 入力欄に文字列を送信
driver.find_element(By.TAG_NAME, "input").send_keys("入力したいテキスト")

# ボタンをクラス名で検索してクリック
driver.find_element(By.CLASS_NAME, "btnGreen").click()

このスクリプトでは例として以下のような処理を行いました。

  • htmlの取得

  • 入力欄に文字列を送信

  • ボタンをクラス名で検索してクリック

また、スクレイピングで期待した動作がされない場合はdocker上のウェブドライバーがどのような画面になっているか、スクリーンショットをとって確認できます。

driver.save_screenshot("debug.png")

これらのコマンドを繰り返し用いるPythonスクリプトを作成することでjavascriptが動作するWebサイトに対してもスクレイピングをして求める情報を取得することができます。


この記事が気に入ったらサポートをしてみませんか?