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

如何不使用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

火山引擎 最新活动