python スクレイピング 取得できないclassがある場合

該当のページは、javascript によって動的にページの内容を変化させています。
このようなページの場合、ページのロードを待つ必要があります。しかし、requests に代表されるリクエスト方法では、javascript 適用前のまっさらな状態の HTML しか取得できません。

解決策はいくつかあります。

API を利用する

この場合、まず始めにすることは開発者ツールのネットワークタブを開いて、どのような通信が行われているかを確認します。もしここに、json データを返す API 等の URL があれば、それのレスポンスを確認します。幸い、今回はそれが見つかりました。

https://api.makuake.com/v2/projects?page=1&per_page=15&type=most-funded

レスポンスの中身は質問者さんが欲しがってる内容です。この URL にリクエストを投げて、返ってきたレスポンスを res.json() として、辞書型に変換します。あとは、辞書を操作する方法で任意の中身を取り出すだけです。

HTML を解析する

ネットワークタブでこのような URL が見つからなかった場合は、HTML そのものに json が埋め込まれているパターンがあります。

まず、script タグを探します。次に、その属性が application/json であるものがないか探します。もし、あればその要素を取得して、json.load() を利用して辞書型に変換して任意の中身を取り出します。

ブラウザ自動操作

どちらの方法でも取得できない場合、ブラウザ自動操作ツールの出番です。seleniumplaywright 等を使って要素が出現するまでページのロードを待機します。

selenium なら、driver.implicitly_wait(10) のように待機時間を設定します。
playwright なら、非同期で await するだけです。

コメントを投稿

0 コメント