Skip to content

Instantly share code, notes, and snippets.

@s-m-e
Last active January 5, 2020 10:04
Show Gist options
  • Save s-m-e/c3ba82c890a8c3b38c6989da7ae30609 to your computer and use it in GitHub Desktop.
Save s-m-e/c3ba82c890a8c3b38c6989da7ae30609 to your computer and use it in GitHub Desktop.
Download PyPI statistics for all packages of one user (maintainer and/or owner)
#!/usr/bin/env python
# Python >= 3.6
import datetime
import json
import os
import xmlrpc.client
import requests # pip install requests
USER = 'username'
TARGET = '/path/to/data'
STATS = ('overall', 'python_major', 'python_minor', 'system')
def _get_user_packages(user):
client = xmlrpc.client.ServerProxy('https://pypi.org/pypi')
return {item[1] for item in client.user_packages(user)}
def _get_stats(package_name, stats_name):
r = requests.get(f'https://pypistats.org/api/packages/{package_name:s}/{stats_name:s}')
return json.loads(r.content.decode('utf-8'))
def main():
packages = _get_user_packages(USER)
time = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
for package_name in packages:
for stats_name in STATS:
data = _get_stats(package_name, stats_name)
with open(os.path.join(TARGET, f'{package_name:s}.{stats_name:s}.{time:s}.json'), 'w') as f:
f.write(json.dumps(data, sort_keys = True, indent = '\t'))
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment