如何通过单次API调用获取Stack Overflow用户时间线全部数据?
Stack Overflow用户时间线全量数据获取方案
嘿,我来帮你搞定这个Stack Overflow用户时间线数据获取的问题!
为什么只能拿到500条数据?
Stack Overflow的/users/{ids}/timeline接口有个硬限制:单次调用最多只能返回500条结果,不管你把max_pages和page_size设得多大,这个上限都是平台规定的,没法直接通过参数突破。
解决方案:按时间范围分批请求
我们可以通过分段抓取不同时间范围的数据来获取全部内容,具体步骤和代码如下:
- 先调用一次接口获取最新的500条数据,同时记录这批数据里最早的时间戳
- 循环发起请求,每次把
todate设为上一批数据的最早时间戳(减1避免重复),逐步往前抓取更早的数据 - 直到某次请求返回空数据,说明已经获取完所有时间线内容
import pandas as pd from stackapi import StackAPI # 初始化API客户端,记得替换成你的密钥 SITE = StackAPI('stackoverflow', key="please_add_your_key_here") target_user_id = 5620 all_timeline_items = [] # 首次请求:获取最新的500条数据(page_size=100 + max_pages=5 刚好达到单批次上限) first_batch = SITE.fetch( 'users/{ids}/timeline', ids=[target_user_id], page_size=100, max_pages=5 ) all_timeline_items.extend(first_batch['items']) # 检查是否有数据,开始循环抓取更早的内容 if all_timeline_items: # 记录当前最早的时间戳 earliest_time = all_timeline_items[-1]['creation_date'] while True: # 请求比最早时间更早的数据,todate减1避免重复抓取最后一条 next_batch = SITE.fetch( 'users/{ids}/timeline', ids=[target_user_id], page_size=100, max_pages=5, todate=earliest_time - 1 ) if not next_batch['items']: break # 没有更多数据,退出循环 all_timeline_items.extend(next_batch['items']) # 更新最早时间戳,继续往前抓 earliest_time = next_batch['items'][-1]['creation_date'] # 转换为DataFrame方便处理 timeline_df = pd.DataFrame(all_timeline_items) print(f"成功获取到{len(timeline_df)}条用户时间线数据!")
额外注意事项
- 注意API调用频率:Stack Overflow免费密钥有请求次数限制,短时间内请求过多会被限流,建议适当添加请求间隔
- 如果用户时间线特别长,可能需要多次循环,但只要按这个逻辑走,就能抓完所有数据
内容的提问来源于stack exchange,提问作者Nathalie
相关产品推荐
相关产品推荐

