編集貢献を分析するWikipediaボットを開発中です。残念ながら、1回の実行に時間がかかっており、その間に実行中のある時点でWikipediaのデータベース複製の遅延—が発生します。—は、5秒(デフォルトの最大遅延値)を超えてください。 API's maxlag parameterの推奨事項は、遅延エラーを検出し、X秒間停止して再試行することです。pywikibotのmaxlag例外を検出する方法
しかし、私がやっているすべてはで貢献を読んで:
usrpg = pywikibot.Page(site, 'User:' + username)
usr = pywikibot.User(usrpg)
for contrib in usr.contributions(total=max_per_user_contribs):
# (analyzes contrib here)
エラーを検出し、それを再開するためにどのように?
raise APIError(**result['error'])
しかし、その後、ユーザーのための貢献を再起動すると恐ろしく非効率です:
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.
そのコード行でスローされた例外をキャッチするために私に発生します。これは誤りです。何人かのユーザーには400,000件の編集があるので、最初から再実行することは多くの逆行です。
私はこれを行って(エラーを検出して再試行して)グーグルで探そうとしましたが、役に立たないものは何も見つかりませんでした。
トレースバックのエラーは、コードにその行がないときに( '' attrs = usr.getprops() '')、その行がありません(不一致と思われる)。例外は 'usr.contributions()'のループの内側かループが実行される前にスローされますか? – AbdealiJK
@AJK:* contributions *ループの内部にあるようです。 – wallyk
その場合、そのコードを捕まえて再試行しても問題ないでしょうか?貢献リスト全体を再度引っ張る必要はないので、私はスクリプトで使用しているhttps://pypi.python.org/pypi/retryを提案しています – AbdealiJK