diff --git a/visitors.py b/visitors.py index c55e7419e..6808b5888 100644 --- a/visitors.py +++ b/visitors.py @@ -1,6 +1,7 @@ import csv import io -import urllib +import logging +import urllib.parse import zipfile from requests import Session @@ -10,12 +11,21 @@ def get_number_of_visitors(language: str, requests: Session) -> int: params = urllib.parse.urlencode( {'filters': f'[["contains","event:page",["/{language}/"]]]', 'period': 'all'} ) - r = requests.get( - f'https://plausible.io/docs.python.org/export?{params}', timeout=20 - ) - with ( - zipfile.ZipFile(io.BytesIO(r.content), 'r') as z, - z.open('visitors.csv') as csv_file, - ): - csv_reader = csv.DictReader(io.TextIOWrapper(csv_file)) - return sum(int(row['visitors']) for row in csv_reader) + for _ in range(2): + r = requests.get( + f'https://plausible.io/docs.python.org/export?{params}', timeout=40 + ) + try: + with ( + zipfile.ZipFile(io.BytesIO(r.content), 'r') as z, + z.open('visitors.csv') as csv_file, + ): + csv_reader = csv.DictReader(io.TextIOWrapper(csv_file)) + return sum(int(row['visitors']) for row in csv_reader) + except zipfile.BadZipFile as bad_zip_file: + logging.exception( + f'Plausible responded with broken archive for {language}. Retrying.' + ) + exception = bad_zip_file + continue + raise exception