最終更新:
Webスクレイピングの仕組み — 商品名をHTMLから取り出してみよう
ページの構造から、必要な文字を選ぶ
ページから商品名だけ取り出すって、どうするの?
今回は自分で用意したHTMLの「りんご」と「200円」を取り出そう。Webスクレイピングはページなどから必要なデータを抽出する技術。取得、解析、抽出を分けると理解しやすいよ。
解析って、画面の文字を画像から読むこと?
どこが商品名か、どう指定するの?
今回はclassがnameの要素をCSSセレクタの.nameで選ぶよ。選んだ要素の文字を取り出す。名前の付け方はページ次第なので、セレクタがいつでも同じとは限らないね。
JavaScriptで後から出る文字も取れる?
HTMLだけを取得するプログラムは、通常そのJavaScriptを実行しないよ。ブラウザーを使う方法では、表示の更新を待ってDOMを読める場合がある。ただし、ログインや取得権限、表示条件も別に確認するんだ。
HTMLを見られれば、自由に使える?
技術的に読めることと、取得・保存・再利用が認められることは別だよ。提供者の利用条件やデータの扱いを確認する。公開ページだから何をしてもよい、とは考えないでね。
robots.txtがあれば、許可が分かる?
公式APIがある場合はどうする?
ページの形が変わったらどうなるの?
見つからなかったり、違う値を取ったりする。要素の有無、価格の形式、件数を確認して、失敗を検知する仕組みが大切だね。今回は外部サイトへアクセスせず、同じHTMLから想定した結果が出るところまで試そう。
まず、自分のHTMLから二つの文字を取る
Python 3と新しい練習用フォルダーを用意します。外部サイトや個人情報は使いません。必要なライブラリはBeautiful Soupです。
python -m pip install beautifulsoup4
次をextract_demo.pyとして保存します。
from bs4 import BeautifulSoup
html = """
<article class="product">
<h2 class="name">りんご</h2>
<p class="price">200円</p>
</article>
"""
soup = BeautifulSoup(html, "html.parser")
name = soup.select_one(".product .name")
price = soup.select_one(".product .price")
if name is None or price is None:
raise ValueError("商品名か価格が見つかりません")
print(name.get_text(strip=True))
print(price.get_text(strip=True))
python extract_demo.py
りんごと200円が順に表示されます。HTML側のnameをitem-nameへ変えると、元のセレクタでは見つからなくなります。抽出する指定も、ページの構造に合わせる必要があることを体験できます。
取得、解析、抽出は別の仕事
| 段階 | すること | 今回の例 |
|---|---|---|
| 取得 | 解析する内容を用意 | 自分で書いたHTML文字列 |
| 解析 | タグと属性を構造として読む | BeautifulSoup |
| 抽出 | 指定した要素の文字を取る | CSSセレクタとget_text |
実際のWeb取得では、通信の失敗、文字コード、応答の状態、利用条件なども扱います。今回の練習が成功しても、任意のサイトから同じように取れるとは限りません。
もう少し詳しく:ブラウザーを使う場合
後からJavaScriptが描画する内容は、受信したHTMLとブラウザーのDOMで異なることがあります。ブラウザーでの確認に進むならPlaywright入門へ。単に待ち時間を長くするより、必要な要素が出たことを確認します。認証の回避や制限を破る手順にはしません。
外部のデータを扱う前に
公式の取得方法と利用条件、robots.txt、アクセス量、保存・再利用の範囲を確認します。robots.txtは認可や法的な利用許諾の代わりではありません。法的な適否は利用するデータと目的などで変わるため、この練習から一律に結論を出すことはできません。
ペンギン先生のまとめ
「スクレイピング」って出てきたら「ページの構造から、必要なデータを取り出す」と思えばだいたいOK! まず自分で用意したHTMLから、狙った二つの文字を取り出してみよう。
参考資料
- Beautiful Soup:公式ドキュメント — HTML文字列・CSSセレクタ・get_text
- RFC 9309:Robots Exclusion Protocol — クローラーのルールと認可の違い