カテゴリ: Python 更新日: 2026/05/26

PythonでJavaScriptを含むページをスクレイピングする方法!初心者向け完全ガイド

PythonでJavaScriptを含むページをスクレイピングする方法
PythonでJavaScriptを含むページをスクレイピングする方法

先生と生徒の会話形式で理解しよう

生徒

「PythonでWebサイトの情報を集める『スクレイピング』に挑戦しているのですが、一部のサイトでデータがうまく取得できないんです。」

先生

「それは、そのWebサイトが『JavaScript(ジャバスクリプト)』を使って動的にコンテンツを表示しているからかもしれませんね。」

生徒

「ジャバスクリプト……?普通のスクレイピングとはやり方が違うんですか?」

先生

「はい。プログラムでブラウザを自動操作する『Selenium(セレニウム)』などを使う必要があります。基本から丁寧に解説しましょう!」

1. JavaScriptを含むページとは?

1. JavaScriptを含むページとは?
1. JavaScriptを含むページとは?

Webサイトには、大きく分けて「静的(せいてき)なページ」と「動的(どうてき)なページ」の2種類があります。 静的なページは、URLにアクセスした瞬間にすべての文字情報が送られてきます。 しかし、最近のWebサイトの多くはJavaScript(ジャバスクリプト)というプログラミング言語を使って、ページを開いた後にデータを読み込んだり、ボタンを押したときに中身を書き換えたりします。これが「動的なページ」です。

例えば、SNSのタイムラインを下にスクロールすると新しい投稿が次々に出てきたり、通販サイトで検索結果がパッと切り替わったりするのはJavaScriptのおかげです。 Pythonの標準的なライブラリ(Requestsなど)だけでは、この「後から出てくるデータ」を読み取ることができません。 なぜなら、Requestsは「最初の荷物(HTML)」は受け取りますが、その後の「組み立て作業(JavaScriptの実行)」をしてくれないからです。

2. スクレイピングに必要なツール「Selenium」の準備

2. スクレイピングに必要なツール「Selenium」の準備
2. スクレイピングに必要なツール「Selenium」の準備

JavaScriptが動くページを攻略するために最も有名なのがSelenium(セレニウム)というツールです。 これは、人間がGoogle Chromeなどのブラウザを操作する代わりに、Pythonプログラムが「ブラウザを遠隔操作」する仕組みです。 ブラウザが実際にページを開いてJavaScriptを実行してくれるので、画面に見えている情報はすべて取得できるようになります。

まずは、パソコンにSeleniumをインストールしましょう。コマンドプロンプトやターミナルで以下の命令を入力します。


# Seleniumをインストールするコマンド
# pip(ピップ)はPythonの道具箱に新しい道具を追加するコマンドです
pip install selenium webdriver-manager

ここでは「webdriver-manager」という便利な道具も一緒に入れています。 昔はブラウザの種類に合わせて手動で設定が必要でしたが、これを使えばPythonが自動で適切な設定を済ませてくれます。

3. ブラウザを自動で起動してみよう

3. ブラウザを自動で起動してみよう
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の実行を待つ「待機処理」が重要!

4. JavaScriptの実行を待つ「待機処理」が重要!
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. 画面上のボタンをクリックしてデータを取得する

5. 画面上のボタンをクリックしてデータを取得する
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との連携)

6. 取得したHTMLを解析する(BeautifulSoupとの連携)
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. スクレイピングをする際の注意点とマナー

7. スクレイピングをする際の注意点とマナー
7. スクレイピングをする際の注意点とマナー

スクレイピングは非常に強力な技術ですが、守らなければならないルールがあります。 Webサイトは、あくまで「人間が見るため」に作られています。プログラムで猛スピードでアクセスすると、相手のサーバー(Webサイトを動かしているコンピュータ)に大きな負担をかけてしまいます。

  • 適度な間隔を空ける: 1回アクセスしたら、必ず time.sleep(1) などで数秒休むようにしましょう。
  • 利用規約を確認する: サイトによっては「スクレイピング禁止」と書かれている場合があります。
  • 個人情報の扱いに気をつける: 取得したデータを勝手に公開したり、悪用したりしてはいけません。

これらは「Webスクレイピングの倫理(マナー)」と呼ばれます。 正しく、優しく技術を使うことで、あなたのプログラミングライフはもっと豊かになります。

8. ヘッドレスモードでブラウザを隠して実行する

8. ヘッドレスモードでブラウザを隠して実行する
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

画面は一切出ませんが、しっかりとページにアクセスして情報を取ってきていることがわかります。 これで、大量のデータを集める際もパソコンを快適に使い続けることができますね!

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

関連記事:
Python のWebスクレイピングの記事一覧へ
新着記事
New1
Python
Pythonの変数とは?定義方法とデータ型を初心者向けに解説
New2
PHP
PHP の型変換を完全ガイド!初心者でもわかる明示的変換・自動変換
New3
PHP
PHPのCSVファイルの読み書きと文字列処理を基礎から解説!初心者向けガイド
New4
PHP
PHPのメモリ管理と変数の破棄方法をやさしく解説!初心者でもわかるunsetの使い方
人気記事
No.1
Java&Spring記事人気No1
Python
PythonでAPIリクエストを送信する方法を完全解説!requestsライブラリで簡単API通信
No.2
Java&Spring記事人気No2
Python
Pythonで経過時間を計測する方法を完全解説!初心者でもわかる time.perf_counter() と time.sleep()
No.3
Java&Spring記事人気No3
Python
Pythonのコンストラクタ(__init__)の使い方!初心者でもわかるオブジェクトの初期化
No.4
Java&Spring記事人気No4
PHP
PHPの配列をソートする方法!sort, rsort, asort, ksortの使い方を丁寧に解説します!
No.5
Java&Spring記事人気No5
PHP
PHP のフォームデータの受け取り($_POST, $_GET)を完全解説!初心者向けガイド
No.6
Java&Spring記事人気No6
Python
Pythonのタプルの要素を変更できない理由とその回避策を初心者向けに解説
No.7
Java&Spring記事人気No7
ChatGPT
ChatGPTでPythonコードを作成する方法!プロンプトの書き方と質問例を解説
No.8
Java&Spring記事人気No8
Python
Pythonのrequestsライブラリ完全入門!HTTPリクエストの送り方を初心者向けにやさしく解説