Pythonでスクレイピング入門|Webデータ収集の基本と注意点
Pythonを使ったWebスクレイピングの基本を解説。BeautifulSoupの使い方、データ収集の実践例、法的・倫理的な注意点も紹介。
editor

チョットデキルの編集部です。プログラミング学習に役立つ情報をお届けします。
Webサイトから情報を自動で取得する「スクレイピング」は、データ収集や業務効率化において非常に強力な手段です。Pythonにはスクレイピングを簡単に実現できるライブラリが揃っており、プログラミング初心者でも基本的なデータ収集をすぐに始められます。本記事では、requestsとBeautifulSoupを使ったスクレイピングの基本から、実践的なデータ収集の流れ、そして見落としがちな法的・倫理的な注意点までを解説します。
Python による Web スクレイピング とは
Web ページから情報を自動で取得する Python の手法のことです。requests + BeautifulSoup の 2 つを覚えるだけで始められ、JavaScript で生成されるサイトは Playwright で対応します。
TL;DR 早わかりサマリー
- Python スクレイピングは requests + BeautifulSoup の 2 ライブラリで始められ、1 時間で実用スクリプトが書けます
- JavaScript で描画される動的ページは Selenium / Playwright で対応
- 違法 / 規約違反にならない範囲を守ることが何より重要
- 競合価格監視、ニュース収集、商品情報取得、SNS 分析など応用範囲は広い
スクレイピングの仕組み
Webスクレイピングとは、プログラムを使ってWebページのHTMLを取得し、そこから必要な情報を抽出する技術です。大まかな流れは次のようになります。
- 対象のWebページにHTTPリクエストを送信する
- 返ってきたHTMLを解析(パース)する
- CSSセレクタやタグ名を使って、必要なデータを抽出する
- 抽出したデータをファイルやデータベースに保存する
Pythonでは、HTTPリクエストの送信にrequestsライブラリ、HTMLの解析にBeautifulSoupライブラリを使うのが定番の組み合わせです。
環境準備
まず、必要なライブラリをインストールします。
ターミナル
pip install requests beautifulsoup4インストールが完了したら、Pythonファイルで以下のようにインポートします。
Python
import requests
from bs4 import BeautifulSoupこれだけで、スクレイピングを始める準備は整います。
HTMLの取得と解析の基本
まずはWebページのHTMLを取得し、BeautifulSoupで解析する基本的なコードを見てみましょう。
Python
import requests
from bs4 import BeautifulSoup
url = "https://example.com"
response = requests.get(url)
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text, "html.parser")
print(soup.title.text)requests.get()でページのHTMLを取得し、BeautifulSoupに渡すことで、HTMLの構造をPythonオブジェクトとして扱えるようになります。soup.title.textでページのタイトルタグの中身を取得できます。
CSSセレクタを使ったデータ抽出
BeautifulSoupでは、CSSセレクタを使って特定の要素を効率よく抽出できます。select()メソッドは条件に一致するすべての要素をリストで返し、select_one()は最初の1つだけを返します。
Python
# クラス名で要素を取得
items = soup.select(".item-title")
for item in items:
print(item.text.strip())
# IDで要素を取得
header = soup.select_one("#main-header")
# 属性セレクタで絞り込み
links = soup.select("a[href^='https']")
for link in links:
print(link["href"])ブラウザの開発者ツール(F12キー)を使えば、取得したい要素のCSSセレクタを簡単に確認できます。Chrome であれば、要素を右クリックして「検証」を選び、Elements パネルで該当の HTML タグを右クリック、「Copy」から「Copy selector」を選択するとセレクタをコピーできます。
実践例:書籍情報を取得してCSVに保存する
ここでは、スクレイピング練習用に公開されている「Books to Scrape」というサイトからデータを取得する例を紹介します。このサイトはスクレイピングの学習目的で作られたもので、自由に利用できます。
Python
import requests
from bs4 import BeautifulSoup
import csv
import time
url = "https://books.toscrape.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
books = []
for article in soup.select("article.product_pod"):
title = article.select_one("h3 a")["title"]
price = article.select_one(".price_color").text
rating = article.select_one("p.star-rating")["class"][1]
books.append({
"title": title,
"price": price,
"rating": rating
})
# CSVファイルに保存
with open("books.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["title", "price", "rating"])
writer.writeheader()
writer.writerows(books)
print(f"{len(books)}件の書籍データを保存しました")このコードでは、各書籍のタイトル、価格、評価を抽出し、CSVファイルとして保存しています。select()とselect_one()を組み合わせることで、複雑なHTML構造からでもピンポイントでデータを取り出せます。
複数ページのデータを取得する
多くのWebサイトでは、データが複数ページにまたがっています。ページネーションに対応するには、次のページのURLを取得してループ処理を行います。
Python
import time
base_url = "https://books.toscrape.com/catalogue/page-{}.html"
all_books = []
for page in range(1, 4): # 1〜3ページを取得
url = base_url.format(page)
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
for article in soup.select("article.product_pod"):
title = article.select_one("h3 a")["title"]
all_books.append(title)
time.sleep(1) # サーバーへの負荷を抑えるために1秒待機
print(f"合計{len(all_books)}件取得")ここで重要なのがtime.sleep(1)です。リクエストの間隔を空けることで、対象サーバーに過度な負荷をかけることを防ぎます。これはスクレイピングにおける基本的なマナーです。
法的・倫理的な注意点
スクレイピングは便利な技術ですが、無制限に行ってよいわけではありません。以下の点を必ず確認・遵守してください。
robots.txt を確認する
ほとんどのWebサイトにはrobots.txtというファイルが公開されており、クローラーやスクレイピングに対するアクセスルールが記載されています。対象サイトのルートURL(例:https://example.com/robots.txt)にアクセスして内容を確認し、Disallowで指定されたパスへのアクセスは避けてください。
利用規約を確認する
サイトの利用規約で、自動的なデータ収集が禁止されている場合があります。特に商用目的でデータを利用する場合は、必ず利用規約を読み、必要に応じてサイト運営者に許可を取ってください。
サーバーへの負荷に配慮する
短時間に大量のリクエストを送ると、対象サーバーに過負荷を与え、サービス妨害とみなされる可能性があります。リクエスト間隔は最低でも1秒以上空け、大量のデータを取得する場合はさらに長い間隔を設定しましょう。
個人情報を収集しない
スクレイピングで個人情報(氏名、メールアドレス、電話番号など)を無断で収集することは、個人情報保護法に抵触する可能性があります。収集するデータの内容には十分注意してください。
よくあるエラーと対処法
スクレイピングでつまずきやすいポイントをいくつか紹介します。
文字化けが起きる場合は、レスポンスのエンコーディングを明示的に設定します。
Python
response.encoding = response.apparent_encoding要素が取得できない場合は、JavaScriptで動的に生成されたコンテンツの可能性があります。その場合はrequestsだけでは取得できないため、SeleniumやPlaywrightといったブラウザ自動操作ツールの利用を検討してください。
403エラーが返ってくる場合は、User-Agentヘッダーを設定することで解決することがあります。
Python
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)ただし、アクセスが明示的にブロックされているサイトに対して無理にリクエストを送ることは避けてください。
スクレイピングスキルを活かすには
スクレイピングはデータ収集の入り口にすぎません。収集したデータを分析・加工・可視化することで、業務に直結する価値が生まれます。Pythonには、pandasによるデータ加工、matplotlibによるグラフ作成など、データ活用のための豊富なライブラリが揃っています。スクレイピングと組み合わせることで、情報収集から分析までを一気通貫で自動化できます。
Pythonを使った業務自動化の全体像については、Pythonで仕事を自動化する方法で詳しく解説しています。
Pythonの基礎文法からしっかり学びたい方は「Python基礎」コースがおすすめです。変数、条件分岐、ループ、関数といった基本構文を身につけることで、スクレイピングだけでなく、データ分析やAPI連携など幅広い自動化に応用できるようになります。
スクレイピングの基本コード
最もシンプルなスクレイピング例。
Python
import requests
from bs4 import BeautifulSoup
# 1. HTML を取得
url = "https://example.com/news"
res = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
res.encoding = res.apparent_encoding
# 2. パース
soup = BeautifulSoup(res.text, "html.parser")
# 3. 要素を抽出
articles = soup.select("article.news-item")
for article in articles:
title = article.select_one("h2.title").text.strip()
date = article.select_one("time").get("datetime")
link = article.select_one("a").get("href")
print(f"{date} | {title} | {link}")これだけで、Web ページから情報を自動取得できます。
JavaScript 描画ページへの対応
requests / BeautifulSoup では取れない場合 (JavaScript で動的描画されている)、Selenium / Playwright を使います。
Python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com/spa-page")
page.wait_for_selector("h2.title")
titles = page.locator("h2.title").all_text_contents()
for t in titles:
print(t)
browser.close()Playwright は比較的新しく、Selenium より高速 / 安定 / API が綺麗。新規プロジェクトには Playwright がおすすめです。
法律 / 規約 / マナーの 5 原則
これだけは絶対に守ります。
1. robots.txt を確認 https://example.com/robots.txt で禁止パスを確認。
2. 利用規約を確認 スクレイピング禁止の場合、絶対に行わない。
3. アクセス間隔を空ける 連続リクエストは 1-3 秒以上空ける (time.sleep)。サーバー負荷をかけないように。
4. User-Agent を明示 自分の連絡先を含める例もある。最低限ブラウザ風 UA を設定。
5. 公開 API があるなら必ず API を使う スクレイピングは最終手段。Twitter / GitHub / Amazon など多くのサイトは API を公開しています。
詳しくは Python で仕事を自動化する方法 も参照してください。
ハンズオン Step-by-Step
Python 3.10 以上の環境で、requests と BeautifulSoup を使ってシンプルな HTML ページから情報を取り出します。
Step 1. ライブラリをインストール
HTTP 通信用の requests と HTML パーサーの beautifulsoup4 を入れます。
ターミナル
pip install requests beautifulsoup4Step 2. 対象ページを取得
example.com を取得して、ステータスコードと文字数を確認します。
Python
import requests
res = requests.get("https://example.com")
print(res.status_code)
print(len(res.text))Step 3. BeautifulSoup でパース
HTML を解析して、h1 タグの中身を取り出します。
Python
from bs4 import BeautifulSoup
soup = BeautifulSoup(res.text, "html.parser")
h1 = soup.find("h1")
print(h1.text)Step 4. 複数要素のループ取得
リンク (a タグ) をすべて取り出して href 属性を表示します。
Python
for a in soup.find_all("a"):
print(a.get("href"))Step 5. robots.txt と利用規約を確認
本番運用する前に対象サイトの robots.txt と利用規約を必ず確認します。アクセス間隔は 1 秒以上空け、User-Agent を明示するのがマナーです。
JavaScript で動的に生成されるサイトは requests だけでは取れないため、その場合は Playwright を使った実装に切り替えてください。
関連リソース
よくある質問
Q. スクレイピングは違法ですか
A. 違法ではありませんが、利用規約違反 / 著作権侵害 / 過剰アクセスでサーバーに負荷をかける、などで法的リスクがあります。「Librahack 事件」のような前例があるので、必ず robots.txt と利用規約を確認してください。
Q. ログインが必要なサイトはスクレイピングできますか
A. 技術的には可能 (requests のセッション、Selenium のログイン処理) ですが、利用規約で禁止されているケースがほとんどです。実装前に必ず規約を確認してください。
Q. スクレイピングと API、どちらを使うべき?
A. API がある場合は必ず API を使ってください。スクレイピングは API がない、かつ規約で禁止されていない場合の最終手段です。
Q. JavaScript で描画されるページの対処法は
A. Selenium / Playwright で実ブラウザを操作するのが王道。または、ページが裏側で叩いている API を DevTools の Network タブで特定し、その API を直接呼ぶ方が高速で安定です。
Q. スクレイピングを業務に組み込みたい
A. 自社用途 + 規約で許可されている範囲で活用する分には問題ありません。情シスと法務に事前確認するのが安全。詳しくは Python で仕事を自動化する方法 を参照。
Q. AI スクレイピングサービスはありますか
A. Browserless、ScrapingBee、Apify など、AI を組み込んだスクレイピングサービスが存在します。複雑なサイトを効率的に処理したい場合は検討の価値があります。
次に読むべきリソース
- 学習を始めたい方 — Python 入門コース
- 深く理解したい方 — Python による業務自動化
- 無料相談したい方 — LuaGate 無料相談
出典・参考リンク
本記事の主張・数値・仕様に関する根拠は、以下の一次情報・公式ドキュメントを参照しています。リンク先の更新により内容が変わる場合があるため、最新情報は各公式サイトで確認してください。
- BeautifulSoup 公式ドキュメント
- requests 公式ドキュメント
- Playwright 公式ドキュメント
- 著作権法 (e-Gov 法令検索)
- 経済産業省「不正アクセス禁止法ガイド」
- Python 公式ドキュメント
この記事について
- 監修: 生田 陸人 (LuaGate エンジニア / 大手 IT 企業現役エンジニア)
- 公開: 2026-05-28
- 最終更新: 2026-05-28
- カテゴリ: 業務自動化
- 検証環境: Python 3.12 / requests 2.32 / BeautifulSoup 4.12 / Playwright 1.45
- 編集ポリシー: 公式ドキュメント・公的統計を一次情報として優先し、社内エンジニアが実機検証した内容のみを掲載しています。修正提案や事実誤認の指摘は チョットデキル運営 までお寄せください。