第5章: Pythonで動的コンテンツのスクレイピング

Webスクレイピングを行う際、多くのWebページでは静的なHTMLコンテンツを取得することで必要なデータを収集できます。しかし、近年ではJavaScriptを用いて動的にコンテンツを生成するWebサイトが増えており、このようなページのデータを取得するには一工夫が必要です。JavaScriptで生成されたコンテンツは、通常のrequestsBeautifulSoupといった静的HTMLを扱うライブラリでは取得できません。こういった場合には、ブラウザを自動操作してページを実際にレンダリングし、動的な要素を読み込んだ後にデータを取得する手法が有効です。

この章では、動的コンテンツのスクレイピングに有効なツールであるSeleniumを使って、JavaScriptで生成されるデータをどのように取得するかを詳しく解説します。

5.1 Seleniumとは?

Seleniumはブラウザを自動的に操作するための強力なツールです。元々はWebアプリケーションのテスト自動化のために開発されましたが、その機能を利用して動的に生成されるWebコンテンツを取得することができます。Seleniumを使えば、プログラム内で実際にブラウザを起動し、JavaScriptによって生成された要素や非同期にロードされるコンテンツも取得可能です。

PythonにはSeleniumの公式ライブラリが存在し、これを使ってさまざまなブラウザを制御できます。具体的には、以下のようなブラウザに対応しています。

  • Google Chrome
  • Firefox
  • Safari
  • Edge

Seleniumではブラウザの操作ができるだけでなく、ページ遷移や要素の操作、フォーム入力、スクリーンショットの撮影など、手動でブラウザを操作するのとほぼ同様の操作が可能です。

5.2 Seleniumのインストールと準備

まずは、Seleniumを使うための準備をしましょう。PythonでSeleniumを利用するには、ライブラリをインストールし、制御するブラウザのドライバを設定する必要があります。

5.2.1 Seleniumのインストール

SeleniumはPythonのパッケージ管理システムであるpipを使って簡単にインストールできます。以下のコマンドを実行して、Seleniumをインストールしてください。

pip install selenium

これで、Seleniumライブラリがインストールされます。

5.2.2 WebDriverのセットアップ

Seleniumを使ってブラウザを操作するには、そのブラウザ用のドライバ(WebDriver)が必要です。例えば、Google Chromeを操作する場合は「ChromeDriver」を使用します。WebDriverは、Seleniumがブラウザを自動で操作するために必要な中間ソフトウェアです。

各ブラウザに対応するWebDriverは以下の通りです。

  • Chrome: ChromeDriver
  • Firefox: GeckoDriver
  • Safari: SafariDriver
  • Edge: EdgeDriver

Google Chromeを使用する場合、以下の手順でChromeDriverをダウンロードしてセットアップします。

  1. ChromeDriverのダウンロード
    ChromeDriverの公式サイトから、使用しているChromeのバージョンに対応したドライバをダウンロードします。Chromeのバージョンは、ブラウザの「設定」→「ヘルプ」→「Google Chromeについて」で確認できます。
  2. ダウンロードしたChromeDriverを実行可能にする
    ダウンロードしたファイルを適切なディレクトリに配置し、パスを通します。パスの通し方は、OSによって異なるので、自分の環境に合わせて設定してください。

5.3 Seleniumでブラウザを操作する

準備が整ったところで、実際にSeleniumを使ってブラウザを操作してみましょう。ここでは、簡単な例として、Googleの検索ページにアクセスし、キーワードを入力して検索結果を取得するプログラムを作成します。

5.3.1 基本的なブラウザ操作

まずは、Chromeを使用してGoogleの検索ページにアクセスするだけの基本的なプログラムです。

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

# ChromeDriverのパスを指定してブラウザを起動
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')

# Googleの検索ページにアクセス
driver.get("https://www.google.com")

# ページタイトルを表示
print(driver.title)

# ブラウザを閉じる
driver.quit()

上記のコードは、Chromeブラウザを起動し、Googleのホームページにアクセスして、ページのタイトルを表示した後、ブラウザを閉じます。driver.get()で指定したURLにアクセスし、driver.quit()でブラウザを終了します。

5.3.2 要素の検索と操作

