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

How to scrape a list of saved reddit posts to a txt file using praw in Python

我正在尝试使用一个简单的抓取工具将我保存的 Reddit posts 转储到一个 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 IDS 的列表,看起来像这样:

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),但不知道如何找到它。

提前致谢!

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

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

目前提交的两个答案思路都对,但是在PRAW的使用方式上出现了错误。他们忽略了您保存的项目既是评论又是帖子的事实。然后,他们都有一行

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

这通过使用预先存在的对象的 ID 创建 PRAW Submission 对象,该对象可以是 SubmissionComment 对象。如果它是 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')