ウェブスクレイピングは、以前は一部の人だけが使う技術でしたが、今では営業、オペレーション、マーケットリサーチに関わる人にとって欠かせないスキルになりました。Webデータの量が爆発的に増えている今、世界全体のデータ生成量は2019年から2023年にかけて約しました。そのため、が、今ではデータを意思決定の「中心」とみなしているのも不思議ではありません。とはいえ、落とし穴もあります。が、HTMLのように扱いづらい非構造化データの処理を大きな課題だと答えています。私も、Webサイトの情報をスプレッドシートに落とし込もうとして、延々とコピー&ペーストを繰り返しているチームを何度も見てきました。はっきり言って、かなりしんどい作業です。
そこで登場するのが、PythonのBeautifulSoupです。この実践チュートリアルでは、BeautifulSoupを使ったウェブスクレイピングの方法を、実際のPython Beautiful Soupの例とともに解説します。自分の業務に応用しやすい形で紹介するので、そのまま使えます。さらに、私は「頑張るより、賢く働く」派なので、Thunderbit(AI搭載のウェブスクレイパー)とBeautifulSoupを組み合わせて、作業を高速化し、よりきれいで構造化されたデータを取得する方法も紹介します。コーディング経験の有無は関係ありません。
BeautifulSoupとは何か、なぜウェブスクレイピングに使うのか?
まずは基本から見ていきましょう。は、HTMLやXML文書の解析を簡単にしてくれるPythonライブラリです。Webページのごちゃごちゃした「タグのスープ」を、たどれる木構造に変換してくれる翻訳機のようなものだと考えるとわかりやすいでしょう。必要なデータを見つけて、抽出し、操作するのがぐっと楽になります。このプロジェクトはいまも活発に保守されており、beautifulsoup4 4.14.3は2025年後半にPyPIで公開されています。つまり、ここで学ぶ内容は今でも有効です。ECサイトから商品価格を取ってくる場合でも、ニュースの見出しを集める場合でも、企業ディレクトリから見込み客情報を抽出する場合でも、BeautifulSoupはWebページを構造化された実用データに変える定番ツールです。
では、なぜこれほど人気なのでしょうか。まず、初心者にとてもやさしいことが挙げられます。BeautifulSoupは乱れたHTMLにも柔軟で、しかもPythonらしい記法のおかげで、数行のコードでスクレイピングを始められます。対応コミュニティも非常に大きく、ダウンロード数も多いため、困ったときはGoogleで検索すればだいたい解決策が見つかります。
BeautifulSoupの代表的な用途は次のとおりです。
- ECサイトから商品名、価格、評価を抽出する
- ニュースサイトから見出し、著者、公開日を取り出す
- 表やディレクトリ(会社一覧や連絡先一覧など)を解析する
- 掲載サイトからメールアドレスや電話番号を集める
- 価格変更や新しい求人情報などの更新を監視する
データが静的HTMLにあるなら、BeautifulSoupはウェブスクレイピングの心強い相棒です。
ウェブスクレイピングにおけるBeautifulSoupの強み
Pythonのウェブスクレイピング用ライブラリはたくさんあります。では、なぜBeautifulSoupを選ぶのでしょうか。競合と比べたときの強みを見てみましょう。
- シンプルさ: BeautifulSoupは軽量で覚えやすく、学習コストが低いです。大掛かりなフレームワークを組んだり、大量の定型コードを書いたりする必要はありません。ちょっとした単発のスクレイピングや、これから始める初心者に最適です。
- 柔軟性: 壊れたHTMLや不完全なHTMLにも対応しやすく、想像以上に使えます。
- 柔軟な構造: かっちりしたクロール設計に縛られることがありません。HTMLを渡して、必要なものを抜き出すだけです。
- 連携しやすさ:
requests(Webページ取得)、csv(データ保存)、pandas(データ分析)など、他のPythonライブラリと相性抜群です。
他のツールと比べるとどうでしょうか?
| ツール | 得意な用途 | 長所 | 短所 |
|---|---|---|---|
| BeautifulSoup | 静的HTMLの解析、初心者向け | シンプル、導入が速い、柔軟で壊れにくい | JavaScriptが多いサイトには不向き |
| Scrapy | 大規模・非同期ジョブ | 高機能、拡張性が高い、クロール機能内蔵 | 学習曲線が急で、初期設定も多い |
| Selenium | JavaScript/動的コンテンツ | JS操作、フォーム入力、ボタンクリックが可能 | 遅い、重い、リソース消費が大きい |
もしあなたが始めたばかりなら、あるいは静的ページを素早く解析したいなら、BeautifulSoupはウェブスクレイピングの「スイスアーミーナイフ」です()。より複雑なサイトや動的なサイトでは、SeleniumやScrapyと組み合わせることもありますが、まず基礎を身につけるならBeautifulSoupが最適です。
BeautifulSoupを使うためのPython環境の準備
準備はできましたか? 環境のセットアップ方法は次のとおりです。
-
Pythonをインストールする: から最新版をダウンロードします。
-
仮想環境を作成する(任意ですが推奨):
1python -m venv venv 2source venv/bin/activate # Windowsの場合: venv\Scripts\activate -
BeautifulSoupと依存関係をインストールする:
1pip install beautifulsoup4 requests lxml html5libbeautifulsoup4: メインライブラリrequests: Webページ取得用lxmlまたはhtml5lib: 高速で信頼性の高いHTMLパーサー
-
トラブルシューティングのヒント:
- 「pip not found」というエラーが出たら、
pip3かpy -m pipを試してください。 - Mac/Linuxでは、権限の都合で
sudoが必要な場合があります。 - Windowsでは、PythonがPATHに追加されているか確認してください。
- 「pip not found」というエラーが出たら、
セットアップが正しくできているか確認するには、次の簡単なテストを実行します。
1from bs4 import BeautifulSoup
2import requests
3html = requests.get("http://example.com").text
4soup = BeautifulSoup(html, "html.parser")
5print(soup.title)
<title>Example Domain</title> と表示されれば準備完了です()。
ステップごとのPython Beautiful Soupの実践例
実際のPython Beautiful Soupの例を見てみましょう。ここでは、公開ニュースサイトから最新の見出しを抽出したいとします。手順は次のとおりです。
1. Webページを取得する
1import requests
2from bs4 import BeautifulSoup
3url = "https://www.bbc.com/news"
4response = requests.get(url)
5html = response.text
2. HTMLを解析する
1soup = BeautifulSoup(html, "html.parser")
3. HTML構造を確認する
ブラウザの開発者ツールを開き(右クリック→「検証」)、見出しが含まれているタグを探します。多くのニュースサイトでは、見出しは特定のクラス名を持つ<h3>タグの中にあります。
たとえば、次のように見えるかもしれません。
1<h3 class="gs-c-promo-heading__title">見出しタイトル</h3>
4. データを抽出する
1headlines = soup.find_all("h3", class_="gs-c-promo-heading__title")
2for h in headlines:
3 print(h.get_text(strip=True))
これで、ページ上のすべてのニュース見出しが表示されます。
5. データをCSVに保存する
見出しを後で分析できるように保存しましょう。
1import csv
2with open("headlines.csv", "w", newline='', encoding="utf-8") as file:
3 writer = csv.writer(file)
4 writer.writerow(["headline"])
5 for h in headlines:
6 writer.writerow([h.get_text(strip=True)])
これで、ExcelやGoogleスプレッドシートで使えるCSVファイルができました。
効果的なデータ抽出のためのHTML構造の理解
コードを書く前に、必ずページのHTMLを確認しましょう。方法は次のとおりです。
- 開発者ツールを開く: ページ上で右クリックし、「検証」を選びます。
- データを見つける: 要素にカーソルを合わせ、どのタグに見出し、価格、著者などの情報が入っているか確認します。
- タグとクラス名を確認する:
class="product-title"やid="main-content"のような識別子を探します。 - セレクタをテストする: BeautifulSoupの
.find()、.find_all()、.select()を使って対象要素を絞り込みます。
ちょっとしたコツ: soup.prettify() を使うと、Pythonコンソールで読みやすいHTMLを表示できます。
BeautifulSoupでデータを抽出して構造化する
たとえば、ブログページからタイトルと著者の両方を取り出したいとします。
1articles = soup.find_all("article")
2data = []
3for article in articles:
4 title = article.find("h2").get_text(strip=True)
5 author = article.find("span", class_="author").get_text(strip=True)
6 data.append({"title": title, "author": author})
これで辞書のリストができました。CSVに出力するにも、さらに分析するにもぴったりです。
リンク、画像、その他の属性も次のように取得できます。
1for link in soup.find_all("a"):
2 print(link.get("href"))
画像ならこちらです。
1for img in soup.find_all("img"):
2 print(img.get("src"))
抽出したデータの保存: PythonからExcelやCSVへ
データを構造化したら、出力は簡単です。csvモジュールを使う方法はこちらです。
1import csv
2with open("articles.csv", "w", newline='', encoding="utf-8") as file:
3 writer = csv.DictWriter(file, fieldnames=["title", "author"])
4 writer.writeheader()
5 for row in data:
6 writer.writerow(row)
pandas派なら、こちらでもOKです。
1import pandas as pd
2df = pd.DataFrame(data)
3df.to_csv("articles.csv", index=False)
4df.to_excel("articles.xlsx", index=False)
文字化けや特殊文字の問題を避けるために、必ずUTF-8エンコーディングを使ってください。特に国際的なデータでは重要です。
ケーススタディ: BeautifulSoupでニュースサイトのデータをスクレイピングする
実践的なPython Beautiful Soupの例として、ニュースサイトから記事タイトル、著者、公開日を抽出してみましょう。
ここでは、 から記事データを取得するとします。
1import requests
2from bs4 import BeautifulSoup
3import csv
4url = "https://edition.cnn.com/world"
5response = requests.get(url)
6soup = BeautifulSoup(response.content, "html.parser")
7articles = soup.find_all("article")
8data = []
9for article in articles:
10 title_tag = article.find("h3")
11 date_tag = article.find("span", class_="date")
12 author_tag = article.find("span", class_="author")
13 title = title_tag.get_text(strip=True) if title_tag else ""
14 date = date_tag.get_text(strip=True) if date_tag else ""
15 author = author_tag.get_text(strip=True) if author_tag else ""
16 data.append({"title": title, "date": date, "author": author})
17with open("cnn_articles.csv", "w", newline='', encoding="utf-8") as file:
18 writer = csv.DictWriter(file, fieldnames=["title", "date", "author"])
19 writer.writeheader()
20 for row in data:
21 writer.writerow(row)
このスクリプトは最新記事を取得し、タイトル、日付、著者を抽出してCSVに保存します。ただし、CNNの現在のマークアップが上記のタグ構造と一致している場合に限ります。大手ニュースサイトはクラス名やDOM構造を頻繁に変更するので、本番データに対して実行する前に必ず再度ページを確認してください。構造としては、<article>コンテナをたどり、その子要素に対してfindする形が安定したパターンです。一方で、"date"や"author"のような具体的なクラス名は、その時点のページに合わせて調整するためのプレースホルダーです。
ワークフローを強化する: BeautifulSoupとThunderbitの組み合わせ
では、スクレイピングの流れをさらにスムーズにする方法を見てみましょう。ThunderbitはAI搭載のウェブスクレイパーChrome拡張で、データ抽出の迷いをなくしてくれます。Thunderbitを使えば、次のことができます。
- 「AIで項目を提案」を使う: Thunderbitがページを読み取り、抽出すべきデータ項目を自動で提案します。もうHTMLを探し回ったり、セレクタを微調整したりする必要はありません。
- サブページをスクレイピングする: Thunderbitは個別の商品ページや記事ページのようなサブページへリンクをたどり、追加情報でデータセットを充実させられます。
- 即座にエクスポートする: 1クリックでExcel、Googleスプレッドシート、Airtable、Notionへ直接送信できます。
- ページネーションに対応する: Thunderbitは複数ページにまたがるデータもスクレイピングできます(無限スクロールも含む)。
- 定期実行を設定する: 繰り返しジョブを設定して、データを常に最新に保てます。
私が気に入っているハイブリッドな流れは次のとおりです。
- まずThunderbitを使う: 対象サイトを開き、Thunderbitアイコンをクリックして、「AIで項目を提案」にタイトル、著者、日付などの列を見つけてもらいます。
- データをエクスポートする: 結果をCSVでダウンロードするか、Googleスプレッドシートに送信します。
- BeautifulSoupでカスタム処理をする: さらに深い分析(テキストのクリーニング、重複排除、他ソースとの結合など)が必要なら、エクスポートしたCSVをPythonに読み込み、BeautifulSoupやpandasで後処理します。
この組み合わせなら、Thunderbitの速さとAIによる項目検出、そしてBeautifulSoupの柔軟なカスタム処理の両方を活かせます。
速度とデータ品質: なぜThunderbitとBeautifulSoupを併用するのか?
なぜ両方を使う価値があるのでしょうか。私が感じているのは、次のような点です。
- スピード: Thunderbitは数十ページを並列でスクレイピングできます(クラウドモードでは一度に最大50ページ)。そのため、何時間もかけずに数分でデータを取得できます。
- データの網羅性: ThunderbitのAIはレイアウトの変化に適応し、厄介なサイトからでも構造化データを抽出できるため、取りこぼしが減ります。
- エラー削減: クラス名が変わるたびにスクリプトが壊れる、という悩みがなくなります。ThunderbitのAIが毎回ページを再評価してくれます。
- 高度な後処理: フィルタリング、翻訳、データセットの結合など、より高度な処理が必要な場合でも、BeautifulSoupとpandasなら自在にコントロールできます。
このハイブリッドな方法は、特に次の用途で威力を発揮します。
- 大規模なリード獲得: Thunderbitで大量のデータを収集し、BeautifulSoupで整形・補完する
- 商品モニタリング: Thunderbitが反復作業を担当し、BeautifulSoupで傾向分析や異常検知を行う
- ニュースやコンテンツの追跡: Thunderbitで記事を素早く集め、その後Pythonで感情分析やキーワード抽出を行う
BeautifulSoupでよくある問題の対処法
ウェブスクレイピングはいつも順風満帆とは限りません。よくある落とし穴と対処法を紹介します。
- 動的コンテンツ: サイトがJavaScriptでデータを読み込む場合(無限スクロール、AJAXなど)、BeautifulSoup単体では取得できません。その場合はSeleniumやThunderbitのブラウザモードを使いましょう。
- ボット対策: 自動リクエストをブロックするサイトもあります。カスタムのUser-Agentヘッダーを設定する、リクエスト間に待機を入れる、Thunderbitのクラウドスクレイピングで簡易ブロックを回避する、といった方法を試してください。
- HTML構造の変更: スクリプトが突然壊れたら、サイトのHTMLが変わった可能性があります。もう一度ページを確認し、セレクタを更新しましょう。ThunderbitのAIは、その場で適応できるのでここでも役立ちます。
- データ欠損:
.get_text()を呼ぶ前に、要素が存在するか必ず確認してください。属性には[]ではなく.get()を使うと、KeyErrorを避けられます。 - 文字エンコーディングの問題: 特殊文字に対応できるよう、ファイルはUTF-8で保存しましょう。
そして何より、robots.txtとサイトの利用規約は必ず守ってください。責任あるスクレイピングを心がけましょう。失礼なロボットは歓迎されません。
まとめと重要ポイント
BeautifulSoupを使ったウェブスクレイピングは、今のデータ主導の世界で学ぶ価値が非常に高い実用スキルです。このBeautifulSoupのウェブスクレイピングチュートリアルで学んだ内容をまとめると、次のとおりです。
- BeautifulSoupは、静的HTMLを解析し、Pythonで構造化データを抽出するための最適な出発点です。
- セットアップは簡単で、Python、pip、いくつかのライブラリを入れるだけです。
- HTMLの確認は、正しいデータを狙うための鍵です。
- CSV/Excelへの出力で、データはすぐにビジネス分析に使えます。
- Thunderbitとの併用により、AIによる項目検出、高速スクレイピング、簡単なエクスポートが可能になり、ビジネスユーザーや非エンジニアに最適です。
- ハイブリッドワークフロー(大量抽出はThunderbit、個別処理はBeautifulSoup)が、速度、データ品質、柔軟性のバランスに優れています。
ウェブスクレイピングを本格的に強化したいなら、ぜひ両方のツールを試してみてください。まずは簡単なBeautifulSoupスクリプトを動かし、そのあとでを使うと、どれだけ速くなるか実感できるはずです。さらに実践的なガイドはでチェックしてください。
楽しくスクレイピングしましょう。データがいつもきれいで、構造化され、すぐ使える状態でありますように。
よくある質問
1. BeautifulSoupとは何ですか?何に使いますか?
BeautifulSoupは、HTMLおよびXML文書を解析するためのPythonライブラリです。Webページからデータを抽出し、リストや表のような構造化された形式に変換するのに役立つため、ウェブスクレイピングのプロジェクトに最適です。
2. BeautifulSoupはSeleniumやScrapyと比べてどうですか?
BeautifulSoupは軽量で、静的HTMLページに使いやすいのが特長です。Seleniumは動的でJavaScriptが多いサイトに向いており、Scrapyは大規模な非同期スクレイピング向けの高機能フレームワークです。初心者や手早い作業にはBeautifulSoupが最適です。
3. BeautifulSoupとThunderbitを一緒に使えますか?
もちろんです。ThunderbitはAIを使ってWebページから項目を素早く見つけて抽出でき、BeautifulSoupはエクスポートしたデータのカスタム後処理や、より深い分析に使えます。
4. BeautifulSoupを使ったウェブスクレイピングでは、どんな課題がよくありますか?
よくある問題には、動的コンテンツの処理、ボット対策への対応、HTML構造の変化への追従があります。ThunderbitのAI機能やブラウザモードを使うと、こうした課題の多くを乗り越えやすくなります。
5. BeautifulSoupで抽出したデータをExcelやCSVに書き出すにはどうすればよいですか?
Python標準のcsvモジュールかpandasライブラリを使って、抽出データをCSVやExcelファイルに保存できます。特殊文字への対応とスプレッドシートとの互換性のために、必ずUTF-8エンコーディングを使ってください。
自分で試してみる準備はできましたか? をダウンロードして、今日からもっと賢くスクレイピングを始めましょう。さらに多くのチュートリアルやヒントは、 でご覧いただけます。
さらに詳しく