次に、検索ボックスにキーワードを入力し、検索を実行する例です。

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

# ChromeDriverのパスを指定してブラウザを起動
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')

# Googleの検索ページにアクセス
driver.get("https://www.google.com")

# 検索ボックスの要素を探す
search_box = driver.find_element("name", "q")

# 検索ボックスにキーワードを入力
search_box.send_keys("Python Selenium tutorial")

# Enterキーを押して検索を実行
search_box.send_keys(Keys.RETURN)

# 検索結果が表示されるまで待機(必要に応じてWebDriverWaitを使用)
driver.implicitly_wait(10)

# 検索結果のページタイトルを表示
print(driver.title)

# ブラウザを閉じる
driver.quit()

この例では、Googleの検索ボックスに「Python Selenium tutorial」というキーワードを入力し、Enterキーを押して検索を実行しています。find_element()メソッドを使って、ページ内の要素を取得しています。この場合、name属性が「q」である要素、つまり検索ボックスを指定しています。

5.3.3 動的コンテンツのスクレイピング

次に、JavaScriptで生成される動的なコンテンツを取得する例を見ていきます。多くのWebページでは、ページの初期ロード時にはすべてのデータが表示されておらず、ユーザーがスクロールすることで追加のデータが読み込まれる仕組みになっています。このようなサイトでは、Seleniumを使ってページをスクロールしながら、動的に読み込まれるコンテンツを取得する必要があります。

ここでは、ニュースサイトで「もっと見る」ボタンをクリックして、さらに記事を読み込む例を示します。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ChromeDriverのパスを指定してブラウザを起動
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')

# ニュースサイトにアクセス
driver.get("https://example-news-website.com")

# 「もっと見る」ボタンが表示されるまで待機
try:
load_more_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "load-more"))
)
# 「もっと見る」ボタンをクリック
load_more_button.click()

# さらに記事が読み込まれるまで待機
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "article"))
)

# 新しく読み込まれた記事を取得して表示
articles = driver.find_elements(By.CLASS_NAME, "article")
for article in articles:
print(article.text)

finally:
# ブラウザを閉じる
driver.quit()

この例では、ページがロードされた後、「もっと見る」ボタンがクリック可能になるのを待ち、それをクリックしてさらに記事を読み込んでいます。WebDriverWaitexpected_conditionsを使って、要素がクリック可能かどうかを確認しています。また、implicitly_wait()を使うことで、指定した時間内に要素が読み込まれるのを待機するようにしています。

5.3.4 JavaScriptで動的に生成されるテーブルデータの取得

次に、JavaScriptによって動的に生成されるテーブルデータを取得する例を見ていきます。株価情報や製品リストなど、ページが読み込まれてからJavaScriptによって生成されるテーブル形式のデータを扱う場合があります。

from selenium import webdriver
from selenium.webdriver.common.by import By

# ChromeDriverのパスを指定してブラウザを起動
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')

# 株価情報のページにアクセス
driver.get("https://example-stock-website.com")

# JavaScriptによって生成されたテーブルを取得
table = driver.find_element(By.ID, "stock-table")

# テーブル内の行をすべて取得
rows = table.find_elements(By.TAG_NAME, "tr")

# 行ごとにデータを表示
for row in rows:
cells = row.find_elements(By.TAG_NAME, "td")
for cell in cells:
print(cell.text)

# ブラウザを閉じる
driver.quit()

この例では、JavaScriptによって動的に生成される株価のテーブルデータを取得しています。テーブル内の行(<tr>)をループし、各セル(<td>)のテキストを表示しています。

5.4 スクレイピングのパフォーマンス向上

動的コンテンツをスクレイピングする際、ブラウザを実際に起動して操作するため、パフォーマンスが問題になることがあります。以下の方法でパフォーマンスを向上させることができます。

5.4.1 ヘッドレスブラウザの利用

Seleniumは通常、ブラウザのUIを表示しながら操作を行いますが、UIを表示しない「ヘッドレスモード」で実行することもできます。これにより、操作速度が向上し、リソースの消費も抑えられます。

