使用 PRAW 进行 Reddit 搜索时经常收到 503 错误
Frequently receiving 503 error when conducting Reddit search with PRAW
我正在使用 PRAW 查看大量 Reddit 搜索结果(包括提交和评论),而我用来收集数据的方法经常产生 503 错误:
prawcore.exceptions.ServerError: received 503 HTTP response
据我了解,如果是速率限制问题,PRAW 会抛出 praw.errors.RateLimitExceeded
错误。
产生错误的函数如下:
def search_subreddit(subreddit_name, last_post=None):
params = {'sort': 'new', 'time_filter': 'year',
'limit': 100, 'syntax':'cloudsearch'}
if last_post:
start_time = 0
end_time = int(last_post.created) + 1
query = 'timestamp:%s..%s' % (start_time, end_time)
else:
query = ''
return reddit.subreddit(subreddit_name).search(query, **params)
这是在循环中调用的。知道为什么会产生 503 错误,以及如何防止它发生吗?
为什么会生成它?
503 是为通知服务器暂时不可用而保留的 HTTP 协议代码。在几乎所有情况下,这意味着它在请求生成响应时由于过载而没有资源。
如何防止它发生?
因为这是服务器端问题,我在这里假设你不是 reddit 网络团队的一员,你不能直接做任何事情来解决这个问题。我将尝试在此处列出您可能的选择
- 在社交媒体上抱怨 reddit 服务器很烂(可能无效)
- 尝试联系 reddit 网络单位并告知他们这个问题(仍然无效,但从长远来看可能会有好处)
- 向 PRAW 建议功能 - 关键字
repeat_in_case_of_server_overload
和 repeat_in_case_of_server_overload_timeout
,当第一个设置为 True
(默认 False
)时会尝试重复请求一些可定制的多少时间。 (这会很有趣,但不太可能以这种形式被接受,而且需要一些时间来处理)
- 修改 PRAW 自己做上面描述的事情然后在 github 中添加 pull request。 (你会立即拥有它,但仍然可能不会被接受并且需要一些工作)
- 当 reddit 服务器不那么繁忙时,您可以尝试 运行 您的脚本(如果您手动 运行 并且偶尔只需要数据,那么老实说这可能有效)
- 添加简单的机制,尝试多次获取搜索结果直到成功(是的,这可能是推荐的一种)
类似于:
result = None
last_exception = None
timeout = 900 #seconds = 15 minutes
time_start = int(time.time())
while not result and int(time.time()) < time_start + timeout:
try:
result = reddit.subreddit(subreddit_name).search(query, **params)
except prawcore.exceptions.ServerError as e:
#wait for 30 seconds since sending more requests to overloaded server might not be helping
last_exception = e
time.sleep(30)
if not result:
raise last_exception
return result
此外,上面的代码更多的是伪代码,因为我没有以任何方式对其进行测试,它甚至可能不会逐字工作,但希望能清楚地传达这个想法。
如果您使用 Subreddit.submissions
,您可能会收到此错误,因为它在 PRAW 中已被弃用:https://github.com/praw-dev/praw/pull/916
如果上述解决方案给您 'time' 未定义错误
import time
from time import sleep
result = None
last_exception = None
timeout = 900 #seconds = 15 minutes
time_start = int(time.time())
while not result and int(time.time()) < time_start + timeout:
try:
result = reddit.subreddit(subreddit_name).search(query, **params)
except prawcore.exceptions.ServerError as e:
#wait for 30 seconds since sending more requests to overloaded server might not be helping
last_exception = e
time.sleep(30)
if not result:
raise last_exception
return result
我正在使用 PRAW 查看大量 Reddit 搜索结果(包括提交和评论),而我用来收集数据的方法经常产生 503 错误:
prawcore.exceptions.ServerError: received 503 HTTP response
据我了解,如果是速率限制问题,PRAW 会抛出 praw.errors.RateLimitExceeded
错误。
产生错误的函数如下:
def search_subreddit(subreddit_name, last_post=None):
params = {'sort': 'new', 'time_filter': 'year',
'limit': 100, 'syntax':'cloudsearch'}
if last_post:
start_time = 0
end_time = int(last_post.created) + 1
query = 'timestamp:%s..%s' % (start_time, end_time)
else:
query = ''
return reddit.subreddit(subreddit_name).search(query, **params)
这是在循环中调用的。知道为什么会产生 503 错误,以及如何防止它发生吗?
为什么会生成它?
503 是为通知服务器暂时不可用而保留的 HTTP 协议代码。在几乎所有情况下,这意味着它在请求生成响应时由于过载而没有资源。
如何防止它发生?
因为这是服务器端问题,我在这里假设你不是 reddit 网络团队的一员,你不能直接做任何事情来解决这个问题。我将尝试在此处列出您可能的选择
- 在社交媒体上抱怨 reddit 服务器很烂(可能无效)
- 尝试联系 reddit 网络单位并告知他们这个问题(仍然无效,但从长远来看可能会有好处)
- 向 PRAW 建议功能 - 关键字
repeat_in_case_of_server_overload
和repeat_in_case_of_server_overload_timeout
,当第一个设置为True
(默认False
)时会尝试重复请求一些可定制的多少时间。 (这会很有趣,但不太可能以这种形式被接受,而且需要一些时间来处理) - 修改 PRAW 自己做上面描述的事情然后在 github 中添加 pull request。 (你会立即拥有它,但仍然可能不会被接受并且需要一些工作)
- 当 reddit 服务器不那么繁忙时,您可以尝试 运行 您的脚本(如果您手动 运行 并且偶尔只需要数据,那么老实说这可能有效)
- 添加简单的机制,尝试多次获取搜索结果直到成功(是的,这可能是推荐的一种)
类似于:
result = None
last_exception = None
timeout = 900 #seconds = 15 minutes
time_start = int(time.time())
while not result and int(time.time()) < time_start + timeout:
try:
result = reddit.subreddit(subreddit_name).search(query, **params)
except prawcore.exceptions.ServerError as e:
#wait for 30 seconds since sending more requests to overloaded server might not be helping
last_exception = e
time.sleep(30)
if not result:
raise last_exception
return result
此外,上面的代码更多的是伪代码,因为我没有以任何方式对其进行测试,它甚至可能不会逐字工作,但希望能清楚地传达这个想法。
如果您使用 Subreddit.submissions
,您可能会收到此错误,因为它在 PRAW 中已被弃用:https://github.com/praw-dev/praw/pull/916
如果上述解决方案给您 'time' 未定义错误
import time
from time import sleep
result = None
last_exception = None
timeout = 900 #seconds = 15 minutes
time_start = int(time.time())
while not result and int(time.time()) < time_start + timeout:
try:
result = reddit.subreddit(subreddit_name).search(query, **params)
except prawcore.exceptions.ServerError as e:
#wait for 30 seconds since sending more requests to overloaded server might not be helping
last_exception = e
time.sleep(30)
if not result:
raise last_exception
return result