我正在尝试一个简单的抓取程序,将保存的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)
,但不知道如何找到它。
提前感谢!
到目前为止提交的两个答案都具有正确的想法,但是在使用PRAW时却犯了一个错误。他们忽略了您保存的项目既是评论又是帖子的事实。然后,它们都有一行,如
submission = reddit.submission(id=item.id)
这将通过使用预先存在的对象的ID创建PRAW Submission
对象,该对象可以是Submission
或Submission
对象。在它是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)
而不是重新打开文件,只需在文件打开时写您想要的文件
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=...)