You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何抓取Reddit子版块2020年帖子?代码及时间格式疑问

解决Reddit SuicideWatch子版块2020年帖子抓取及日期格式转换问题

一、突破帖子抓取数量限制(获取数百条数据)

当前代码使用subreddit.top(time_filter="all")仅能获取最多100条热门帖子,筛选2020年后仅剩79条,无法满足数据集需求。要获取更多2020年的帖子,建议结合Pushshift API(专门用于Reddit历史数据检索,无PRAW的100条返回限制),先批量获取2020年的帖子ID,再用PRAW拉取详细信息。

修改后的代码示例:

import praw
import pandas as pd
import requests
import datetime

# 初始化PRAW(需替换为你的认证信息)
reddit_read_only = praw.Reddit(
    client_id="YOUR_CLIENT_ID",
    client_secret="YOUR_CLIENT_SECRET",
    user_agent="YOUR_USER_AGENT"
)

# 定义2020年时间范围(Unix时间戳,秒级)
start_2020 = datetime.datetime(2020, 1, 1).timestamp()
end_2020 = datetime.datetime(2021, 1, 1).timestamp()

posts_dict = {
    "Title": [], "Post Text": [],
    "ID": [], "Score": [], "Upvote Ratio": [],
    "Total Comments": [], "Created On": [], "Post URL": [],
    "Original Content": []
}

# 用Pushshift API批量获取2020年SuicideWatch帖子ID
def get_pushshift_posts(subreddit, start, end):
    url = f"https://api.pushshift.io/reddit/submission/search/?subreddit={subreddit}&after={int(start)}&before={int(end)}&size=1000"
    response = requests.get(url)
    return response.json()["data"]

# 循环拉取数据(Pushshift每次最多返回1000条)
after = start_2020
while after < end_2020:
    posts_data = get_pushshift_posts("SuicideWatch", after, end_2020)
    if not posts_data:
        break
    # 更新下一次拉取的起始时间
    after = posts_data[-1]["created_utc"] + 1
    
    # 用PRAW获取每条帖子的详细信息
    for post_data in posts_data:
        post_id = post_data["id"]
        try:
            post = reddit_read_only.submission(id=post_id)
            posts_dict["Title"].append(post.title)
            posts_dict["Post Text"].append(post.selftext)
            posts_dict["ID"].append(post.id)
            posts_dict["Score"].append(post.score)
            posts_dict["Upvote Ratio"].append(post.upvote_ratio)
            posts_dict["Total Comments"].append(post.num_comments)
            posts_dict["Created On"].append(post.created_utc)
            posts_dict["Post URL"].append(post.url)
            posts_dict["Original Content"].append(post.is_original_content)
        except Exception as e:
            print(f"获取帖子{post_id}失败: {e}")
            continue

# 转为DataFrame
all_posts = pd.DataFrame(posts_dict)

关键说明:

  • Pushshift API支持单次拉取1000条数据,通过循环更新起始时间可覆盖2020年所有符合条件的帖子
  • 加入异常处理避免因帖子被删除、API限制等问题导致程序中断

二、修正日期格式转换代码

你当前的日期转换代码存在错误:post.created_utc是秒级Unix时间戳,无需乘以1000000000(该操作会将秒级转成纳秒级,导致日期严重错误)。正确的转换方式是直接指定unit='s'参数:

# 正确将浮点型时间戳转为日期格式
all_posts["Created On"] = pd.to_datetime(all_posts["Created On"], unit='s')

如果需要转为特定字符串格式(如YYYY-MM-DD HH:MM:SS),可追加dt.strftime:

all_posts["Created On"] = pd.to_datetime(all_posts["Created On"], unit='s').dt.strftime('%Y-%m-%d %H:%M:%S')

内容的提问来源于stack exchange,提问作者user21126867

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:47:53