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

Dre*_*ght 1 python reddit praw

我正在使用PRAW查看大量的Reddit搜索结果(提交和注释),而我用来收集数据的方法经常会产生503错误:

prawcore.exceptions.ServerError: received 503 HTTP response
Run Code Online (Sandbox Code Playgroud)

据我了解,如果是速率限制问题,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)
Run Code Online (Sandbox Code Playgroud)

这是在循环中调用的.任何想法为什么生成503错误,以及如何防止它发生?

Tom*_*ota 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
Run Code Online (Sandbox Code Playgroud)

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