我正在开发一个有两个类的网络抓取工具。一个获取资料,另一个类处理它。第一类的最终结果是一个元素串列,例如results = [1, 2, 3, 4, 5, ...]
. 问题是有时,由于服务器端错误,串列可能为空。我怎样才能回圈通过这个来重新启动行程,直到串列不为空?
我有点像这样解决了它。但我不确定这是否有效或良好的做法。
class DataScrapper:
def __init__(self):
...
def getData(self):
self.results = []
while not self.results:
...
return self.results
这是解决问题的pythonic方法吗?还有其他更有效的方法吗?非常感谢你。
uj5u.com热心网友回复:
在大多数情况下,您的习语很简单而且很好。
但是,您必须记住两件事:
- 您没有限制重试次数。如果服务器长时间宕机,你的脚本就会卡住。
- 即使在停机期间,您也会继续生成请求。这可能会导致较大的客户端和服务器负载。我强烈建议使用指数退避策略。
在 google 中快速搜索找到了backoff库,它允许您同时执行以下操作:
@backoff.on_predicate(backoff.expo, lambda x: x == [], max_tries=10)
def getData(self):
self.results = []
...
return self.results
它检查回传值,如果它是一个空串列,则再次运行该函式并增加延迟,直到达到 10 次尝试。
0 评论