Tony Wang9 分で読めますWebサイトのデータをExcelにスクレイピングする3つの方法
WebサイトのデータをExcelやGoogle Sheetsに取り込む3つの方法 — Power QueryとIMPORTXML、ノーコードスクレイパー、スケジュール実行できるPython + APIスクリプトを解説。
Web サイトのデータを Excel にスクレイピングする現実的な方法は 3 つあります。すでに手元にある標準機能(Excel Power Query と Google Sheets のインポート関数)、Octoparse や Browse AI のようなノーコードのスクレイパー、そして API を呼び出してブックを書き出してくれる短い Python スクリプトです。どれも機能します — ただし、それぞれ特定の種類のサイトと特定の種類のユーザー向けです。このガイドでは、コピペで使える例とともに 3 つすべてを正直に解説し、最後に 30 秒で選べる比較表を掲載します。
方法 1: 標準機能 — Excel Power Query と Google Sheets の関数
取得したいページがプレーンな HTML テーブル — Wikipedia のリスト、リーグの順位表、政府の統計テーブル — なら、ここから始めましょう。2 分で終わり、費用はかかりません。
Excel: Power Query の「From Web」
Excel 2016 以降には Power Query が同梱されており、URL から直接テーブルを取り込めます。
- Excel を開き、Data タブに移動します。
- From Web(Get and Transform Data グループ内)をクリックし、ページの URL を貼り付けます。
- ナビゲーターに、Excel がページ上で見つけたすべてのテーブルがプレビュー表示されます。1 つ選びます。
- Transform Data をクリックして Power Query エディターで列や型を整えるか、Load をクリックしてそのままシートに読み込みます。
結果は一度きりの貼り付けではなく、ライブなクエリです。テーブルを右クリックして Refresh を選ぶか、Data → Queries & Connections → Properties → Refresh every N minutes を設定すれば、ブックを開いている間はタイマーで再取得されます。
Google Sheets: IMPORTHTML と IMPORTXML
Google Sheets は 2 つの関数で同じ仕事をこなします。IMPORTHTML はページ上の N 番目のテーブルまたはリストを取得します。
=IMPORTHTML("https://en.wikipedia.org/wiki/List_of_countries_by_population_(United_Nations)", "table", 1)
IMPORTXML は精密ツールです — XPath クエリを受け取るので、テーブル全体ではなく特定の要素だけを取り出せます。
=IMPORTXML("https://example.com/product", "//h1")
=IMPORTXML("https://en.wikipedia.org/wiki/Moon_landing", "//a/@href")
2 つ目の数式は、ページ上のすべてのリンクの href を取得します。Sheets はこれらのインポートを定期的に(おおよそ 1 時間ごとに)再評価するため、簡易的な自動更新が無料で手に入ります。
標準機能が通用しなくなるところ
どちらのツールにも共通する厳しい限界が 1 つあります。サーバーが最初のロードで返す生の HTML しか読まない ことです。サイトがその後 JavaScript でデータを埋め込む場合 — Amazon、Google の検索結果、E コマースの大半、ダッシュボードの大半、そしてほぼすべてのモダンな Web アプリが該当します — Power Query には空のページしか見えず、IMPORTXML は #N/A か何も返しません。ブラウザによるレンダリングのステップも、ログイン処理も、anti-bot 回避もありません。自動リクエストをレート制限したりブロックしたりするサイトはこれらもブロックしますし、Sheets のインポートに使われる Google の共有 IP は、多くのサイトで最初からブロックされています。
標準機能には、もっと静かな脆さもあります。数式はページのマークアップ内の位置を指しているため、リニューアルがあると音もなく壊れます。これは HTML parsing 全般の問題 — ページは動く標的です — ですが、数式にはエラー処理がまったくなく、月曜の朝にセル A1 に #N/A が出るだけです。
評価: ときどき確認する静的テーブルには最適。動的なサイト、保護されたサイト、あるいはスケジュールで確実に動かしたいものには不向きです。
方法 2: ノーコードのスクレイパーツール(Octoparse、Browse AI など)
次の段階はビジュアルなスクレイパーです。Octoparse は、データフィールドの自動検出、人気サイト向けのプリセットテンプレート、クラウドでのスケジューリング、Excel・CSV・Google Sheets への直接エクスポートを備えたポイント&クリックのワークフロービルダーを提供します。Browse AI は、あなたが欲しいフィールドをクリックする様子を見て「ロボット」を訓練し、それをスケジュール(毎時、毎日)で再実行して、結果を Google Sheets や Airtable に同期でき、さらに変更監視も載せられます。どちらも JavaScript でレンダリングされるページやページネーションに対応し、有料プランではプロキシのローテーションも扱えます。
これは、1〜2 サイトを監視したい非エンジニアには本当に良い選択です。コード不要、ビジュアルエディター、そして 1 時間以内に動くエクスポートが手に入ります。
正直なトレードオフは次のとおりです。
- サイトごとのセットアップ。 すべての Web サイトが個別のロボットまたはタスクになります。10 サイトなら、構築して面倒を見る設定が 10 個です。
- リニューアルへの脆さ。 ロボットは記憶したセレクターをクリックします。サイトがリニューアルすると、再訓練するまでロボットは間違ったデータや空のデータを返します — そして多くの場合、壊れたスプレッドシートで初めて気づきます。
- サブスクリプション費用。 無料枠は小さく、実用的なボリューム、クラウドスケジューリング、プロキシは有料プランにあります。有料プランは概ねミドルクラスの SaaS シート程度の価格から始まり、ページ数に応じて上がっていきます。
- バージョン管理や統合が難しい。 スクレイパーはベンダーの GUI の中にあり、あなたのリポジトリにはないため、スクリプトのようにはコードレビュー、CI、下流のパイプラインに組み込めません。
評価: 少数の動的ページを見守る非プログラマーには正しい選択。多数のソース、独自の変換、あるいはチームが git で保守できるものが必要になると、適切さは下がります。
方法 3: Python — API 呼び出し、pandas、to_excel()
Python スクリプトを実行できるなら — あるいは実行できる人が近くにいるなら — これが最も強力な選択肢で、しかも思ったより短く書けます。パターンはこうです。クリーンな JSON を返すエンドポイントを呼び、pandas でフラット化し、to_excel() でブックを書き出す。保守すべきセレクターはありません。scraping API がレンダリング、プロキシ、リトライを API 側で処理し、サイトのマークアップが変わっても同じ正規化フィールドを返すからです。(自分でページをスクレイピングするか API を呼ぶかの詳しい比較は web scraping vs API を、ゼロから作るルートについては、生の HTML を自分でパースする方法を扱ったピラー記事 web scraping with Python と BeautifulSoup tutorial をご覧ください。)
以下は、Crawlora の Amazon 検索エンドポイントを使ったエンドツーエンド版です。まず 3 つのライブラリをインストールします。
pip install requests pandas openpyxl
そしてスクリプト全体はこれだけです。
import requests
import pandas as pd
API_KEY = "YOUR_API_KEY" # free tier: 2,000 credits/month, no card
resp = requests.get(
"https://api.crawlora.net/api/v1/amazon/search",
params={"k": "mechanical keyboard"},
headers={"x-api-key": API_KEY},
timeout=60,
)
resp.raise_for_status()
rows = resp.json()["data"] # list of normalized result cards
df = pd.DataFrame(rows)[
["asin", "title", "price", "list_price", "rating", "review_count", "link"]
]
df.to_excel("amazon-keyboards.xlsx", index=False, sheet_name="results")
print(f"Wrote {len(df)} rows to amazon-keyboards.xlsx")
実行すれば、本物の .xlsx がディスクに生成されます — 列は型付き、コピペなし、セレクターなし。k パラメータのキーワードを差し替えるか、エンドポイントを他の 対応プラットフォーム のいずれかに切り替えるだけです。docs には各エンドポイントのフィールドが一覧されており、playground を使えばコードを書く前にブラウザでリクエストを試せます。この API は pay-on-success の料金体系 — 成功した 2xx レスポンスに対してのみ課金 — なので、取得の失敗で失うのはリトライの手間だけで、クレジットは減りません。
Google Sheets バリエーション(gspread)
データをファイルではなく共有の Google Sheet に入れたい場合は? 同じスクリプトで最後のステップだけを変え、gspread ライブラリと Google のサービスアカウントを使います。
- Google Cloud Console でプロジェクトを作成し、Google Sheets API と Google Drive API を有効にします。
- サービスアカウント を作成し、その JSON キーファイルをダウンロードします。
- 対象のスプレッドシートを、サービスアカウントのメールアドレス(
iam.gserviceaccount.comで終わります)と共有します。同僚と共有するのと同じ要領です。
import gspread
gc = gspread.service_account(filename="service-account.json")
ws = gc.open("Keyboard price tracker").sheet1
ws.clear()
ws.update([df.columns.tolist()] + df.fillna("").values.tolist())
シートを開いている全員が、次の更新で新しいデータを見られます — ファイルをメールで回す必要はありません。
評価: セットアップは 15 分ほど。その後はこのページで最も長持ちする選択肢です。JS の重いサイトや保護されたサイトを API 経由で処理し、リニューアルに耐え、バージョン管理の中に置け、ループ 1 つでキーワード 1 件から 1,000 件までスケールします。
鮮度を保つ: 更新のスケジューリング
先月は正しかったスプレッドシートこそ、悪い意思決定の温床です。3 つの方法はどれも更新できますが、無人で更新できるのはスクリプトだけです。
- cron(macOS/Linux):
0 6 * * * /usr/bin/python3 /home/you/refresh.pyで、毎朝 06:00 にスクリプトが再実行されます。 - Task Scheduler(Windows): Basic Task を作成し、トリガーを Daily に、アクションを Start a program にして
python.exeを指定し、引数にスクリプトのパスを渡します。 - GitHub Actions — 稼働し続けるマシンが不要なので、いちばんスマートな選択肢です。
name: refresh-sheet
on:
schedule:
- cron: "0 6 * * *" # daily at 06:00 UTC
jobs:
refresh:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install requests pandas openpyxl gspread
- run: python refresh.py
env:
CRAWLORA_API_KEY: ${{ secrets.CRAWLORA_API_KEY }}
API キーはリポジトリの Actions シークレットに保存し、スクリプトには決して書かないでください。更新済みの .xlsx をビルド成果物としてプッシュするか、gspread で Google Sheets に書き込めば、ラップトップを開いていようがいまいが、スプレッドシートは毎日自動で更新されます。スケジュール実行するスクレイピング全般への礼儀としてひと言。頻度は目的に見合った範囲に保ちましょう — 毎日 1 回の取得と、エンドポイントを毎分叩き続けるのはまったく別物ですし、rate limits は API にも存在します。
(Power Query はブックを開いている間なら自動更新でき、Sheets のインポート関数はおおよそ 1 時間ごとに自動で再計算されます — カジュアルな用途には十分ですが、どちらもファイルを閉じている間は動かず、失敗をリトライすることもありません。)
どの方法を使うべきか?
| Excel Power Query | Sheets IMPORTXML/IMPORTHTML | ノーコードツール(Octoparse、Browse AI) | Python + スクレイピング API | |
|---|---|---|---|---|
| セットアップ時間 | 数分 | 数分 | サイトごとに 30〜60 分 | 初回 ~15 分、以降はどのエンドポイントもすぐ |
| JavaScript の重いサイト | 不可 | 不可 | 可 | 可(API がレンダリング) |
| アンチボット / ブロックされるサイト | 不可 | 不可 | 部分的(有料プロキシ) | 可(API が処理) |
| サイトリニューアルへの耐性 | なし | なし | なし(ロボットを再訓練) | あり(正規化 JSON) |
| 無人スケジューリング | ブックを開いている間のみ | 粗い自動再計算 | 有料クラウドプランで可 | 可 — cron / Actions |
| 費用 | Excel に含まれる | 無料 | サブスクリプション | 無料枠 2,000 クレジット/月、pay-on-success |
あなたがどんな立場かで選ぶなら、こうなります。
- 静的テーブルと締め切りを抱えたアナリスト: Power Query か
IMPORTHTML。5 分で終わります。考えすぎないこと。 - コードは一切書かず、動的ページを 1〜2 件監視するマーケターやオペレーション担当: ノーコードツールはサブスクリプション代の元を取ります。リニューアル後のロボット再訓練の時間は見込んでおきましょう。
- 多数のソース、保護されたサイト、あるいはチームで保守できるスケジュール済みパイプラインが必要な人: Python + API のスクリプト。安さ・耐久性・エンドツーエンドの自動化を同時に満たすのは、この中でこれだけです。
- スクレイパーを自作すべきか迷っているジュニア開発者: まず web scraping with Python を読んでください — DIY は素晴らしいスキルですが、本番運用のスプレッドシートでは、時間を食い潰すプロキシ・レンダリング・パーサーの保守を API ルートが取り除いてくれます。
- データは初期 HTML に含まれているか? 含まれているなら Power Query / IMPORTHTML で十分。
- ページは JavaScript でレンダリングされているか、ボット対策があるか? その場合はノーコードツールか API が必要。
- 無人で更新する必要があるか? スクリプト + cron/Actions が信頼できる道。
- サイトが数件を超えるか、チームメイトが保守する必要があるか? GUI のロボットよりコードを選ぶ。
- スクレイピングは公開データに限定し、頻度は控えめに、サイトの規約も確認する。
対応サイトをそのままスプレッドシートに
GET リクエスト 1 回で正規化された JSON が返り、あとは pandas と to_excel() が仕上げます。毎月 2,000 クレジット無料、カード不要、pay-on-success: 課金されるのは成功した 2xx レスポンスだけです。
関連記事: DIY ツールキット全体を扱うピラー記事 web scraping with Python、HTML を自分でパースしたい場合の BeautifulSoup tutorial、そしてどちらのアプローチがいつ勝つかを解説する web scraping vs API。
よくある質問
Excel で Web サイトのデータをスクレイピングできますか?
はい。Excel 2016 以降には Power Query が含まれています。Data タブから From Web を選び、URL を貼り付けると、ページ上で見つかった HTML テーブルを更新可能なクエリとして取り込みます。ただし読み取るのはサーバーが最初に返す HTML だけなので、静的なテーブルには有効ですが、JavaScript でレンダリングされるサイトやボット対策のあるサイトでは何も返りません。
Web サイトを Google Sheets にスクレイピングするには?
静的なページなら組み込みの関数を使います。IMPORTHTML はページ上の N 番目のテーブルやリストを取得し、IMPORTXML は XPath クエリで特定の要素を取得します。JavaScript の多いサイトや保護されたサイトでは、スクレイピング API を呼び出し、gspread ライブラリと Google のサービスアカウントでシートに行を書き込む短い Python スクリプトを実行しましょう。
Excel Power Query でテーブルが見つからない・ページが空になるのはなぜですか?
Power Query はサーバーが最初のロードで返す生の HTML を読み取ります。Amazon や Google をはじめ最近の Web アプリの多くのように、サイトがその後 JavaScript でコンテンツを埋め込む場合、初期 HTML にはデータが含まれないため、Power Query は何も見つけられません。ページをレンダリングできるツール、つまりノーコードのスクレイパーかスクレイピング API が必要です。
JavaScript の多いサイトのデータを Excel に取り込む最良の方法は?
クラウドでページをレンダリングするノーコードのスクレイパー(Octoparse、Browse AI)を使うか、正規化された JSON を返すスクレイピング API を呼び出して pandas の to_excel() で書き出す Python スクリプトを使います。スクリプトの方法はサイトのリニューアルにも耐え、cron や GitHub Actions できれいにスケジュールできます。
Excel でスクレイピングしたデータを自動的に更新するには?
Power Query はタイマーで更新できますが、ブックが開いている間だけです。無人での更新には、スケジュールでスクリプトを実行します。macOS/Linux では cron、Windows では Task Scheduler、あるいは cron トリガー付きの GitHub Actions ワークフローで、毎日データを取得し直して .xlsx や Google Sheet を書き換えます。
Web サイトをスプレッドシートにスクレイピングするのは合法ですか?
公開されているデータのスクレイピングは多くの法域で一般に許容されますが、データの種類、サイトの規約、そしてその使い方によって変わります。公開データに限定し、リクエスト頻度を控えめにし、個人データを避け、ソースの規約を確認してください。なお、これは法的助言ではなく背景情報です。
Web サイトを Excel にスクレイピングする費用はどのくらいですか?
Excel Power Query と Google Sheets の関数は、すでに持っているツールに含まれるので無料です。ノーコードのスクレイパーは、ボリューム・スケジューリング・プロキシが必要になるとサブスクリプションが要ります。Crawlora の API には毎月 2,000 クレジットの無料枠がカード不要で用意されており、料金は pay-on-success — 成功した 2xx レスポンスに対してのみ課金されます。