PRAW Reddit爬虫优化:提速、新增订阅数列及按主题获取子版块方法
代码优化方案
你原来的代码运行慢的核心原因是双层循环为每个子版块单独发起拉帖请求,还多次重复请求子版块的订阅数属性,大量冗余API请求严重拖慢了速度。你可以保留原先批量拉帖的高效逻辑,仅补充订阅数缓存逻辑即可,无需改用双层循环,优化后代码如下:
import pandas as pd import datetime posts = [] sub_names = list(set(['Futurology', 'wallstreetbets', 'DataIsBeautiful','RenewableEnergy', 'Bitcoin', 'Android', 'programming', 'gaming','tech', 'google','hardware', 'oculus', 'software', 'startups', 'linus', 'microsoft', 'AskTechnology', 'realtech', 'homeautomation', 'HomeKit','singularity', 'technews','Entrepreneur', 'investing', 'BusinessHub', 'CareerSuccess', 'growmybusiness','venturecapital', 'ladybusiness', 'productivity', 'NFT', 'CryptoCurrency'])) # 拼接多子版块合并请求标识 subs_str = '+'.join(sub_names) multi_sub = reddit.subreddit(subs_str) targeted_date = datetime.datetime.strptime('01-09-19 12:00:00', '%d-%m-%y %H:%M:%S') # 提前缓存所有子版块订阅数,仅发起一轮请求 subscriber_cache = {} for sub_name in sub_names: sub_obj = reddit.subreddit(sub_name) subscriber_cache[sub_name.lower()] = sub_obj.subscribers # 沿用原高效批量拉帖逻辑 for submission in multi_sub.hot(limit=500): date = datetime.datetime.fromtimestamp(submission.created) sub_name_lower = submission.subreddit.display_name.lower() sub_count = subscriber_cache[sub_name_lower] # 保留原过滤规则 if date >= targeted_date and sub_count >= 35000: posts.append([ date, submission.subreddit, sub_count, submission.title, submission.selftext ]) df = pd.DataFrame(posts, columns = ['date', 'subreddit','subscribers', 'title', 'text']) df
核心优化点
- 保留原多子版块合并拉帖逻辑,仅发起1次批量拉帖请求,替代原逐个子版块单独请求的模式
- 提前拉取所有子版块的订阅数缓存到本地字典,后续过滤、写入数据时直接读取本地缓存,避免重复发起API请求
- 整体API请求量从原先的(子版块数量 * limit + 2 * 子版块数量)降至 子版块数量 + 1,运行耗时和你之前的快速版本基本持平,仅多出数秒的订阅数缓存时间
批量获取指定主题子版块方案
你可以直接调用PRAW自带的分类查询接口获取对应主题的子版块:
调用reddit.subreddits.search_by_topic('technology')即可直接获取官方归类为科技类的所有子版块列表,返回结果自带订阅数等属性,可以直接过滤符合订阅数门槛的版块,无需手动爬取列表页面。
如果需要更自定义的分类列表,也可以直接一次性拉取目标列表页的文本,用正则匹配提取所有子版块名称,无需手动逐个复制。
内容的提问来源于stack exchange,提问作者Zion
相关产品推荐
相关产品推荐

