PythonでWebスクレイピングを行う方法【requests + BeautifulSoup】

Python

データの時代と言われる現代、Web上に転がっている膨大な情報を自動で収集する「Webスクレイピング」は、ビジネスや研究において最強の武器になります。Pythonには数多くのライブラリがありますが、最も王道かつ汎用性が高い組み合わせが「requests」と「BeautifulSoup」です。

本記事では、環境構築から実戦的なコードの実装、さらにエンジニアとして絶対に守るべきマナーと法的な注意点まで解説します。


1. Webスクレイピングの基本概念

Webスクレイピング(Web Scraping)とは、WebサイトのHTML構造を解析し、特定の情報を自動的に抽出する技術のことです。

なぜPythonが選ばれるのか?

スクレイピング自体は他の言語でも可能ですが、Pythonが圧倒的に選ばれる理由は以下の3点に集約されます。

  • ライブラリの充実: 今回紹介するrequestsやBeautifulSoupのほか、SeleniumやScrapyなど、用途に応じたツールが揃っています。
  • 構文の簡潔さ: 少ない行数で複雑な処理が記述できるため、開発スピードが速いです。
  • データ処理との親和性: 収集したデータをPandasで分析したり、AIモデルの学習データとしてそのまま利用したりする流れがスムーズです。

2. 必須ライブラリの役割とインストール

今回の主役となる2つのライブラリの役割を理解しましょう。

  • requests: HTTP通信を行うためのライブラリ。WebサイトのHTMLデータを持ってくる「運び屋」の役割です。
  • BeautifulSoup4: 取得したHTMLの中から、特定のタグやクラスを指定してデータを取り出す「解析ツール(パーサー)」の役割です。

環境構築(インストール)

ターミナル(またはコマンドプロンプト)で以下のコマンドを実行してください。

pip install requests beautifulsoup4

3. 【実践】最初のスクレイピングコード

まずは、特定のサイトから「タイトル(h1)」と「記事のリンク一覧」を取得する基本コードを書いてみましょう。※URLはテスト用のダミーですが、構造は汎用的なものです。

基本のソースコード


import requests
from bs4 import BeautifulSoup

# 1. 対象のURLを指定
url = "https://example.com/blog"

# 2. requestsでHTMLを取得
response = requests.get(url)

# ステータスコードが200(成功)か確認
if response.status_code == 200:
    # 3. BeautifulSoupで解析
    soup = BeautifulSoup(response.text, "html.parser")

    # 4. データの抽出
    # H1タグを取得
    title = soup.find("h1").text
    print(f"ページタイトル: {title}")

    # 記事リンク(aタグ)をすべて取得
    articles = soup.find_all("a", class_="post-link")
    for article in articles:
        name = article.text
        link = article.get("href")
        print(f"記事名: {name} | URL: {link}")
else:
    print(f"アクセス失敗: {response.status_code}")

4. HTML構造の解析術:デベロッパーツールの使い方

スクレイピングを成功させる鍵は、コードを書く前に行う「HTMLの観察」にあります。

要素の特定手順

  1. ブラウザ(Chrome推奨)で対象サイトを開く。
  2. 取得したい文字列の上で右クリック → 「検証」を選択。
  3. デベロッパーツールが開かれ、その要素のHTMLタグ、id、class名が表示されます。

例えば、<span class="price">1,200円</span>という構造なら、BeautifulSoupで soup.find("span", class_="price") と記述すれば価格が手に入ります。


5. 応用:複数のページを跨いでデータを収集する

実務では1ページだけでなく、検索結果の2ページ目、3ページ目と連続して取得したいケースがほとんどです。この場合、ループ処理(for文)とURLのパラメータ操作を組み合わせます。

複数ページ巡回のサンプル


import time # 待機用

base_url = "https://example.com/products?page="

for i in range(1, 6): # 1ページから5ページまで
    target_url = f"{base_url}{i}"
    print(f"Fetching: {target_url}")

    res = requests.get(target_url)
    soup = BeautifulSoup(res.text, "html.parser")

    # ここに抽出処理を記述...

    # 重要:サーバー負荷軽減のため必ず待機を入れる
    time.sleep(1)

6. 収集したデータをCSV/Excelへ保存する

取得したデータは、画面に表示するだけでなくファイルに保存してこそ価値が出ます。Python標準の csv モジュールを使うのが最も軽量で簡単です。


import csv

data_list = [
    ["商品名", "価格"],
    ["Python入門書", "3000"],
    ["スクレイピング講座", "5000"]
]

with open("output.csv", "w", encoding="utf-8-sig", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(data_list)

print("CSV出力が完了しました。")

7. 重要:スクレイピングの法規とマナー(倫理)

ここが最も重要です。スクレイピングはやり方を間違えると、**法的トラブル**や**サーバーへのサイバー攻撃**とみなされる恐れがあります。

絶対に守るべき3つの鉄則

  • 1. スクレイピング禁止サイトを避ける:
    利用規約(Terms of Service)を確認してください。SNSや大手ECサイトの中には、自動収集を明示的に禁止しているものがあります。
  • 2. サーバーに負荷をかけない:
    アクセス間隔は最低でも1秒、できればそれ以上空けましょう。time.sleep(1) は必須です。
  • 3. robots.txtを確認する:
    URLの末尾に /robots.txt をつけてアクセスし、スクレイピングが許可されている範囲を確認してください。

8. トラブルシューティング:値が取れない時の対処法

「コードは合っているはずなのに、何も取得できない」という事態は頻発します。主な原因は以下の通りです。

  • JavaScriptによる動的生成:
    requestsはHTMLを読み込むだけです。ブラウザ上でJSが実行されてから表示されるデータは取得できません。その場合は SeleniumPlaywright を検討してください。
  • User-Agentによるブロック:
    サーバー側で「Pythonからのアクセス」を拒否している場合があります。requestsのヘッダーにブラウザの情報を偽装して渡すことで解決することがあります。

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)..."}
response = requests.get(url, headers=headers)

9. まとめ:さらなるステップアップへ

Pythonの requests + BeautifulSoup を使えば、インターネット上の情報の大部分を自分の手元に集めることができます。最初は1つのタグを取得するだけでも感動するはずです。

この技術を習得したら、次は以下のトピックに挑戦してみることをお勧めします。

  • Pandasとの連携: 収集データを一瞬でグラフ化・分析する。
  • データベース保存: SQLiteやMySQLに大量のデータを蓄積する。
  • APIの利用: スクレイピングよりも安定してデータを取得できる「公式API」がある場合はそちらを優先する。

マナーを守り、正しく技術を使いこなして、あなたのビジネスや研究を劇的に効率化させていきましょう!

コメント

タイトルとURLをコピーしました