如何使用Python中的抓取功能将保存的Reddit帖子列表刮到txt文件中

问题描述 投票:2回答:3

我正在尝试一个简单的抓取程序,将保存的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()

这给了我一个看起来像这样的帖子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),但不知道如何找到它。

提前感谢!

python web-scraping reddit praw
3个回答
1
投票

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

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

这将通过使用预先存在的对象的ID创建PRAW Submission对象,该对象可以是SubmissionSubmission对象。在它是Comment的情况下,新的Submission对象与从其创建的对象相同,因此是多余的。如果它是Submission,则该行为是错误的,因为您将注释ID视为提交ID。

尚不清楚您想对注释进行什么操作,因此我将通过两种方式进行处理。首先,如果您要忽略保存的注释(这与现有答案非常相似,但是添加了类型检查并删除了多余的行),请按照以下步骤操作:

Comment

这是在保存注释的地方做的方法:

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)

2
投票

而不是重新打开文件,只需在文件打开时写您想要的文件

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')

2
投票

通常,重新分配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=...)
© www.soinside.com 2019 - 2024. All rights reserved.