You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过pytrends Python包获取日频Google Trends搜索热度数据?

获取pytrends的日度搜索热度数据

嘿,我之前也踩过这个坑!其实pytrends本身没有专门设置数据频率的参数——这不是包的限制,而是Google Trends本身的规则在起作用:它会根据你指定的时间范围自动调整数据粒度:

  • 时间范围≤7天:返回小时级数据
  • 7天<时间范围≤90天:返回日度数据
  • 时间范围>90天:自动降级为周度(时间再长会变成月度)

你代码里用的timeframe='today 5-y'是5年的跨度,所以自然只能拿到周度数据啦。下面给你两种解决方案:

1. 获取短时间段的日度数据

如果只需要某个90天以内的日度数据,直接修改timeframe为具体的日期区间即可:

import pytrends
from pytrends.request import TrendReq
import pandas as pd

# 初始化请求对象
pytrends = TrendReq(hl='en-US', tz=360)

# 设置90天内的时间范围,格式为"起始日期 结束日期"
pytrends.build_payload(
    kw_list=["sp500", "dogs"],
    cat=0,
    timeframe='2023-10-01 2024-01-01',  # 约90天
    geo='',
    gprop=''
)

# 获取日度数据
daily_df = pytrends.interest_over_time()
# 查看前几行,确认粒度是日度
print(daily_df.head())

2. 获取超过90天的日度数据

如果需要更长时间的日度数据,得把时间范围拆分成多个90天的区间,逐个获取后再合并。这里给你一个示例代码:

import pytrends
from pytrends.request import TrendReq
import pandas as pd
import time

# 初始化请求对象
pytrends = TrendReq(hl='en-US', tz=360)

# 定义总时间范围
start_date = pd.to_datetime('2019-01-01')
end_date = pd.to_datetime('2024-01-01')
# 每个子区间的长度(90天)
interval = pd.Timedelta(days=90)

all_daily_data = []
current_start = start_date

while current_start < end_date:
    current_end = min(current_start + interval, end_date)
    # 格式化为Google Trends要求的时间字符串
    timeframe_str = f"{current_start.strftime('%Y-%m-%d')} {current_end.strftime('%Y-%m-%d')}"
    
    # 请求数据
    pytrends.build_payload(
        kw_list=["sp500", "dogs"],
        cat=0,
        timeframe=timeframe_str,
        geo='',
        gprop=''
    )
    temp_df = pytrends.interest_over_time()
    
    # 处理数据:移除isPartial列(标记数据是否完整)
    if not temp_df.empty:
        temp_df = temp_df.drop(columns=['isPartial'])
        all_daily_data.append(temp_df)
    
    # 加个小延迟,避免触发Google的反爬限制
    time.sleep(2)
    current_start = current_end

# 合并所有子区间的数据
full_daily_df = pd.concat(all_daily_data)
# 去重(如果有重叠的日期)
full_daily_df = full_daily_df[~full_daily_df.index.duplicated(keep='last')]

print("合并后的日度数据:")
print(full_daily_df.head())
print(full_daily_df.tail())

注意事项

  • Google Trends的热度是相对值,不同时间段的数值可能存在微小差异,但长期趋势是一致的,直接拼接即可。
  • 不要频繁连续请求,建议加time.sleep()延迟,避免被Google临时限制访问。

内容的提问来源于stack exchange,提问作者Merv Merzoug

火山引擎 最新活动