Pythonを使ったGoogleトレンド:興味とトレンドのトピックを収集する
Senior Web Scraping Engineer
TL;DR:
- Google Trendsの興味は、検索数ではなく正規化されたインデックスです。 各観察結果を解釈するために必要な地理情報と時間範囲を保持します。
- Trending Now RSSと歴史的な興味は異なる質問に答えます。 公開フィードは現在のトピックを提供しますが、時間にわたる興味の系列の代替にはなりません。
- Scrapelessは専用の
google_trendsツールを公開しています。 クエリとデータ型を選択する前に、インストールされたツールスキーマを発見してください。 - トラフィックバケットはテキストのままであるべきです。 閾値のようなラベルは、ダッシュボード内で正確なカウントになるべきではありません。
- 無料で始められます。 新しいScrapelessアカウントには無料のScraping Browserランタイムが含まれています — app.scrapeless.comでサインアップしてください。
イントロダクション: 答えるべきTrendsの質問を決定する
Google Trendsは相対的な検索興味や現在注目を集めているトピックについて教えてくれます。これらは異なるデータ製品です。キーワードの時間にわたる興味を比較するレポートは、たとえ両方が同じフレーズを含んでいても、今日のトレンドトピックのリストの代わりにはなりません。
Pythonコレクションワークフローはまず表面を選び、その設定を保持する必要があります。このガイドは、興味データのための専用のTrendsツールを接続し、現在のトピックのために別の公共RSSワークフローを運用します。互換性のない指標を1つの列に強制するのではなく、出力境界を明示的に保ちます。
あなたのアプリケーションがすでに構造化されたアクターワークフローを使用している場合、Trendsを独自のアクター/ツール契約として扱ってください。Google検索APIの検索結果とGoogle Trendsの興味は別のデータセットです。
Google Trendsは実際に何を測定していますか?
Google Trendsの時間にわたる興味の値は、選択された地理的範囲と期間内の相対的な検索興味を示します。この系列は0から100にスケールされており、低ボリュームの用語は、検索した人がいないことを示さずにゼロとして現れることがあります。
Google Trendsの正規化とサンプリングは、なぜあるポイントが選択された条件内の検索の割合に依存しているかを説明しています。100のピークはその系列内の相対的な最大値を示し、既知の検索数を示すわけではありません。
日付範囲を変更すると、比較の基準も変わります。1か月のリクエストからの値は、長いリクエストの同じ日と自動的に比較できるわけではありません。サンプリングデータと低ボリュームの抑制も、引き出せる結論を制限します。
| 表面 | 適した質問 | 結果に保持する項目 |
|---|---|---|
| 時間にわたる興味 | 相対的な興味はどのように変化しましたか? | クエリ、地理、日付、カテゴリ、タイムゾーン |
| サブリージョン別の興味 | 相対的な興味はどこに集中していますか? | 地理的範囲と正規化文脈 |
| 関連するクエリ/トピック | どの検索やトピックが関連していますか? | データタイプと返されたランキング/メトリックの意味 |
| Trending Now RSS | 現在トレンドのトピックは何ですか? | フィードの地理、公開テキスト、観察時間 |
専用のScrapeless Trendsツールを使用する理由は?
専用のgoogle_trendsツールは、通常の検索結果パラメータではなく、Trends特有のクエリパラメータを公開します。これはScrapeless MCP接続を通じて利用可能で、より広いScraping APIの表面に属します。
ローカルに発見されたスキーマには、q、data_type、date、geo、hl、tz、catが含まれています。data_typeの例は、interest_over_time、interest_by_subregion、related_queries、related_topicsです。フィールドをストレージにマップする前に、レポートに必要なタイプを選択してください。
管理されたツールは、Googleの指標の意味を変えることはありません。出力は依然として地理、サンプリングの文脈、欠損データとゼロ値の区別を必要とします。Scrapelessの料金を確認して、現在のプラン条件を確認してください。このチュートリアルには、コストや新鮮さのベンチマークはありません。
前提条件とパッケージ設定
Python 3.12、Node.js、MCP 2.2.0、Requests 2.34.2、scrapeless-mcp-server 0.6.3を使用してください。RSSパスは、RequestsとPythonのXML/CSVライブラリのみを必要とします。興味データのキャプチャには、ツールアクセスを持つ実際のSCRAPELESS_KEYも必要です。
認証されたTrendsコレクションは、その認証情報なしではライブ検証を待機しています。ローカルツールの発見と公共RSSパスは独立して実行されます。どちらも完了した認証興味系列のキャプチャとしては説明されていません。
使い捨てプロジェクトにピン留めされたクライアントとサーバーをインストールします:
bash
python -m pip install mcp==2.2.0 requests==2.34.2
pnpm add scrapeless-mcp-server@0.6.3
収集前に興味データ契約を発見する
ツールの発見は、クライアントにインストールされたMCPサーバーによって公開される正確なスキーマを提供します。ローカルスタートアップ値metadata-discovery-onlyは、スキーマの検査のみに使用でき、リモートキャプチャの呼び出しに使用してはなりません。
このスクリプトをtrends_mcp.pyとして保存します。その明白な発見値、または構成済みの実際のキーを使用してデフォルトモードを実行します。ブートストラップは非プロトコルコンソールロギングを抑制し、stdoutはstdioメッセージに利用できる状態に保たれます。Pythonクライアントは、MCP 2.2.0のinput_schemaおよびis_error属性を使用します。
python
import argparse
import asyncio
import json
import os
from pathlib import Path
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main(capture):
key = os.environ['SCRAPELESS_KEY']
server = StdioServerParameters(
command='node',
args=['--input-type=module', '-e',
'console.log = () => {}; await import(process.argv[1]);',
str(Path('node_modules/scrapeless-mcp-server/build/index.js').resolve())],
env={**os.environ, 'SCRAPELESS_KEY': key})
async with stdio_client(server) as streams:
async with ClientSession(*streams) as session:
await session.initialize()
listed = await session.list_tools()
tool = next(t for t in listed.tools if t.name == 'google_trends')
Path('trends-tool-schema.json').write_text(
json.dumps(tool.input_schema, indent=2))
print(json.dumps({'discovered_tools': len(listed.tools),
'selected_tool': tool.name}))
if capture:
if key == 'metadata-discovery-only':
raise ValueError('A real key is required for remote capture')
args = {'q': 'coffee', 'data_type': 'interest_over_time',
'date': 'today 12-m', 'geo': 'US',
'hl': 'en', 'tz': '0', 'cat': '0'}
result = await session.call_tool(tool.name, args)
Path('trends-result.json').write_text(json.dumps({
'request': args, 'result': result.model_dump(mode='json')
}, indent=2))
if result.is_error:
raise ValueError('Tool error; inspect saved result')
print('Raw result saved; inspect its actual fields before mapping a series.')
parser = argparse.ArgumentParser()
parser.add_argument('--capture', action='store_true')
asyncio.run(main(parser.parse_args().capture))
ローカルハンドシェイクは25のツールを発見し、google_trendsを選択しました。その数は、インストールされたサーバーを表し、永続的なプラットフォーム制限を示すものではありません。保存されたtrends-tool-schema.jsonは、サーバーパッケージが変更されたときに検査する証拠です。
実際のキーが構成されると、python trends_mcp.py --captureは、過去1年間のアメリカにおけるコーヒーの興味を時間経過で要求します。注:キャプチャーブランチには資格情報が必要で、認証されたライブ検証が保留中のままです。 スクリプトは、その内部フィールドに関して仮定を行う前に、MCP結果封筒を保持します。タイムラインキーを発明したり、時間系列を作り出すことはありません。
Scrapelessでスクレイピングを開始する
Scrapelessを使用してウェブスクレイピングと自動化ワークフローを強化しましょう!
今日サインアップして**$5の無料クレジット**を取得 — クレジットカード不要。Scrapeless Dashboardで今すぐ無料クレジットを請求しましょう。
公共RSSフィードから現在のトピックを収集する
Trending Now RSSは、ブラウザやScrapeless API資格情報なしで収集できる公共の現在のトピックフィードです。その公開タイムスタンプとトラフィックラベルは、フィードのトピック観測を説明し、履歴の正規化された興味を示すものではありません。
以下の完全なスクリプトは、1つのフィードリクエストを行い、最大5つのアイテムを保存します。元のXML、JSONレコードおよびCSVを観察ディレクトリに保存します。これは、独立して実行可能な公共データパスです。
python
import csv
import hashlib
import json
from datetime import datetime, timezone
from pathlib import Path
from xml.etree import ElementTree as ET
import requests
url = 'https://trends.google.com/trending/rss?geo=US'
response = requests.get(url, timeout=30)
response.raise_for_status()
root = ET.fromstring(response.content)
channel = root.find('channel')
if channel is None:
raise ValueError('Expected RSS channel, received another document')
observed = datetime.now(timezone.utc).strftime('%Y%m%dT%H%M%SZ')
folder = Path('trending-rss') / observed
folder.mkdir(parents=True, exist_ok=True)
(folder / 'source.xml').write_bytes(response.content)
ns = {'ht': 'https://trends.google.com/trending/rss'}
rows = []
for item in channel.findall('item')[:5]:
title = (item.findtext('title') or '').strip()
link = (item.findtext('link') or '').strip()
if not title or not link:
raise ValueError('RSS item missing title or link')
rows.append({'title': title, 'link': link,
'published': item.findtext('pubDate'),
'traffic_bucket': item.findtext('ht:approx_traffic', namespaces=ns),
'geo': 'US', 'observed_at': observed})
if not rows:
raise ValueError('No items; inspect source before treating this as valid empty data')
(folder / 'records.json').write_text(json.dumps(rows, ensure_ascii=False, indent=2))
with (folder / 'records.csv').open('w', newline='', encoding='utf-8') as out:
writer = csv.DictWriter(out, fieldnames=list(rows[0]))
writer.writeheader()
writer.writerows(rows)
print(json.dumps({'source': response.url, 'items_saved': len(rows),
'source_sha256': hashlib.sha256(response.content).hexdigest()}))
公共フィードの実行は、5つの実際のアイテムとそのソースハッシュを保存しました。トピックは変わるため、記事は名前を所定の普遍的な出力サンプルに固定しません。レコードフィールドはtitle、link、published、traffic_bucket、geoおよびobserved_atです。
ht名前空間は、フィードのオプションのトラフィックフィールドを識別します。その値は、閾値表記を含むテキストとして保持します。トラフィックラベルが欠落しているのは、フィールドが欠落していることであり、ゼロ検索の推定ではありません。CSVライターは、CSV交換形式によって説明される引用およびレコードルールに従うため、句読点を含むトピックタイトルがそのまま保持されます。
トレンドデータを保存するときのメトリックのアイデンティティを保持する
トレンドストレージテーブルは、コレクション表面とデータの両方を保持する必要があります。RSSトピックと興味系列ポイントには、別々のメトリック名と受け入れルールを使用してください。
興味系列の場合、元のリクエスト引数を生データと共に保持します。認証された出力が検査された後、ポイントタイプ、クエリラベル、および報告された期間をチェックするスキーマアダプターを追加します。HTTPまたはMCP交換が完了したからといって、欠落した系列を空の成功したチャートに変換しないでください。
RSSの場合、元のフィードバイト、フィードの地理情報、および観察ディレクトリを保持します。公開テキストはソース提供によるものであり、観察時間はクライアントがそれを収集したときです。これらは異なる時計です。ソースハッシュは、各エクスポートを派生したフィードに接続する実用的な使用方法で、履歴関係です。
ダッシュボードは、チャートの隣に選択した日付範囲を表示する必要があります。その範囲をポイントと共にエクスポートし、UIフィルターのみに保持しないでください。そうしないと、スプレッドシートの受信者は、正規化されたピークをデータが提供しなかったボリューム統計として解釈する可能性があります。
一般的な解釈ミス
成功したコレクションでも、メトリックが誤ってラベル付けされている場合には不正確な分析を生じる可能性があります。以下のチェックは、収集されたデータがレポートに変わるポイントで行うべきです。
| ミス | 正しい取り扱い |
|---|---|
| 興味100を100検索と扱う | フィールドを正規化された興味としてラベル付けする |
| 独立してスケーリングされた日付範囲を比較する | リクエストを整列させるか、異なる基準を開示する |
| RSSトラフィックバケツを正確なカウントとして扱う | 元の閾値テキストを保持する |
| 欠落した値をゼロにする | 欠落状態の意味論を保持し、ソースを検査する |
| 世界および国のリクエストを混合する | 明示的な地理情報でレコードをグループ化する |
| トレンド履歴の一般検索を呼び出す | 専用のトレンド契約を使用する |
結論: 質問をメトリックと共に保存する
Pythonを使用したGoogleトレンドは、収集パスが質問と一致する場合に最も有用です。歴史的な興味はトレンド特有の契約に属し、現在のトピック収集には簡単な公開RSSパスがあります。
証拠の取り扱いを確立するためにRSSエクスポートから始め、その後、アダプターを構築する前に最初の認証された興味の結果を確認します。地理、日付範囲、メトリックのアイデンティティはすべてのダウンストリームチャートに添付します。
AI駆動のデータパイプラインを構築する準備はできましたか?
私たちのコミュニティに参加して、無料プランを取得し、ウェブデータパイプラインを構築している開発者とつながりましょう: Discord · Telegram。
app.scrapeless.com にサインアップして、無料のスクレイピングブラウザランタイムを取得し、上記のパターンを自分の公開データワークフローに適応させてください。
FAQ
Q: Googleトレンドは正確な検索ボリュームを報告していますか?
いいえ。Googleトレンドの興味値は相対的な興味の正規化された測定値です。それだけでは正確な検索カウントに変換することはできません。
Q: PythonはAPIキーなしでTrending Nowを収集できますか?
はい。公開RSSの例は、Requestsと標準ライブラリのパーサーを使用して現在のトピックを収集します。歴史的な時系列の興味は取得しません。
Q: Google検索APIはトレンドツールと同じですか?
いいえ。検索結果の収集とGoogleトレンドの収集は異なる要求パラメーターと出力の意味を持ちます。google_trendsを使用して、ここで示すトレンド特有のワークフローを行ってください。
Q: 公開Googleトレンドデータの収集は合法ですか?
許容される範囲は、条件、アクセス条件、使用権、そして管轄によって異なります。意図された収集と再利用のためにそれらの制約をレビューしてください; 公開フィードは全てのアプリケーションに対する無制限の許可ではありません。
Q: RSSワークフローはプロキシやブラウザを必要としますか?
このRSSの例ではプロキシやブラウザは使用されていません。応答が期待されたRSS文書でない場合は、エクスポートを停止し、トピックデータとしてチャレンジページを受け入れるのではなく、キャプチャされた応答を確認してください。
Q: トレンド値は収集ごとに異なる可能性がありますか?
はい。サンプリング、クエリの解釈、地理、時間範囲の選択が系列に影響します。その選択を記録し、自動的に需要の変化として扱うのではなく、違いを調査できるようにしてください。
Q: このワークフローはAIエージェントなしで実行できますか?
はい。直接のPython MCPクライアントとRSSパーサーの両方は通常のスクリプトです。AIエージェントはオプションであり、欠落しているAPI資格情報を提供したり、メトリックの検証を置き換えたりすることはありません。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



