如何在 Python 中使用 praw 将保存的 reddit 帖子列表抓取到 txt 文件



我正在尝试一个简单的抓取工具将我保存的Reddit帖子转储到txt文件中,并努力让脚本做我希望它做的事情。

这里有一些背景。下面的脚本将我保存的所有帖子 ID 转储到一个文本文件中,每个 ID 都在自己的行中。

import praw
import os
import sys
reddit = praw.Reddit(client_id='MY_CLIENT_id',
client_secret='TOP_SECRET',
user_agent='AGENT_HERE',
username='USERNAME',
password='PASSWORD')
#open text file
sys.stdout = open('test.txt', 'w')
# get user saved item ids
for item in reddit.user.me().saved(limit=None):
print(item.id)
# print to file
sys.stdout.close()

这给了我一个帖子 ID 列表,看起来像这样:

lkj34f
ou456d
ho34oo
5j0vr4

然后,我可以使用以下 ID 来获取我想要的实际内容

submission = reddit.submission(id="dg23y6")
print(submission.title)
print(submission.url)

我的第一个问题是 - 有没有办法打开输出文件,读取那里的每一行并将其作为提交变量的 id 传递?

我确信有一种更简单的方法可以做到这一点,当然,我已经看到像这样的几个现有脚本将所有内容转储到一个格式良好的 HTML 文件中,但我还没有完全做到这一点,所以试图使用我有点有限的技能来解决这个挑战。我认为最明显的解决方案是使用print(actual.command.I.am.missing)代替print(item.id),但不知道如何找到它。

提前感谢!

到目前为止提交的两个答案都有正确的想法,但在如何使用PRAW方面犯了一个错误。他们忽略了您保存的项目既是评论又是帖子的事实。然后,他们都有一条线,比如

submission = reddit.submission(id=item.id)

这将使用预先存在的对象的 ID 创建 PRAWSubmission对象,该对象可以是Submission对象,也可以是Comment对象。如果是Submission,则新的Submission对象与创建它的对象相同,因此它是多余的。如果是Comment,则行为不正确,因为您将注释 ID 视为提交 ID。

目前还不清楚你想用评论发生什么,所以我会用两种方式来做。首先,如果您想忽略保存的注释(这很像现有的答案,但添加了类型检查并删除了多余的行(,以下是操作方法(:

import praw
import os
import sys
reddit = praw.Reddit(client_id='MY_CLIENT_id',
client_secret='TOP_SECRET',
user_agent='AGENT_HERE',
username='USERNAME',
password='PASSWORD')
with open('test.txt', 'w') as f:
for item in reddit.user.me().saved(limit=None):
if isinstance(item, praw.models.Submission):
f.write(item.id + 'n')
f.write(item.title + 'n')
if item.is_self:
f.write(item.selftext + 'n')
else: # link post
f.write(item.url)

以下是保存注释的方法:

import praw
import os
import sys
reddit = praw.Reddit(client_id='MY_CLIENT_id',
client_secret='TOP_SECRET',
user_agent='AGENT_HERE',
username='USERNAME',
password='PASSWORD')
with open('test.txt', 'w') as f:
for item in reddit.user.me().saved(limit=None):
if isinstance(item, praw.models.Submission):
f.write(item.id + 'n')
f.write(item.title + 'n')
if item.is_self:
f.write(item.selftext + 'n')
else: # link post
f.write(item.url)
else: # comment
f.write(item.id + 'n')
f.write(item.body + 'n')

与其重新打开文件,只需在文件打开时写入您想要的内容即可

import praw
import os
import sys
reddit = praw.Reddit(client_id='MY_CLIENT_id',
client_secret='TOP_SECRET',
user_agent='AGENT_HERE',
username='USERNAME',
password='PASSWORD')
out_filename = 'test.txt'
with open(out_filename, 'w') as out_file:
for item in reddit.user.me().saved(limit=None):
out_file.write(item.id + 'n')
submission = reddit.submission(id=item.id)
out_file.write(submission.title + 'n')
out_file.write(submission.url + 'n')
# or combine title and url on same line like this
# out_file.write(submission.title + ': ' + submission.url + 'n') 

一般来说,重新分配sys.stdout不是好的形式。您可以改用print(..., file=...)

我想你可能正在寻找类似的东西

import praw
import os
import sys
reddit = praw.Reddit(...)
with open("test.txt", "w") as f:
for item in reddit.user.me().saved(limit=None):
print(item.id)  # printed to the console
item = reddit.submission(id=item.id)
print(item.title, file=f)  # written to the file
print(item.url, file=f)  # written to the file
print('----', file=f)  # A separator, written to the file

最新更新