以下は、Chromeをヘッドレスモードで実行する例です。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# ヘッドレスモードのオプションを設定
chrome_options = Options()
chrome_options.add_argument("--headless")

# ChromeDriverをヘッドレスモードで起動
driver = webdriver.Chrome(executable_path='/path/to/chromedriver', options=chrome_options)

# Webページにアクセス
driver.get("https://www.example.com")

# ページタイトルを表示
print(driver.title)

# ブラウザを閉じる
driver.quit()

ヘッドレスモードではブラウザが表示されませんが、通常通りの操作が可能です。UIが不要な場合や大量のデータをスクレイピングする場合に特に有効です。

5.4.2 ページ読み込みの最適化

動的なページをスクレイピングする際、ページのすべてのリソース(画像やスタイルシートなど)が読み込まれるのを待つ必要がない場合があります。その場合、不要なリソースを無視してページの読み込みを最適化することができます。

以下は、画像やスタイルシートを無視してページを読み込む方法です。

from selenium import webdriver

# ChromeDriverのオプションを設定
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--blink-settings=imagesEnabled=false")

# ChromeDriverを起動
driver = webdriver.Chrome(executable_path='/path/to/chromedriver', options=chrome_options)

# ページにアクセス
driver.get("https://www.example.com")

# 必要な操作を行う
print(driver.title)

# ブラウザを閉じる
driver.quit()

この方法では、画像の読み込みを無効にし、ページを軽量化することで処理速度が向上します。

5.5 動的コンテンツのスクレイピングにおける注意点

動的コンテンツをスクレイピングする際には、いくつかの注意点があります。特に以下のポイントを押さえておきましょう。

5.5.1 スクレイピングの合法性と倫理

動的コンテンツのスクレイピングは技術的に可能ですが、すべてのWebサイトで許可されているわけではありません。利用規約にスクレイピングの禁止事項が含まれている場合や、過度なアクセスによってサーバーに負荷をかける行為は、法的な問題やアクセス禁止措置の対象になることがあります。必ず対象のサイトの利用規約を確認し、正当な目的で使用するよう心がけましょう。

5.5.2 サイトへの負荷とマナー

Seleniumを使ったスクレイピングは、実際にブラウザを起動するため、リクエストが多くなるとサーバーに負担がかかる可能性があります。サイトに過度な負荷をかけないように、リクエスト間に適度な遅延を挟む(time.sleep()などを使用)ことや、アクセス頻度を制御することが重要です。


まとめ

この章では、動的コンテンツのスクレイピングについて詳細に解説しました。Seleniumを使うことで、静的なHTMLでは取得できないJavaScriptで生成される要素や非同期に読み込まれるデータを取得することが可能です。Pythonによるブラウザ操作を通じて、さまざまなWebページから効率的にデータを収集できるようになれば、さらに高度なデータ解析や可視化のプロセスに進むことができます。


初心者におすすめ!プログラミングスクールのススメ

未経験でも気軽に!サブスク型プログラミングスクール【Freeks】

プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。

独学の挫折率、驚きの87.5%!

独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。

有料と無料、スクールの違いは?

プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:

  • 受講条件が異なる
  • 学べるスキルやカリキュラム内容が異なる
  • 就職や転職のサポート内容が異なる

どちらが自分に合っているか、よく考えて選ぶのが大事です。

サブスク型プログラミングスクール『FREEKS(フリークス)』に注目!

プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:

  • 未経験者向けのわかりやすいカリキュラム
  • 経験豊富なエンジニアのサポート
  • オンラインで自分のペースで学習可能

なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。

終了後は副業もサポート!

カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。

独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
 ↓ ↓ こちらをクリック ↓ ↓ 

p-school

Share
Published by
p-school

Recent Posts

第6章: PHPのデータベース操作

PHPを使用してデータベースに…

2週間 ago

第5章: PHPのオブジェクト指向プログラミング(OOP)

オブジェクト指向プログラミング…

2週間 ago

第4章: PHPの関数

プログラミングにおいて、関数は…

2週間 ago

第3章: PHPの配列とコレクション

PHPでの配列とコレクションの…

2週間 ago

第2章: PHPの基本文法

PHPの基本的な構文や使い方を…

2週間 ago