Twitter API中如何实现推文的渐进式爬取?
嘿,我来帮你把Twitter Search API的渐进式爬取逻辑讲清楚,这其实是个很常见的分页需求,咱们一步步来~
如何用Twitter Search API实现推文的渐进式爬取?
1. 分页获取下一批推文:靠max_id参数搞定
Twitter Search API单次最多返回100条内容,当相关推文超过100条时,就得靠分页参数来遍历剩余的内容。最常用的就是max_id,它的作用很简单:让API返回ID小于等于该值的推文(说白了就是比这条推文发布时间更早的内容)。
具体操作步骤:
- 首次请求不用加
max_id,API会返回当前最新的一批推文(最多100条) - 拿到返回结果后,从所有推文里找出最小的那个
id_str(一定要用字符串格式的ID,避免数字溢出问题) - 下一次请求时,在请求参数里加上
&max_id=最小ID-1(减1是为了避免重复获取上一页的最后一条推文)
给你扩展一下你提供的PHP代码示例:
// 初始请求(获取最新的100条#thanksgiving推文) $url = 'https://api.twitter.com/1.1/search/tweets.json'; $getfield = '?q=' . urlencode("#thanksgiving") . '&count=100&tweet_mode=extended&sort=recent'; // 这里别忘了加上你的API认证逻辑(比如Bearer Token或者OAuth) // 假设已经拿到了解析后的JSON结果$result $minTweetId = PHP_INT_MAX; foreach ($result['statuses'] as $tweet) { $currentId = (int)$tweet['id_str']; if ($currentId < $minTweetId) { $minTweetId = $currentId; } } // 构造下一页的请求参数 $nextGetfield = $getfield . '&max_id=' . ($minTweetId - 1); // 用这个新的$getfield发起请求,就能拿到下100条更早的推文了
另外,还有个更省心的方法:返回结果里的search_metadata.next_results字段已经帮你拼接好了下一页的完整参数(包含max_id),你直接把这个字符串拼到API URL后面就行,不用自己计算ID,比如:
if (isset($result['search_metadata']['next_results'])) { // 注意要补上tweet_mode=extended,因为next_results里不会包含这个参数 $nextUrl = $url . $result['search_metadata']['next_results'] . '&tweet_mode=extended'; // 发起请求获取下一页内容 }
2. 返回结果的时间相关性问题
没错!首次请求默认(或者指定sort=recent时)会返回最新的100条相关推文,结果是按发布时间降序排列的(最新的在前)。如果没指定sort参数,API会混合相关性和时间排序,可能会夹杂一些热度高但不是最新的推文,所以如果想严格按时间从新到旧爬取,建议加上&sort=recent参数。
一些额外注意事项
- 速率限制:Twitter API有请求次数限制,比如免费版的Search API每15分钟最多允许180次请求,爬取的时候要做好速率控制,别触发限流
- ID处理:推文ID是64位整数,在PHP等语言里直接用数字类型可能会溢出,所以一定要用
id_str字段来获取和处理ID - 终止条件:当返回的推文数量不足100条,或者
search_metadata.next_results不存在时,就说明已经没有更多内容可以爬取了
内容的提问来源于stack exchange,提问作者aandroidtest
相关产品推荐
相关产品推荐

