最終更新:

Webスクレイピングの仕組み — 商品名をHTMLから取り出してみよう


ページの構造から、必要な文字を選ぶ

自分のHTMLを読む<h2 class="name">りんご</h2>セレクタ:.name取り出した文字:りんご
HTMLのnameクラスを探す例。商品名と価格のコードは本文へ。通信による取得やブラウザーでの描画は、別の段階です。
ひよこ ひよこ
ページから商品名だけ取り出すって、どうするの?
ペンギン先生 ペンギン先生
今回は自分で用意したHTMLの「りんご」と「200円」を取り出そう。Webスクレイピングはページなどから必要なデータを抽出する技術。取得、解析、抽出を分けると理解しやすいよ。
ひよこ ひよこ
解析って、画面の文字を画像から読むこと?
ペンギン先生 ペンギン先生
ここではHTMLのタグや属性を読んで、要素の構造にすることだよ。画像の文字を読むOCRとは別。Beautiful Soupなら文字列のHTMLも解析できるので、ネットへアクセスせず練習できるんだ。
ひよこ ひよこ
どこが商品名か、どう指定するの?
ペンギン先生 ペンギン先生
今回はclassがnameの要素をCSSセレクタの.nameで選ぶよ。選んだ要素の文字を取り出す。名前の付け方はページ次第なので、セレクタがいつでも同じとは限らないね。
ひよこ ひよこ
JavaScriptで後から出る文字も取れる?
ペンギン先生 ペンギン先生
HTMLだけを取得するプログラムは、通常そのJavaScriptを実行しないよ。ブラウザーを使う方法では、表示の更新を待ってDOMを読める場合がある。ただし、ログインや取得権限、表示条件も別に確認するんだ。
ひよこ ひよこ
HTMLを見られれば、自由に使える?
ペンギン先生 ペンギン先生
技術的に読めることと、取得・保存・再利用が認められることは別だよ。提供者の利用条件やデータの扱いを確認する。公開ページだから何をしてもよい、とは考えないでね。
ひよこ ひよこ
robots.txtがあれば、許可が分かる?
ペンギン先生 ペンギン先生
クローラーに知らせるアクセスルールだよ。RFC 9309でもアクセスの認可そのものではないとされている。取得を許可する契約や、著作権・個人情報の判断まで済むわけではないんだ。
ひよこ ひよこ
公式APIがある場合はどうする?
ペンギン先生 ペンギン先生
目的のデータを使えるAPIやダウンロード機能があるか先に確認しよう。取得の仕様と利用条件を把握しやすいことがある。回数制限や用途などは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から、狙った二つの文字を取り出してみよう。

参考資料