ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Webスクレイピングとは

Webスクレイピングとは、Web サイトの HTML を取得して必要な情報を抽出するプログラミング技術の総称です。主な用途は次の通りです。
- 価格情報・在庫情報の収集
- ニュース記事や口コミ等のテキスト集約
- 研究用データセットの構築
- 外部 API が提供されていないサービスからの情報取得
各プログラミング言語にスクレイピング用ライブラリが整備されているため、HTML 取得・パース・保存までを比較的少ない行数で実装できます。一方でサイト側の利用規約で禁止されているケースが多く、技術的にも法的にも注意点が多い分野です。
仕組み
スクレイピングは大きく次の 3 ステップで動作します。
- HTTP リクエスト: 対象 URL に GET リクエストを送り HTML を取得する
- パース: HTML を DOM ツリーに変換し、CSS セレクタや XPath で必要な要素を抽出
- 保存: CSV / JSON / DB などに保存して後続処理へ繋げる
Python での実装例 - requests + BeautifulSoup
静的な HTML を取得して解析する場合は、requests(HTTP クライアント)と beautifulsoup4(HTML パーサ)の組み合わせが最も簡単です。
pip install requests beautifulsoup4import requests
from bs4 import BeautifulSoup
import time
URL = "https://example.com/articles"
HEADERS = {
"User-Agent": "MyScraper/1.0 (contact: me@example.com)"
}
res = requests.get(URL, headers=HEADERS, timeout=10)
res.raise_for_status()
soup = BeautifulSoup(res.text, "html.parser")
for item in soup.select("article.post"):
title = item.select_one("h2").get_text(strip=True)
link = item.select_one("a")["href"]
print(title, link)
time.sleep(1) # 次のリクエストまで間隔を空けるポイントは User-Agent を明示すること、タイムアウトを設定すること、連続リクエスト間に sleep を挟むことです。これらを怠るとサーバーに過剰な負荷を与え、IP ブロックや法的トラブルの原因になります。
JavaScript で描画されるページへの対応
SPA や JavaScript で動的にレンダリングされるページは、requests で取得した HTML には目的の要素が含まれません。この場合はヘッドレスブラウザ(Playwright / Selenium)でブラウザごと実行します。
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", wait_until="networkidle")
titles = page.locator("h2.post-title").all_text_contents()
print(titles)
browser.close()
守るべきルール
1. robots.txt を確認する
サイトのルートにある /robots.txt でクローラ向けの許可/禁止が定義されています。Disallow されているパスへのアクセスは避けるのが基本です。
curl https://example.com/robots.txt
2. 利用規約・著作権を確認する
サイトの利用規約に「スクレイピング禁止」「自動アクセス禁止」と明記されているケースは少なくありません。違反すると規約違反として民事責任を問われる可能性があり、収集データの転載は著作権侵害に該当する場合もあります。
3. アクセス頻度を抑える
1 秒以下の高頻度でアクセスし続けるとサーバーに過負荷を与え、業務妨害として刑事責任を問われた事例も日本国内で存在します。最低でも 1〜数秒の間隔を空けるか、サイト指定のクロール間隔に従いましょう。
4. 公式 API があれば必ず API を使う
X(旧 Twitter)、YouTube、楽天、Amazon など主要サービスは公式 API を提供しています。HTML を取りに行く前に API の有無を必ず確認してください。API は安定性・利用規約の明確さ・将来の保守性すべてでスクレイピングに勝ります。
コピーサイトを作らないこと
スクレイピングを使うと既存サイトのコンテンツを丸ごと複製した「コピーサイト」を比較的簡単に作れてしまいますが、これは著作権侵害に直結する行為です。データを取得しても、そのまま再公開するのではなく、独自の付加価値を加える、リンク元として明示する、といった倫理的・法的な配慮を欠かさないようにしましょう。
パース手法の使い分け
HTML から要素を抽出する方法には、CSS セレクタ・XPath・正規表現の 3 通りがあります。CSS セレクタは Web 制作で慣れ親しんだ記法で、BeautifulSoup の select() や lxml の cssselect で利用できます。XPath はパスをツリー上の条件で記述するため、「親の前の兄弟」のような複雑な参照が可能で、表形式データの抽出に強みがあります。正規表現は最後の手段で、HTML 構造の変化に極端に弱いため極力使わないのが鉄則です。「クラス名がたまたま空白を含む」だけで一気に壊れます。
非同期スクレイピングと並列実行
大量ページを取得する場合は asyncio + aiohttp を組み合わせると圧倒的に高速になります。ただし非同期にすると意図せず連続リクエストを送りすぎて相手のサーバーを攻撃する形になりやすいため、asyncio.Semaphore で同時接続数を 3〜5 程度に絞り、各タスク内で await asyncio.sleep(1) を入れるのが現実的なバランスです。スレッドプールの concurrent.futures.ThreadPoolExecutor も同様の用途で使えますが、I/O バウンドな処理では asyncio の方が軽量です。
クローラーとの違い
スクレイピングが「特定ページから必要なデータを抽出する」ことに焦点を当てるのに対し、クローラー (crawler) は「リンクを辿って多数のページを巡回する」仕組みです。検索エンジンの Googlebot が代表例です。実務ではこの 2 つを組み合わせ、まずクローラーで対象ページを発見し、各ページに対してスクレイピングを行うという二段構えで実装します。フレームワークとしては Scrapy が高機能で、リクエスト並列・パイプライン・自動リトライ・robots.txt 遵守などをデフォルトで備えており、本格運用向きです。
データ保存とインクリメンタル更新
取得したデータをそのまま CSV に追記し続けると重複が積もるため、ユニークキー(URL や記事 ID)を主キーとした SQLite / PostgreSQL に保存し、UPSERT で挿入・更新を分岐させるのが堅実です。差分だけ取得したい場合は、前回取得時の最終更新日時を記録しておき、If-Modified-Since ヘッダや、RSS / sitemap.xml の lastmod を参照する設計が有効です。これにより、対象サイトへの負荷も自分の処理時間も大幅に削減できます。
ログインが必要なサイトへの対応
会員制サイトや管理画面など、ログインが必要なページをスクレイピングする場合は、まず認証フォームに POST してセッション Cookie を取得し、その Cookie を保持したまま後続のページを取得します。requests.Session() を使うと自動的に Cookie が引き継がれるため便利です。ただし利用規約で第三者ツールによる自動ログインを禁じているサイトも多く、規約違反が判明すればアカウント停止や法的措置の対象になります。BOT 検知のために CAPTCHA や JavaScript チャレンジ(Cloudflare 等)が挿入されている場合、回避を試みると不正アクセス禁止法に該当するリスクもあり、絶対に避けるべきです。
User-Agent と識別の作法
HTTP リクエストの User-Agent ヘッダは、本来「どんなクライアントから来たか」をサーバーに伝えるものです。スクレイピングでは Web ブラウザの UA をそのまま借りるサンプルが多く出回っていますが、これは偽装行為です。良識的なクローラーは MyAppName/1.0 (+https://example.com/bot) のように、自分の名前と連絡先を含む UA を名乗ります。これによりサイト管理者は問い合わせ先を知ることができ、もし負荷が問題になれば直接コンタクトしてもらえる関係が築けます。逆に偽装 UA で連打アクセスをしていると、検知された段階で IP ブロック・法的通告に直結します。
取得結果のクレンジング
取得した HTML から要素を抜いた後、テキストには余分な空白・改行・タブ・全角スペース・ゼロ幅文字などが混在することが多く、そのまま保存すると分析時に困ります。str.strip() で前後の空白を除き、正規表現 re.sub(r"\s+", " ", text) で連続空白を 1 個に圧縮するのが最低限。さらに HTML エンティティ(&、 など)の復号、Unicode 正規化 (NFKC)、改行コードの統一など、データ品質に直結する処理を実装しましょう。クレンジングを後回しにすると、データ分析や機械学習モデルの精度が大きく下がる原因になります。
関連記事
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?