如何不使用PRAW的submissions()函数获取Reddit子版块全部帖子?
获取Reddit子版块帖子的替代方案(无需PRAW submissions())
当然有办法解决这个问题!Reddit API更新后确实砍掉了submissions()的时间戳筛选功能,不过我们可以通过其他途径获取子版块的帖子——虽然要注意Reddit本身的API限制无法拿到真正意义上的全部历史帖子,但获取平台允许访问的内容还是没问题的。
下面是两种实用的方法:
方法1:使用PRAW的其他排序方法遍历
PRAW提供了多个子版块帖子的排序接口,比如热门(hot)、最新(new)、置顶(top)、上升(rising)等。我们可以遍历这些排序,收集帖子后去重,来覆盖尽可能多的内容。
示例代码:
import praw # 初始化PRAW客户端 reddit = praw.Reddit( client_id="你的客户端ID", client_secret="你的客户端密钥", user_agent="自定义用户代理(比如:my-post-scraper/1.0 by u/YourUsername)" ) target_subreddit = reddit.subreddit("目标子版块名称") collected_posts = [] # 遍历不同排序类型,确保覆盖更多帖子 for sort_method in ["hot", "new", "top", "rising"]: # limit=None会请求尽可能多的帖子(受Reddit API限制) for submission in getattr(target_subreddit, sort_method)(limit=None): collected_posts.append(submission) # 根据帖子ID去重,避免不同排序下的重复内容 unique_posts = list({post.id: post for post in collected_posts}.values()) print(f"最终获取到 {len(unique_posts)} 条唯一帖子")
注意:Reddit API对单请求和每日请求的数量有限制,同时不会返回太古老的帖子(通常是几个月内的内容,具体取决于子版块活跃度)。
方法2:直接调用Reddit REST API(无需PRAW)
如果你不想依赖PRAW,可以直接用HTTP请求调用Reddit的公开API端点,手动处理分页逻辑。
示例代码(用requests库):
import requests import time headers = {"User-Agent": "自定义用户代理(比如:my-reddit-scraper/1.0)"} subreddit_name = "目标子版块名称" all_posts = [] next_page_token = None while True: # 构造请求URL,每次请求最多100条帖子 request_url = f"https://www.reddit.com/r/{subreddit_name}/new.json?limit=100" if next_page_token: request_url += f"&after={next_page_token}" response = requests.get(request_url, headers=headers) response_data = response.json() current_posts = response_data["data"]["children"] if not current_posts: # 没有更多帖子,退出循环 break all_posts.extend(current_posts) # 获取下一页的标记 next_page_token = response_data["data"]["after"] # 加入延迟,避免触发Reddit的速率限制 time.sleep(2) print(f"总共获取到 {len(all_posts)} 条帖子")
这个方法和PRAW的原理一致,同样受限于Reddit的API内容限制。如果需要更久远的历史数据,你可以考虑第三方数据集(比如Pushshift),不过要注意这类服务的可用性和数据更新频率。
内容的提问来源于stack exchange,提问作者Torb




