見出し画像

【第6回】超入門!Webスクレイピングに挑戦〜 requests + BeautifulSoup でサクッとデータ取得してみよう 〜

以下では、前回の記事(【第5回】pipで外部ライブラリを導入!仮想環境(venv)を使ってプロジェクトを管理しよう)の流れを受けて、実際にPythonコードを動かしながら学べる「Webスクレイピング(Webページからデータを抜き取る)入門」をテーマに記事を作成しました。私のような初心者が「自分の手で動かしながら」学べる構成にしていますので、ぜひ参考にしてみてください!


【第6回】超入門!Webスクレイピングに挑戦

〜 requests + BeautifulSoup でサクッとデータ取得してみよう 〜

こんにちは!
前回は pip & 仮想環境 を使って、Pythonで外部ライブラリをインストールする方法を学びました。
今回は、その外部ライブラリを使った実践例として、Webスクレイピングに挑戦してみましょう。

「スクレイピングって何?」 「requests と BeautifulSoup はよく聞くけど、どう使うの?」 「初心者でも動かせる簡単なサンプルが知りたい!」

こんな方に向けて、実際にコードを動かしながら学んでいけるよう、できるだけ噛み砕いて解説します。


注意!スクレイピング前に知っておくべきこと

  • 利用規約・robots.txt
    スクレイピングを行うサイトの利用規約や「robots.txt」を必ず確認し、無断でデータを取得しても問題ないかをチェックしましょう。

  • 負荷・マナー
    頻繁なリクエストや大量アクセスはサーバーに負荷をかけるため、適切な間隔を置くなどの配慮が必要です。

  • 著作権・プライバシー
    取得したデータの扱い方にも注意が必要です。公開範囲や二次利用など、法律やサイトの方針を守りましょう。

今回は学習用のサンプルサイトなどを対象に、軽い実験を想定しています。


▼ 目次

  1. Webスクレイピングの仕組みをざっくり理解

  2. 準備:BeautifulSoupのインストール

  3. 実践:requests + BeautifulSoupでWebページを解析してみる

  4. サンプル:タイトル一覧を抽出してみる

  5. 補足:エラー回避のための工夫や拡張例

  6. 次回予告:データをCSV保存&Pandasで活用する流れを体験!


1. Webスクレイピングの仕組みをざっくり理解

  • HTTPリクエスト: まずは requests ライブラリを使い、対象のURLにアクセスしてHTMLデータを取得する。

  • HTML解析: 取得したHTMLを BeautifulSoup(bs4) を使って解析し、

    • <title> や <p> などタグごとに必要な情報を抜き出す。

    • class や id を指定してピンポイントでデータを取得する。

  • 抽出・整形: 抜き出したデータをリストや辞書などのPythonデータ構造に格納して、使いやすい形に整形。

  • 出力や保存: 抽出した結果を画面に表示したり、CSVに保存したりする。

実は、この一連の流れさえ理解できれば、スクレイピングの基本は押さえたと言っても過言ではありません。


2. 準備:BeautifulSoupのインストール

2-1. 仮想環境をアクティブに

前回の記事で紹介したように、プロジェクトごとに仮想環境を使うのがおすすめです。
以下のようにターミナルで移動し、環境をアクティベートしましょう。

cd /path/to/your/project
source venv_sample/bin/activate  # Mac/Linux
# もしくは Windowsなら
.\venv_sample\Scripts\Activate.ps1

2-2. インストール

pip install requests beautifulsoup4
  • requests は前回も使ったHTTPライブラリ

  • beautifulsoup4 はHTML解析のためのライブラリ(bs4 と呼ばれることも多い)

これで準備完了です!


3. 実践:requests + BeautifulSoupでWebページを解析してみる

実際にWebサイトのURLにアクセスして、HTMLから欲しい要素を抜き出してみましょう。
以下は学習目的で、有名なExample Domainhttps://example.com)を使ったサンプルです。

import requests
from bs4 import BeautifulSoup

def main():
    url = "https://example.com"
    response = requests.get(url)

    # ステータスコードが200ならOK
    if response.status_code == 200:
        # HTMLデータを取得
        html_data = response.text

        # BeautifulSoupを使ってHTMLを解析
        soup = BeautifulSoup(html_data, "html.parser")

        # タイトルタグ(<title>)の中身を取り出す
        title = soup.find("title")  # 1つだけ取得
        print("ページタイトル:", title.text)

    else:
        print("エラーが発生しました:", response.status_code)

if __name__ == "__main__":
    main()

コード解説

  • requests.get(url) : 指定したURLへGETリクエストを送信し、レスポンスを受け取る。

  • response.text : 取得したHTML内容(文字列)

  • BeautifulSoup(html_data, "html.parser") : 解析器に "html.parser" を指定。lxml など他のパーサーもあり。

  • soup.find("title") : <title> ... </title> タグを検索して、最初の1つを返す。

  • title.text : タグの中身の文字列だけを取り出す。

