如何检测pywikibot中的maxlag异常

时间:2016-08-16 17:04:37

标签: pywikibot

我正在开发一个Wikipedia机器人来分析编辑贡献。不幸的是,完成一次运行需要几个小时,在此期间,维基百科的数据库复制延迟 - 在运行期间的某个时刻 - 肯定会超过5秒(默认的maxlag值)。 API's maxlag parameter中的建议是检测滞后错误,暂停X秒并重试。

但我所做的只是阅读贡献:

usrpg = pywikibot.Page(site, 'User:' + username)
usr = pywikibot.User(usrpg)
for contrib in usr.contributions(total=max_per_user_contribs):
    # (analyzes contrib here)

如何检测错误并恢复?这是错误:

WARNING: API error maxlag: Waiting for 10.64.32.21: 7.1454429626465 seconds lagged
Traceback (most recent call last):
  File ".../bot/core/pwb.py", line 256, in <module>
    if not main():
  File ".../bot/core/pwb.py", line 250, in main
    run_python_file(filename, [filename] + args, argvu, file_package)
  File ".../bot/core/pwb.py", line 121, in run_python_file
    main_mod.__dict__)
  File "analyze_activity.py", line 230, in <module>
    attrs = usr.getprops()
  File ".../bot/core/pywikibot/page.py", line 2913, in getprops
    self._userprops = list(self.site.users([self.username, ]))[0]
  File ".../bot/core/pywikibot/data/api.py", line 2739, in __iter__
    self.data = self.request.submit()
  File ".../bot/core/pywikibot/data/api.py", line 2183, in submit
    raise APIError(**result['error'])
pywikibot.data.api.APIError: maxlag: Waiting for 10.64.32.21:
    7.1454 seconds lagged [help:See https://en.wikipedia.org/w/api.php for API usage]
<class 'pywikibot.data.api.APIError'>
CRITICAL: Closing network session.

我发现捕获该行代码中抛出的异常:

 raise APIError(**result['error'])

但是,重新启动用户的贡献似乎非常低效。有些用户有400,000次编辑,所以从一开始就重新运行是很多倒退。

我已经搜索过这样做的例子(检测到错误并重试)但我发现没什么用处。

1 个答案:

答案 0 :(得分:2)

将评论中的上一个会话转换为答案。

解决此问题的一种可能方法是尝试/捕获错误并重做导致错误的代码段。

但是,pywikibot已经为我们内部做了这个!如果您使用它生成的默认user-config.py,Pywikibot会默认尝试重试每次失败的API调用2次。我发现在我的情况下增加以下配置就可以了:

  • maxlag = 20
  • retry_wait = 20
  • max_retries = 8

根据Maxlag parameter的文档,maxlag是建议增加的参数,特别是如果您在短时间内进行了大量写操作。但是,retry_waitmax_retries配置是有用的,以防其他人写了很多(就我的情况而言:我的脚本只是从维基读取)。