如何抓取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
相关产品推荐
相关产品推荐

