使用PRAW进行Reddit搜索时经常收到503错误

时间:2017-03-09 23:56:32

标签: python praw reddit

我正在使用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错误,以及如何防止它发生?

2 个答案:

答案 0 :(得分:5)

为什么要生成它?

503是保留用于通知服务器暂时不可用的HTTP协议代码。几乎在所有情况下,这意味着它在请求时由于过载而没有资源来生成响应。

如何防止它发生?

由于这是服务器端问题,我在此假设您不是reddit网络团队的一员,因此无法直接解决问题。我会尝试在此列出您可能的选项

  • 在社交媒体上抱怨reddit服务器很糟糕(可能无效)
  • 尝试联系reddit网络单元并告知他们该问题(仍然无效,但长期可能会有效)
  • 为PRAW建议功能 - 关键字repeat_in_case_of_server_overloadrepeat_in_case_of_server_overload_timeout,首先设置为True(默认False)会尝试重复请求某些可自定义的量时间。 (看起来很有意思,但不太可能以这种形式被接受,也需要一些时间来处理)
  • 修改PRAW以自己完成上述操作,然后在github中添加pull请求。 (你会得到它,但仍然可能不被接受,需要一些工作)
  • 当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

上面的代码更多是伪代码,因为我没有以任何方式测试它,它甚至可能不会逐字逐句地工作,但希望能够清楚地传达这个想法。

答案 1 :(得分:4)

如果您使用Subreddit.submissions,可能会收到此错误,因为它已在PRAW中弃用:https://github.com/praw-dev/praw/pull/916