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

2024-04-25 13:27:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图用一个简单的刮刀将我保存的Reddit帖子转储到一个txt文件中,并努力让脚本执行我希望它执行的操作

这里有一些背景。下面的脚本将我保存的所有post 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()

这为我提供了一个post 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),但不知道如何找到它

提前谢谢


Tags: 文件importtxt脚本idsubmissionsysitem
3条回答

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

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

这将使用预先存在的对象(即SubmissionComment对象)的ID创建一个PRAW^{}对象。在它是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, reddit.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, reddit.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

相关问题 更多 >