PythonとBeautifulSoupを使用してWebページをスクレイピングする際、JavaScriptで描画される動的な要素を取得することは困難です。しかし、いくつかの方法が存在します。
requests-htmlライブラリ
requests-htmlは、JavaScriptをレンダリングする機能を提供するライブラリです。以下にその使用例を示します。
from requests_html import HTMLSession
from bs4 import BeautifulSoup
# セッション開始
session = HTMLSession()
r = session.get(url)
# ブラウザエンジンでHTMLを生成させる
r.html.render()
# スクレイピング
ranking_rows = r.html.find("div.lst.cf")
ranking_list = []
if ranking_rows:
# 1〜5位だけを取得
ranking_top5 = ranking_rows[0].find("p.que_3")
for item in ranking_top5:
ranking_list.append(item.text[2:])
print(ranking_list)
このコードでは、r.html.render()
を実行することでブラウザで表示される内容を生成しています。
SplashとBeautifulSoup
Splashサーバを経由することでJavaScript実行済みのレスポンスを取得することも可能です。以下にその使用例を示します。
import requests
from bs4 import BeautifulSoup
# 取得元URL
url = "https://www.travel.co.jp/stay/city/kusatsu-100020271/"
res = requests.get("http://localhost:8050/render.html", {"url": url, "wait": 0.5})
soup = BeautifulSoup(res.content, "html.parser")
# 10件取得できた
result_items = soup.select("div.result > div")
print(f"{len(result_items) = }")
for item in result_items:
hotel_name = item.select_one("p.result_item_hotel_name a").text
print(f"{hotel_name = }")
このコードでは、JavaScript実行済みのHTMLをレスポンスで受け取ることで要素を取得しています。
これらの方法を用いることで、PythonとBeautifulSoupを使用してJavaScriptで描画される動的な要素を効果的に取得することが可能です。