このスクリプトを実行してみると、「ページタイトル: Example Domain」 のように表示されるはず。
これだけでWebページのタイトルを取得できました。簡単ですね!


4. サンプル:タイトル一覧を抽出してみる

もう少し実践的に、「複数の記事タイトル」を抜き出す例を作ります。
たとえば、学習用サイトとして有名な「Scraping Club」(※1) などが使えます。
(※1) Scraping Club は初心者向けのスクレイピング練習サイトです。

import requests
from bs4 import BeautifulSoup

def main():
    url = "https://scrapingclub.com/exercise/list_basic/?page=1"
    response = requests.get(url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, "html.parser")

        # 商品タイトルを含む要素をすべて取得してみる
        cards = soup.find_all("div", class_="p-4")

        for card in cards:
            title_tag = card.find("h4")
            if title_tag:
                title = title_tag.text.strip()
                print("商品名:", title)

    else:
        print("エラーが発生しました:", response.status_code)

if __name__ == "__main__":
    main()

コード解説

  • soup.find_all("div", class_="p-4")

    • タグ名が div かつ class 属性が "p-4" の要素を複数まとめて返す。

    • こういった「タグ名+class名」検索が初心者にも分かりやすい方法。

  • card.find("h4")

    • 各カード要素の中にある <h4> ... </h4> をさらに検索。

  • .text.strip()

    • タグのテキスト部分を取得し、先頭や末尾の空白・改行を削除。

このように、HTMLの構造class属性をヒントに、欲しい部分だけを抽出できます。
実行すると、商品の名称が一覧で表示されるでしょう(※サイトの更新で違う結果が出る場合もあります)。


5. 補足:エラー回避のための工夫や拡張例

5-1. タイムアウトやリトライ

Webサイトにアクセスする際、サーバーが重かったり、ネット環境が不安定だったりすると通信エラーが起きることがあります。
requests.get(url, timeout=10) でタイムアウトを設定したり、エラー時にリトライする仕組みを実装しておくと安心です。

5-2. スリープやヘッダ設定

スクレイピングで大量リクエストを送るときは、適宜スリープ(time.sleep(1)など)を入れるとサーバーへの負荷を軽減でき、ブロックされにくくなります。
また、ヘッダのUser-Agentを書き換えて、通常のブラウザアクセスっぽく偽装する場合もありますが、必ずサイトの規約を確認してから行いましょう。

5-3. ページネーション(複数ページの処理)

商品一覧や記事一覧には、複数ページにわたることが多いです。
page=2, page=3 のようにURLのクエリ部分を変更しながらループすると、全ページの情報を取得できます(ただし取得しすぎに注意!)。

5-4. Seleniumを使った動的サイトの解析

JavaScriptで動的に生成されるページでは、requests + BeautifulSoup だけでは正しく取れないケースも。
その場合は、Selenium というブラウザ自動操作ツールが便利です。
ただし、動的解析は処理が重くなるので注意してください。


6. 次回予告:データをCSV保存&Pandasで活用する流れを体験!

今回の記事で、requests + BeautifulSoup を使ったWebスクレイピングの最初の一歩を踏み出せたかと思います。
「タグを取得して .text で文字列を抜き出す」という手順は、どんなサイトでも基本は同じです。

次回は、スクレイピングで取得したデータをCSVに保存し、
さらに Pandas などのライブラリを使って「データ分析や整形をしてみる」流れを体験しましょう。
「Webから取ってきた情報を表形式でまとめ、グラフ描画する」 なんてことも夢じゃありません!


まとめ

  1. requests でWebページのHTMLを取得

  2. BeautifulSoup でHTMLを解析し、欲しいタグやclassをピンポイントで抽出

  3. Tagの.text で文字列を取り出したり、.find_all() で一括取得したりする

  4. スクレイピングは利用規約負荷対策に気を配ることが大切

  5. 拡張として、ページネーション処理Selenium などの手段もある

スクレイピングは、「リサーチやデータ収集を自動化したい」「手入力せずに一気に情報を取得したい」といった場面で非常に役立ちます。
ぜひ今回のサンプルコードを実際に動かしてみて、「おお、こんなに簡単にデータが取れるんだ!」という感動を味わってください。

次回はデータの保存や可視化についてさらに踏み込んでいきます。
今回の記事が役に立ったら、ぜひフォローやいいねで応援していただけると嬉しいです。


編集後記

初心者でも、「requests + BeautifulSoup」 という定番ライブラリの組み合わせだけで、かなり多くのサイトから情報を取ってこれます。
最初はエラーやうまく取れないタグがあって困惑するかもしれませんが、デベロッパーツール(ブラウザの検証機能)でHTML構造を確認したり、printデバッグして1つずつ確認していくとだんだん理解が深まりますよ。

ぜひ「何か抽出できるデータがありそうなサイト」を見つけて、小さな実験を繰り返してみてください。自分なりにデータを整理してみると、面白い発見や学びがあるかも……!

それでは、次の記事もどうぞお楽しみに。
最後までお読みいただき、ありがとうございました!

いいなと思ったら応援しよう!