データの時代と言われる現代、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の観察」にあります。
要素の特定手順
- ブラウザ(Chrome推奨)で対象サイトを開く。
- 取得したい文字列の上で右クリック → 「検証」を選択。
- デベロッパーツールが開かれ、その要素の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が実行されてから表示されるデータは取得できません。その場合は Selenium や Playwright を検討してください。 - 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」がある場合はそちらを優先する。
マナーを守り、正しく技術を使いこなして、あなたのビジネスや研究を劇的に効率化させていきましょう!


コメント