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
对象,该对象可以是 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, 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')
我正在尝试使用一个简单的抓取工具将我保存的 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
对象,该对象可以是 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, 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')