- 作成日 : 2025年10月16日
スプレッドシートでWebスクレイピングするには?GAS・関数・Pythonを使った自動データ収集方法
スプレッドシートを使ったWebスクレイピングは、プログラミング経験が少ない方でも簡単にWebサイトからデータを自動収集できる効率的な方法です。本記事では、Google Apps Script(GAS)による自動化、IMPORTXML関数などの標準機能、さらにPythonとの連携によるデータ抽出まで、それぞれの特徴と具体的な実装手順を解説します。
業務でのデータ収集作業を大幅に効率化したい方に向けて、すぐに実践できる手法をご紹介します。
目次
スプレッドシートでスクレイピングは可能?
Googleスプレッドシートでは、IMPORTXMLといった組み込み関数を使えばコーディング不要で、またGoogle Apps Script (GAS) を使えばプログラミングによって、Webスクレイピングが実現できます。これらの機能により、Webページから必要な情報を自動的に抽出し、表形式で整理することができます。ただし、JavaScriptで動的に生成されるコンテンツや、ログインが必要なサイトのデータ取得には制限があることを理解しておく必要があります。
スプレッドシートでのWeb情報取得は、主に3つのアプローチがあります。1つ目は組み込み関数(IMPORTXML、IMPORTHTML等)を使った静的なデータ取得、2つ目はGoogle Apps Script (GAS)による柔軟な自動化、3つ目は外部のプログラミング言語(Python等)との連携です。それぞれに長所と短所があり、取得したいデータの性質や更新頻度によって使い分けることが成功の鍵です。
Webスクレイピングに適したデータの種類は?
定期的に更新されるECサイトの価格情報、企業の在庫状況、ニュースサイトの見出しなど、HTMLタグで構造化されたデータの取得に最適です。特に、Webページ上でテーブル形式(<table>)で表示されているデータや、XMLサイトマップ、RSSフィードなどは、スプレッドシートの標準機能だけで簡単に取り込めます。
一方で、画像データそのものや、PDFファイル内のテキスト、ユーザーの操作に応じてJavaScriptで動的に生成されるグラフやチャートなどは、スプレッドシート単体での取得が困難です。このような複雑なケースでは、後述するPythonなどのプログラミング言語と組み合わせることで対応できる場合があります。
法的・倫理的な注意点とは?
Webスクレイピングを実施する前に、対象サイトの利用規約とrobots.txtを必ず確認し、サーバーに過度な負荷をかけない配慮が必要です。 多くのWebサイトでは、自動アクセスに関する規定を設けており、これに違反すると法的問題に発展する可能性があります。
実装時は、リクエスト間隔を適切に設定し(最低でも1秒以上の間隔を推奨)、User-Agentヘッダーで自身を適切に識別することが重要です。また、取得したデータの使用目的も、個人利用や研究目的に留め、商用利用の場合は別途許可を得る必要があります。
GAS(Google Apps Script)を使ったスクレイピング方法とは?
Google Apps Script (GAS) を使うと、UrlFetchApp.fetch()メソッドでWebページのHTMLを取得し、正規表現やHTMLパーサー(解析ライブラリ)で必要なデータを抽出できます。 GASはGoogleのサーバー上で実行されるため、自分のPCに開発環境を構築する必要がなく、定期実行の設定も簡単に行えるという利点があります。
GASによるWebデータ収集は、スプレッドシートとの親和性が極めて高く、取得したデータを直接セルに書き込むことができます。また、トリガー機能を使えば、毎日決まった時間に自動実行することも可能で、データの定期収集に最適です。
STEP1:GASエディタの開き方と基本設定
スプレッドシートのメニューから「拡張機能」→「Apps Script」を選択することで、GASエディタが開きます。 初回起動時は、Googleアカウントでの認証が必要になります。エディタが開いたら、デフォルトで表示されるmyFunction()を削除し、新しい関数を作成します。
プロジェクト名は分かりやすい名前に変更し、必要に応じてライブラリを追加します。HTMLパースには「Cheerio」ライブラリ(ライブラリID: 1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0)が便利です。
STEP2:基本的なスクレイピングコードの実装
javascript
function scrapeWebsite() {
// 対象URLの指定
const url = ‘https://example.com/data’;
// Webページの取得
const response = UrlFetchApp.fetch(url);
const html = response.getContentText();
// 正規表現でデータ抽出(例:価格情報)
const pricePattern = /<span class=”price”>([0-9,]+)円</span>/g;
const matches = html.matchAll(pricePattern);
// スプレッドシートへの書き込み
const sheet = SpreadsheetApp.getActiveSheet();
let row = 1;
for (const match of matches) {
sheet.getRange(row, 1).setValue(match[1]);
row++; }}
このコードは基本的な構造を示していますが、実際の使用時は対象サイトのHTML構造に合わせてセレクタやパターンを調整する必要があります。
STEP3:エラーハンドリングと定期実行の設定
try-catch文でエラーを捕捉し、実行ログに記録することで、スクレイピングの失敗を検知・対処できます。 ネットワークエラーやサイト構造の変更に対応するため、適切なエラーハンドリングは必須です。
定期実行は、GASエディタの「トリガー」メニューから設定できます。時間主導型トリガーを追加し、実行間隔(毎時、毎日、毎週など)を指定します。ただし、1日あたりの実行時間に制限(1日あたり無料版90分/Workspaceアカウント6時間)があることに注意が必要です。
スプレッドシートの関数でスクレイピングする方法は?
IMPORTXML、IMPORTHTML、IMPORTDATAなどの組み込み関数を使用すれば、プログラミング知識なしでWebデータを取得できます。 これらの関数は、セルに数式を入力するだけで動作し、自動的に最新データに更新される点が大きな魅力です。
各関数には得意とするデータ形式があり、HTMLテーブルにはIMPORTHTML、XMLやXPath指定にはIMPORTXML、CSVファイルにはIMPORTDATAが適しています。これらを組み合わせることで、様々なWebサイトからのデータ取得が可能になります。
IMPORTXML関数の使い方と実例
IMPORTXML関数は、XPath式を使用してWebページの特定要素を抽出する最も汎用性の高い関数です。 構文は=IMPORTXML(URL, XPath式)で、XPath式により柔軟なデータ指定が可能です。
実例として、ニュースサイトから記事タイトルを取得する場合:
=IMPORTXML(“https://news.example.com”, “//h2[@class=’article-title’]”)
XPath式の作成には、ブラウザの開発者ツールが便利です。取得したい要素を右クリックし、「Copy」→「Copy XPath」を選択することで、正確なパスを取得できます。
参考:IMPORTXML – Google ドキュメント エディタ ヘルプ
IMPORTHTML関数でテーブルデータを取得する方法
IMPORTHTML関数は、Webページ内のテーブルやリストを丸ごと取り込むのに特化した関数で、構造化されたデータの取得に最適です。 構文は=IMPORTHTML(URL, “table”または”list”, インデックス)となります。
例えば、Wikipedia の表データを取得する場合:
=IMPORTHTML(“https://ja.wikipedia.org/wiki/都道府県”, “table”, 1)
この関数の利点は、テーブル全体を一度に取得でき、列の並びもそのまま維持される点です。ただし、ページ内に複数のテーブルがある場合は、インデックス番号で指定する必要があります。
参考:IMPORTHTML – Google ドキュメント エディタ ヘルプ
関数使用時の制限事項と回避策
スプレッドシートの関数には、同時接続数50個程度、更新頻度1時間ごとという制限があり、大規模なデータ収集には不向きです。 また、認証が必要なサイトやJavaScriptで動的に生成されるコンテンツは取得できません。
これらの制限を回避するには、複数のスプレッドシートに分散させる、GASで中間処理を行う、外部APIを活用するなどの方法があります。特に、更新頻度を高めたい場合は、GASのUrlFetchAppを使用した実装への切り替えを検討すべきです。
Pythonでスクレイピングしてスプレッドシートに書き出す方法とは?
PythonのBeautifulSoupやSeleniumでスクレイピングしたデータを、Google Sheets APIやgspreadライブラリを使ってスプレッドシートに自動書き込みできます。 この方法は、複雑なWebサイトや大量のデータを扱う場合に最も効果的で、処理速度と柔軟性の面で優れています。
Pythonを使用することで、動的なJavaScriptサイト、ログイン認証が必要なページ、画像やPDFの処理など、スプレッドシート単体では困難な処理が可能になります。また、pandas等のデータ分析ライブラリと組み合わせることで、収集したデータの前処理や分析も同時に行えます。
STEP1:必要なライブラリのインストールと認証設定
まず、pip install gspread google-auth beautifulsoup4 requestsコマンドで必要なライブラリをインストールします。 Google Sheets APIの有効化とサービスアカウントの作成も必要です。
Google Cloud Consoleで新しいプロジェクトを作成し、Google Sheets APIを有効化します。次に、サービスアカウントを作成して認証情報(JSONファイル)をダウンロードし、対象のスプレッドシートにサービスアカウントのメールアドレスを共有設定で追加します。
STEP2:基本的なスクレイピングとデータ書き込みコード
python
import gspread
from google.oauth2.service_account import Credentials
import requests
from bs4 import BeautifulSoup
# 認証設定
scope = [‘https://spreadsheets.google.com/feeds’,
‘https://www.googleapis.com/auth/drive’]
creds = Credentials.from_service_account_file(‘credentials.json’, scopes=scope)
client = gspread.authorize(creds)
# スクレイピング処理
url = ‘https://example.com/products’
response = requests.get(url)
soup = BeautifulSoup(response.content, ‘html.parser’)
# データ抽出
products = []
for item in soup.find_all(‘div’, class_=’product’):
name = item.find(‘h3’).text.strip()
price = item.find(‘span’, class_=’price’).text.strip()
products.append([name, price])
# スプレッドシートへの書き込み
sheet = client.open(‘商品データ’).sheet1
sheet.update(‘A1’, [[‘商品名’, ‘価格’]] + products)
このコードは基本的な流れを示していますが、実際の実装では、エラーハンドリング、レート制限、データの前処理などを追加する必要があります。
STEP3:大量データの効率的な処理方法
バッチ更新機能を使用することで、大量のデータを一度に書き込み、API呼び出し回数を削減できます。 gspreadのbatch_update()メソッドや、pandasデータフレームの活用により、処理効率が大幅に向上します。
python
import pandas as pd
# データフレームの作成
df = pd.DataFrame(products, columns=[‘商品名’, ‘価格’])
# データクレンジング
df[‘価格’] = df[‘価格’].str.replace(‘円’, ”).str.replace(‘,’, ”).astype(int)
# バッチ更新
sheet.update([df.columns.values.tolist()] + df.values.tolist())
定期実行には、cronジョブ(Linux/Mac)やタスクスケジューラ(Windows)、またはGitHub Actionsなどのクラウドサービスを活用できます。
どの方法を選ぶべき?用途別の最適な選択基準
データの更新頻度、技術レベル、取得するデータの複雑さによって、最適な手法は異なります。 簡単な表データの定期取得なら関数、カスタマイズが必要ならGAS、高度な処理が必要ならPythonという使い分けが基本です。
初心者の方は、まずIMPORTXML関数から始めて、徐々にGAS、そしてPythonへとステップアップすることをお勧めします。各手法のメリット・デメリットを理解した上で、プロジェクトの要件に最も適した方法を選択することが重要です。
小規模・簡単なデータ取得の場合
50件以下の静的データを週1回程度更新する場合は、IMPORTXML関数で十分対応可能です。 設定が簡単で、メンテナンスもほとんど必要ありません。株価、為替レート、天気情報などの定型的なデータ取得に最適です。
ただし、データ構造が頻繁に変更されるサイトや、取得エラーが発生した際の対処が必要な場合は、GASへの移行を検討すべきです。
中規模・定期的な自動化が必要な場合
毎日数百件のデータを自動収集し、加工・集計まで行う場合は、GASが最適な選択肢です。 トリガー機能による完全自動化、エラー通知の設定、他のGoogleサービスとの連携が可能で、運用コストも抑えられます。
GASの実行時間制限(6分/回)に注意し、必要に応じて処理を分割することで、安定した運用が可能になります。また、ライブラリを活用することで、複雑な処理も実装できます。
大規模・複雑な処理が必要な場合
数千件以上のデータ、動的サイト、画像処理、機械学習との連携が必要な場合は、Python一択です。 処理速度、拡張性、外部ライブラリの豊富さにおいて、他の手法を圧倒的に上回ります。
初期設定は複雑ですが、一度環境を構築すれば、あらゆるWebスクレイピングのニーズに対応できます。データサイエンスやビジネスインテリジェンスの分野では、必須のスキルとなっています。
今すぐ始められるスプレッドシートスクレイピングの第一歩
スプレッドシートを使ったWebスクレイピングは、技術レベルに応じて様々なアプローチが可能で、業務効率化に大きく貢献します。まずは簡単なIMPORTXML関数から始めて、必要に応じてGoogle Apps ScriptやPythonへとステップアップすることで、より高度なデータ収集の自動化が実現できます。重要なのは、取得したいデータの性質と更新頻度を明確にし、最適な手法を選択することです。
適切なWebデータ抽出の手法を身につけることで、手作業でのデータ収集から解放され、より価値の高い分析業務に集中できるようになるでしょう。
※ 掲載している情報は記事更新時点のものです。
※本サイトは、法律的またはその他のアドバイスの提供を目的としたものではありません。当社は本サイトの記載内容(テンプレートを含む)の正確性、妥当性の確保に努めておりますが、ご利用にあたっては、個別の事情を適宜専門家にご相談いただくなど、ご自身の判断でご利用ください。
関連記事
OFFSET関数の使い方をわかりやすく解説
OFFSET関数は、Excelにおいて非常に便利な機能を提供します。この関数を使うことで、指定した範囲からのオフセットを基に、動的にデータを取得することが可能です。使用方法はシンプルですが、プリミティブな範囲算出を超えた応用が期待できる点が…
詳しくみるスプレッドシートをダークモードにするには?PC・スマホ別の設定方法
GoogleスプレッドシートのWeb版にはダークモード設定がなく、PCではOS連動・ブラウザ機能・拡張機能で補います。iPhone/Androidのアプリはダークテーマに対応しています。 本記事では、PCとスマホそれぞれでスプレッドシートを…
詳しくみるDCOUNT関数の使い方:条件付きで数値の件数を集計する
DCOUNT関数は、データベース形式の表から指定した条件に一致するレコードの数値セルをカウントする関数です。売上データの件数集計、在庫数量の登録確認、成績データの有効件数カウント、品質検査の測定値集計など、数値データの件数を条件付きで数える…
詳しくみるスプレッドシートの変更履歴を確認・管理・復元するには?セル単位から削除方法まで
Googleスプレッドシートの変更履歴機能を使えば、誰がいつどのような編集を行ったのかを簡単に確認でき、必要に応じて過去のバージョンに戻すことも可能です。本記事では、スプレッドシートの編集履歴の基本的な確認手順から、セル単位での変更追跡、履…
詳しくみるPOWER関数完全ガイド – エクセルで累乗計算をマスターする方法
POWER関数は、指定した数値を任意の累乗に計算するエクセルの数学関数です。複利計算、面積・体積の計算、統計分析、科学技術計算など、幅広い分野で活用されています。本記事では、POWER関数の基本的な使い方から実務での応用例、他の関数との効果…
詳しくみるFREQUENCY関数でヒストグラム作成!以上・未満の範囲で頻度を自動集計
エクセルのFREQUENCY関数(読み方:フリークエンシー関数)は、データを範囲ごとに分類し、それぞれの区間に属する値の頻度分布を分析する関数です。 本記事では、FREQUENCY関数の基本的な使い方から、具体的な利用シーン、さらに他の関数…
詳しくみる