PythonでJavaScriptを含むページをスクレイピングする方法!初心者向け完全ガイド
生徒
「PythonでWebサイトの情報を集める『スクレイピング』に挑戦しているのですが、一部のサイトでデータがうまく取得できないんです。」
先生
「それは、そのWebサイトが『JavaScript(ジャバスクリプト)』を使って動的にコンテンツを表示しているからかもしれませんね。」
生徒
「ジャバスクリプト……?普通のスクレイピングとはやり方が違うんですか?」
先生
「はい。プログラムでブラウザを自動操作する『Selenium(セレニウム)』などを使う必要があります。基本から丁寧に解説しましょう!」
1. JavaScriptを含むページとは?
Webサイトには、大きく分けて「静的(せいてき)なページ」と「動的(どうてき)なページ」の2種類があります。 静的なページは、URLにアクセスした瞬間にすべての文字情報が送られてきます。 しかし、最近のWebサイトの多くはJavaScript(ジャバスクリプト)というプログラミング言語を使って、ページを開いた後にデータを読み込んだり、ボタンを押したときに中身を書き換えたりします。これが「動的なページ」です。
例えば、SNSのタイムラインを下にスクロールすると新しい投稿が次々に出てきたり、通販サイトで検索結果がパッと切り替わったりするのはJavaScriptのおかげです。 Pythonの標準的なライブラリ(Requestsなど)だけでは、この「後から出てくるデータ」を読み取ることができません。 なぜなら、Requestsは「最初の荷物(HTML)」は受け取りますが、その後の「組み立て作業(JavaScriptの実行)」をしてくれないからです。
2. スクレイピングに必要なツール「Selenium」の準備
JavaScriptが動くページを攻略するために最も有名なのがSelenium(セレニウム)というツールです。 これは、人間がGoogle Chromeなどのブラウザを操作する代わりに、Pythonプログラムが「ブラウザを遠隔操作」する仕組みです。 ブラウザが実際にページを開いてJavaScriptを実行してくれるので、画面に見えている情報はすべて取得できるようになります。
まずは、パソコンにSeleniumをインストールしましょう。コマンドプロンプトやターミナルで以下の命令を入力します。
# Seleniumをインストールするコマンド
# pip(ピップ)はPythonの道具箱に新しい道具を追加するコマンドです
pip install selenium webdriver-manager
ここでは「webdriver-manager」という便利な道具も一緒に入れています。 昔はブラウザの種類に合わせて手動で設定が必要でしたが、これを使えばPythonが自動で適切な設定を済ませてくれます。
3. ブラウザを自動で起動してみよう
準備ができたら、実際にPythonを使ってブラウザを立ち上げてみましょう。 プログラミング未経験の方にとって、自分の書いたコードで勝手にブラウザが動き出す瞬間はとても感動的ですよ!
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# Chromeブラウザを起動するための設定
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# 指定したURLを開く
driver.get("https://www.google.com")
# 5秒間そのまま待機(動きを確認するため)
import time
time.sleep(5)
# ブラウザを閉じる
driver.quit()
このコードを実行すると、自動でChromeが立ち上がり、Googleのトップページが表示され、5秒後に消えます。
driver.get()という命令が「このページに行って!」という指示になります。
4. JavaScriptの実行を待つ「待機処理」が重要!
JavaScriptを含むサイトのスクレイピングで一番失敗しやすいのが、「データの読み込み待ち」です。 ブラウザがページを開いても、JavaScriptがデータを取ってきて画面に表示するまでには数秒かかることがあります。 プログラムは人間よりも処理が早いため、データが表示される前に「データがない!」とエラーを出して止まってしまうのです。
これを解決するために、特定の要素(ボタンや文字など)が表示されるまでプログラムを一時停止させる命令を使います。これを「明示的な待機」と呼びます。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ページを開く
driver.get("https://example.com/dynamic-site")
# 目的のデータ(IDが"result-item"のもの)が表示されるまで最大10秒待つ
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_ some_element_located((By.ID, "result-item"))
)
print("データが見つかりました!内容を表示します。")
print(element.text)
except:
print("10秒待っても見つかりませんでした。")
このように「待つ」という指示を入れることで、不安定なインターネット環境や重いサイトでも確実にスクレイピングができるようになります。
5. 画面上のボタンをクリックしてデータを取得する
「もっと見る」ボタンを押さないと続きが表示されないサイトや、ログインが必要なサイトもSeleniumの得意分野です。 特定の場所を指定して、人間と同じようにクリック命令を出すことができます。
場所を指定するときは、HTMLの中にある「ID」や「Class(クラス)」、または「XPath(エックスパス)」という住所のようなものを使います。
# 検索ボックスを見つけてキーワードを入力する例
search_box = driver.find_element(By.NAME, "q") # 検索窓を探す
search_box.send_keys("Python スクレイピング") # 文字を入力する
search_box.submit() # エンターキーを押す
# クリックしたいボタンを探して押す例
# ここでは「btn-next」というクラス名がついたボタンを探しています
next_button = driver.find_element(By.CLASS_NAME, "btn-next")
next_button.click()
send_keysはキーボード入力を、clickはマウスでのクリックを再現しています。
まるで透明人間がパソコンを操作しているような感覚ですね。
6. 取得したHTMLを解析する(BeautifulSoupとの連携)
SeleniumでJavaScriptを実行させた後、最終的な文字データをきれいに整理するには、BeautifulSoup(ビューティフルスープ)というライブラリと組み合わせるのが一般的です。 Seleniumは「操作」が得意で、BeautifulSoupは「情報の整理・抽出」が得意だからです。
from bs4 import BeautifulSoup
# Seleniumで現在開いているページのHTML(中身)をごっそり取得
html_source = driver.page_source
# BeautifulSoupに読み込ませて解析(パース)する
soup = BeautifulSoup(html_source, 'html.parser')
# h2タグのテキストをすべて取り出して表示する
for h2_tag in soup.find_all('h2'):
print(f"見出し:{h2_tag.text}")
実行結果のイメージ:
見出し:1. はじめに
見出し:2. 本日のニュース
見出し:3. 天気予報
このように、最強の組み合わせ(Selenium + BeautifulSoup)を使うことで、どんな複雑なWebサイトからでも自由自在にデータを抜き出すことが可能になります。
7. スクレイピングをする際の注意点とマナー
スクレイピングは非常に強力な技術ですが、守らなければならないルールがあります。 Webサイトは、あくまで「人間が見るため」に作られています。プログラムで猛スピードでアクセスすると、相手のサーバー(Webサイトを動かしているコンピュータ)に大きな負担をかけてしまいます。
- 適度な間隔を空ける: 1回アクセスしたら、必ず
time.sleep(1)などで数秒休むようにしましょう。 - 利用規約を確認する: サイトによっては「スクレイピング禁止」と書かれている場合があります。
- 個人情報の扱いに気をつける: 取得したデータを勝手に公開したり、悪用したりしてはいけません。
これらは「Webスクレイピングの倫理(マナー)」と呼ばれます。 正しく、優しく技術を使うことで、あなたのプログラミングライフはもっと豊かになります。
8. ヘッドレスモードでブラウザを隠して実行する
最後に、実用的なテクニックを紹介します。 毎回ブラウザが画面に飛び出してくると、他の作業の邪魔になることがありますよね。 「ヘッドレスモード」という設定を使えば、画面には表示されずに裏側でこっそりスクレイピングを終わらせることができます。
from selenium.webdriver.chrome.options import Options
# オプション(追加設定)を作成
options = Options()
options.add_argument('--headless') # ヘッドレスモードを有効にする
# 設定を反映させてブラウザを起動
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()),
options=options
)
driver.get("https://www.google.com")
print(f"現在のタイトル:{driver.title}")
driver.quit()
実行結果:
現在のタイトル:Google
画面は一切出ませんが、しっかりとページにアクセスして情報を取ってきていることがわかります。 これで、大量のデータを集める際もパソコンを快適に使い続けることができますね!