如何通过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




