これは何?
SeleniumとBeautifulSoupを使用して、一般的なWebスクレイピングを行う基本的な流れについての技術メモです。
環境
- Apple Silicon M1 MacBook Air
- 16 Gb
- macOS Sequoia 15.0
- chromedriver version : ChromeDriver 129.0.6668.58
- Google Chrome version : 129.0.6668.59(Official Build) (arm64)
- 2024/09/18 現在の実行
手順
ディレクトリの作成と仮想環境の作成
mkdir ScrapingTest
cd ScrapingTest
python -m venv nenv
ライブラリのインストール
- Selenium: Webブラウザを自動操作するためのライブラリです。JavaScriptで動的に生成されるページのスクレイピングに特に有効です。
- BeautifulSoup: WebページのHTMLを解析し、指定したデータを抽出するためのライブラリです。
pip install selenium beautifulsoup4 pandas webdriver-manager
Chromeドライバーのインストールは以下の記事を参照してください。
まず、Seleniumを使ってChromeブラウザを操作するために、ChromeDriverを設定します。webdriver_managerを使うことで、ChromeDriverを自動でインストールし、最新バージョンに対応させることができます。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import pandas as pd
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ChromeDriverのサービス設定
service = Service(ChromeDriverManager().install())
# ChromeDriverを初期化
driver = webdriver.Chrome(service=service)
次にアクセスしたいページを追加します。今回は私のサイトにしましたが、お好きなサイトで試してください。
# ターゲットのWebページにアクセス
driver.get('https://coiai.net')
ページ全体がロードされるまで最大20秒待機します。指定された要素がロードされるのを待つことで、動的に生成されるコンテンツにも対応できます.
# ページ全体のロードを待つ (20秒まで待機)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.TAG_NAME, 'body'))
)
BeautifulSoupを使って、HTMLソースを解析し、ページ内のデータを取得します。この例では、h2タグ内のデータを抽出します。
# ページのソースをBeautifulSoupで解析
soup = BeautifulSoup(driver.page_source, 'html.parser')
# h2タグのみを取得
h2_tags = soup.find_all('h2')
データをリストに格納します。
# 抽出したデータをリストに格納
test_list = []
# 各h2タグの内容をリストに追加
for h2 in h2_tags:
test_list.append({
'テストデータ': h2.text.strip()
})
データをCSVに書き出すようにしました。
# データフレームに変換
df = pd.DataFrame(test_list)
# 結果を表示またはCSVに保存
df.to_csv('test_data.csv', index=False)
print(df)
最後に開いたブラウザを閉じます。
# ブラウザを閉じる
driver.quit()
まとめ
全てを踏まえると以下のコードになります。
こちらを適宜実行していただければ動作すると思います。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import pandas as pd
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ChromeDriverのサービス設定
service = Service(ChromeDriverManager().install())
# ChromeDriverを初期化
driver = webdriver.Chrome(service=service)
# ターゲットのWebページにアクセス
driver.get('https://coiai.net')
# ページ全体のロードを待つ (20秒まで待機)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.TAG_NAME, 'body'))
)
# ページのソースをBeautifulSoupで解析
soup = BeautifulSoup(driver.page_source, 'html.parser')
# h2タグのみを取得
h2_tags = soup.find_all('h2')
# 抽出したデータをリストに格納
test_list = []
# 各h2タグの内容をリストに追加
for h2 in h2_tags:
test_list.append({
'テストデータ': h2.text.strip()
})
# データフレームに変換
df = pd.DataFrame(test_list)
# 結果を表示またはCSVに保存
df.to_csv('test_data.csv', index=False)
print(df)
# ブラウザを閉じる
driver.quit()
この例では、SeleniumとBeautifulSoupを使って、Webページからh2タグ内のテキストデータを抽出し、CSVに保存する方法を紹介しました。この手法を応用すれば、さまざまなWebサイトから必要なデータを自動的に取得することが可能です。
Seleniumを使うことで、動的に生成されるコンテンツにも対応できるため、より複雑なページからのスクレイピングにも対応可能です。ぜひ試してみてください。
これで、一般的なスクレイピングのやり方を解説する技術記事のベースが完成しました。必要に応じて、サンプルデータや具体的な利用ケースに合わせて調整してください。
コメントを残す