\

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で描画される動的な要素を効果的に取得することが可能です。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です