首页 > 解决方案 > 哪些 praw 命令需要网络请求?

问题描述

这段代码的每一行只发出一个请求,我对吗?

sm = reddit.submission(url="...")
sm.comment_sort = 'top'
sm.comments.replace_more(1)
comments = sm.comments.list()

我知道 Reddit api 在每 600 秒的时间段内提供 600 个请求。我需要这些信息才能更有效地使用 api。

标签: pythonredditpraw

解决方案


此代码段发出两个请求。首先,当您访问sm.comments第 3 行时,它会从 Reddit API 加载提交的评论。然后,在同一行,调用replace_more(1)将恰好替换一个MoreComments对象,这会发出一个额外的请求。

要了解某些 PRAW 代码发出了多少网络请求,请查看有关logging的文档中的部分。在脚本顶部从该页面添加此代码段:

import logging

handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
logger = logging.getLogger('prawcore')
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)

然后,当您运行脚本时,您将看到描述每个请求的调试输出。对于您的代码段,我的输出如下所示:

Fetching: GET https://oauth.reddit.com/comments/fgi5bd/
Data: None
Params: {'limit': 2048, 'sort': 'top', 'raw_json': 1}
Response: 200 (116926 bytes)
Fetching: POST https://oauth.reddit.com/api/morechildren/
Data: [('api_type', 'json'), ('children', 'fk5u680,fk5tgxt,<--snip-->,fk5u67w,fk5ug3f'), ('link_id', 't3_fgi5bd'), ('sort', 'top')]
Params: {'raw_json': 1}
Sleeping: 0.21 seconds prior to call
Response: 200 (32753 bytes)

以“Fetching”开头的每一行都是另一个网络请求,后面的行进一步描述了这个请求。


框架挑战

你说

我知道 Reddit api 在每 600 秒的时间段内提供 600 个请求。我需要这些信息才能更有效地使用 api。

虽然我无法确切知道您所说的“更有效地使用 api”是什么意思,但如果您担心会超出速率限制,则根本不必担心。PRAW 的主要功能之一是它为您处理速率限制,确保您在不违反速率限制的情况下尽可能频繁地发出请求。


推荐阅读