Skip to main content
 首页 » 编程设计

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

2025年05月04日10bluestorm

我正在使用 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 协议(protocol)代码。在几乎所有情况下,这意味着它在请求生成响应时由于过载而没有资源。

如何预防?

因为这是服务器端问题,我在这里假设你不是 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 

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