如何用Python的PRAW在Reddit全社区搜索多关键词并修复结果不全问题
问题原因与解决方法
你的代码只返回最后一个关键词结果的核心问题是:PRAW的search()方法不支持直接传入关键词列表。当你把列表传给它时,它会将列表转为字符串格式进行搜索,而非逐个匹配列表里的关键词,自然无法得到所有关键词的结果。
要实现全关键词搜索,你需要遍历关键词列表,对每个关键词单独执行搜索,同时注意去重(避免同一帖子被多个关键词匹配后重复存入)。
修改后的代码
import pandas as pd import praw # 初始化Reddit实例(需自行完成认证配置) reddit = praw.Reddit( client_id="你的客户端ID", client_secret="你的客户端密钥", user_agent="自定义用户代理" ) # 关键词列表 keyword_list = ['maritime heritage', 'shipwreck', 'shipwrecks', 'coastal archeaology', 'maritime archaeology', 'maritime ecologies', 'marine archeaology', 'marine heritage', 'cultural marine heritage', 'marine culutral haritage', 'maritime history'] # 目标社区:全社区 all_subs = reddit.subreddit("all") # 存储数据的列表与去重用集合 titles = [] scores = [] ids = [] seen_post_ids = set() # 记录已抓取的帖子ID,避免重复 # 遍历每个关键词单独搜索 for keyword in keyword_list: for submission in all_subs.search(keyword, limit=None): if submission.id not in seen_post_ids: seen_post_ids.add(submission.id) titles.append(submission.title) scores.append(submission.score) ids.append(submission.id) # 生成结果DataFrame df = pd.DataFrame({ 'Title': titles, 'Id': ids, 'Upvotes': scores }) print(df.shape) print(df.head(10))
关键修改点
- 新增
seen_post_ids集合:跟踪已抓取帖子ID,防止同一帖子因匹配多个关键词被重复添加。 - 外层循环遍历关键词列表:对每个关键词单独调用
search(),确保所有关键词的结果都被抓取。 - 优化DataFrame创建方式:直接用字典传入更简洁直观。
内容的提问来源于stack exchange,提问作者Hannah Cocks
相关产品推荐
相关产品推荐

