我正在使用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错误,以及如何防止它发生?
答案 0 :(得分:5)
503是保留用于通知服务器暂时不可用的HTTP协议代码。几乎在所有情况下,这意味着它在请求时由于过载而没有资源来生成响应。
由于这是服务器端问题,我在此假设您不是reddit网络团队的一员,因此无法直接解决问题。我会尝试在此列出您可能的选项
repeat_in_case_of_server_overload
和repeat_in_case_of_server_overload_timeout
,首先设置为True
(默认False
)会尝试重复请求某些可自定义的量时间。 (看起来很有意思,但不太可能以这种形式被接受,也需要一些时间来处理)类似的东西:
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
上面的代码更多是伪代码,因为我没有以任何方式测试它,它甚至可能不会逐字逐句地工作,但希望能够清楚地传达这个想法。
答案 1 :(得分:4)
如果您使用Subreddit.submissions
,可能会收到此错误,因为它已在PRAW中弃用:https://github.com/praw-dev/praw/pull/916