返回博客

使用Python的Google趋势:收集兴趣和热门话题

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

30-Sep-2026

TL;DR:

  • Google Trends 的兴趣是一个标准化的指数,而不是搜索计数。 保持解释每个观察所需的地理和时间范围。
  • 当前趋势 RSS 和历史兴趣回答不同的问题。 公众源提供当前主题;它并不替代时间序列的数据。
  • Scrapeless 暴露了一个专用的 google_trends 工具。 在选择其查询和数据类型之前,了解已安装工具的架构。
  • 流量桶应保持为文本。 阈值等标签不能在仪表板中变成确切的计数。
  • 免费开始。 新的 Scrapeless 账户包括免费的爬虫浏览器运行时 — 在 app.scrapeless.com 注册。

Google Trends 可以告诉您相对搜索兴趣和当前吸引注意的主题。这些是不同的数据产品。比较一个关键字随时间变化的兴趣的报告不能替代今天的趋势主题列表,即使两者都包含相同的短语。

Python 集合工作流应先选择表面,然后保留其设置。本指南连接了一个专门的趋势工具用于兴趣数据,并运行一个独立的公共 RSS 工作流以获取当前主题。它保持输出边界可见,而不是强迫不兼容的指标合并到一个列中。

如果您的应用程序已经使用了 结构化行动者工作流,请将 Trends 当作其自身的行动者/工具合同。Google Search API 的搜索结果和 Google Trends 的兴趣是独立的数据集。

Google Trends 随时间变化的兴趣值描述了在选定地理区域和时间段内的相对搜索兴趣。该系列的规模从 0 到 100,低量词可能以零的形式出现,而并不表示没有人搜索它们。

Google Trends 的标准化和采样 解释了为什么一个点取决于在所选条件下的搜索份额。高峰 100 确定该系列中的相对最大值,而不是已知的搜索数量。

更改日期范围会改变比较基础。一个一个月请求的值并不自动可以与更长请求中的同一日期进行比较。采样数据和低量抑制也限制了您可以得出的结论。

表面 适用问题 结果中保留
随时间变化的兴趣 相对兴趣是如何变化的? 查询、地理、日期、类别和时区
按子区域的兴趣 相对兴趣集中在哪里? 地理范围和标准化上下文
相关查询/主题 哪些搜索或主题相关联? 数据类型和返回的排名/指标意义
当前趋势 RSS 现在哪些主题正在流行? 源地理、出版文本和观察时间

专用的 google_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 Copy
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 Copy
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请求过去一年在美国对咖啡的兴趣随时间变化。注意:捕获分支需要凭证,仍然需要经过身份验证的实时验证。 在做出对其内部字段的假设之前,脚本保留了MCP结果信封。它不会发明时间线密钥或伪造时间序列。

使用Scrapeless开始抓取

使用Scrapeless增强您的网页抓取和自动化工作流程!
今天注册并获得5美元的免费信用 — 无需信用卡。

现在在Scrapeless Dashboard索取您的免费信用。

从公共RSS源收集当前主题

Trending Now RSS是一个可以在没有浏览器或Scrapeless API凭证的情况下收集的公共当前主题源。其发布时间戳和流量标签描述该源的主题观察,而不是历史标准化兴趣。

以下完整脚本发出一个源请求,并至多存储五个项目。它将原始XML、JSON记录和CSV保存在观察目录中。这是可以独立执行的公共数据路径。

python Copy
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()}))

公共源运行保存了五个实际项目及其源哈希。主题是会变化的,因此文章并不将名称固定为某个假定的通用输出样本。记录字段是title、link、published、traffic_bucket、geo和observed_at。

ht命名空间标识源的可选流量字段。保持其作为返回文本的值,包括任何阈值标记。缺失的流量标签是缺失字段,而不是零搜索估算。CSV写入程序遵循CSV交换格式描述的引号和记录规则,因此包含标点符号的主题标题保持不变。

在存储趋势数据时保持度量身份

趋势存储表应该保留集合表面以及数据。为RSS主题和兴趣系列点提供单独的度量名称和单独的接受规则。

对于兴趣系列,保持完整的请求参数与原始结果。经过身份验证的输出检查完成后,添加一个模式适配器,以检查点类型、查询标签和报告周期。不要仅仅因为HTTP或MCP交换完成而将缺失系列转换为一个空的成功图表。

对于RSS,保留原始源字节、源地理和观察目录。发布文本是源提供的;观察时间是您的客户端收集它的时间。这是不同的时钟。源哈希将每个导出与其派生的源连接,这是来源关系的一个实际应用。

仪表板应该在图表旁边显示所选的日期范围。与点一起导出该范围,而不是仅仅保留在UI过滤器中。否则,电子表格接收者可能会将标准化峰值解读为数据从未提供的容量统计。

常见的解释错误

即使度量标签错误,成功的收集也可能产生不正确的分析。以下检查应在收集到的数据转变为报告时进行。

错误 正确处理
将兴趣100视为100次搜索 将字段标记为标准化兴趣
比较独立缩放的日期范围 保持请求一致或公开不同的基础
将RSS流量桶视为确切计数 保留原始阈值文本
将缺失值转为零 保留缺失状态的语义并检查源
混合全球和国家请求 按明确定义的地理分组记录
将一般搜索称为趋势历史 使用专门的趋势合同

结论:存储问题及指标

使用 Python 获取 Google Trends 在收集路径与所询问的问题相匹配时最为有用。历史兴趣属于特定的 Trends 合同;当前主题的收集有一个简单的公共 RSS 路径。

从 RSS 导出开始以建立证据处理,然后在构建适配器之前检查第一个经过身份验证的兴趣结果。保持地理位置、日期范围和指标身份附加到每个下游图表。


准备建立您的 AI 驱动数据管道吗?

加入我们的社区以申请免费计划,并与正在构建网络数据管道的开发人员联系:Discord · Telegram。

在 app.scrapeless.com 注册以获得免费的 Scraping Browser 运行时,并将上述模式调整为您自己的公共数据工作流。


常见问题

问:Google Trends 是否报告精确的搜索量?

不。Google Trends 的兴趣值是相对兴趣的标准化度量。它们无法仅通过索引转换为精确的搜索计数。

问:Python 是否可以在没有 API 密钥的情况下收集当前趋势?

可以。公共 RSS 示例使用 Requests 和标准库解析器收集当前主题。它不会检索历史兴趣随时间变化的系列。

问:Google 搜索 API 和 Trends 工具是一样的吗?

不一样。搜索结果收集和 Google Trends 收集有不同的请求参数和输出含义。对于此处显示的 Trends 特定工作流,请使用 google_trends。

问:收集公共 Google Trends 数据是否合法?

可接受的范围取决于条款、访问条件、使用权和管辖权。请查看这些约束条件以确定预期的收集和再利用;公共源并不意味着对所有应用程序都没有限制的许可。

问:RSS 工作流是否需要代理或浏览器?

此 RSS 示例没有使用代理或浏览器。如果响应不是预期的 RSS 文档,请停止导出,并检查捕获的响应,而不是将挑战页面接受为主题数据。

问:不同收集之间的趋势值会有所不同吗?

是的。采样、查询解释、地理位置和时间范围选择会影响系列。记录这些选择,以便调查差异,而不是自动将其视为需求变化。

问:此工作流是否可以在没有 AI 代理的情况下运行?

可以。直接的 Python MCP 客户端和 RSS 解析器都是普通脚本。AI 代理是可选的;它不提供缺失的 API 凭证或替代指标验证。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录