计算详细的下载统计数据并为pypi包生成html和徽章
pypi-download-stats的Python项目详细描述
pypi下载统计信息
简介
此包从google bigquery检索一个或多个下载统计信息 pypi 包,在本地缓存它们,然后 生成下载计数徽章以及原始数据和图形的HTML页面 (由bokeh生成)。它的目的是 按计划(即每天)运行,并将结果上载到某个位置。
把它变成一个真正的服务(和一些扩展)当然会很好 但目前 我既没有时间去献身,也没有钱去支付 托管和带宽,也不想处理如何为 超过85000个项目,而不是我的少数。
希望像这样的数据最终会出现在官方的pypi中;请看 仓库 188 和 787 以获取有关该工作的参考。 目前,我想(a)给自己一个简单的下载统计数据的方法 还有一些徽章,比如旧的pypi遗产(每天、每周和每月下载一次) 因为(b)使一些更高的颗粒城市分析。
注意 这个包非常年轻;我是作为一个晚上/周末的项目写的, 希望只花几天时间。虽然写这个让我想洗澡 很快,它就没有测试了。如果人们开始使用它,我会改变它。
对于输出外观的真实示例,您可以查看下载 我的awslimitchecker项目的统计页面,由我桌面上的cronjob生成, http://jantman personal public.s3-website-us-east-1.amazonaws.com/pypi-stats/awslimitchecker/index.html" rel="nofollow">http://jantman personal public.s3-website-us-east-1.amazonaws.com/pypi stats/awslimitchecker/index.html
背景
2016年2月的某个时候,下载统计信息 停止使用pypi.python.org。我后来了解到,我们目前的情况(2016年8月) 众所周知,pypi实际上是pypi legacy的代码库, 而且远不是一个稳定的免提服务。由interpid灵魂组成的小团队 让它继续运行的人只需让它保持在线,同时还能工作 在更换时, 仓库 (截至2016年8月,可在线获取 点击https://pypi.io/" rel="nofollow">https://pypi.io/)。而实际的pypi.python.org Web用户界面还没有 已切换到仓库代码(仍在开发中),当前仓库 服务确实提供对pypi的完全访问。完全可以理解 以及遗留pypi代码库的"生命支持"状态,在遗留代码库中下载统计信息 是他们最后的顾虑。
但是,自2016年1月22日以来的当前下载统计数据(实际上是原始日志信息) 在google bigquery公共数据集中 可用 几乎实时更新。可能有下载统计信息的功能
要求
- Python2.7+(当前测试版本为2.7、3.2、3.3、3.4)
- python virtualenv 和 pip (建议的安装方法;您的操作系统/发行版应该有相应的软件包)
pypi下载统计数据依赖于bokeh生成 离线工作的漂亮svg图表,以及 google-api python客户端 用于查询bigquery。每一个都有额外的依赖关系。
安装
建议您安装到虚拟环境(virtualenv/ VEV)。请参阅 Virtualenv使用文档 有关如何创建VENV的信息。
讽刺的是,这还没上pypi。直到它是:
$ pip install git+https://github.com/jantman/pypi-download-stats.git
配置
对于具有bigquery api的项目,您需要google云凭据 启用。建议的方法是生成系统帐户凭据; 下载凭据的json文件并将路径导出为 google_application_credentials 环境变量。系统帐户 将需要添加为项目成员。
用法
使用 -h 运行以获取命令行帮助:
usage: pypi-download-stats [-h] [-V] [-v] [-Q | -G] [-o OUT_DIR] [-p PROJECT_ID] [-c CACHE_DIR] [-B BACKFILL_DAYS] [-P PROJECT | -U USER] pypi-download-stats - Calculate detailed download stats and generate HTML and badges for PyPI packages - <https://github.com/jantman/pypi-download-stats> optional arguments: -h, --help show this help message and exit -V, --version show program's version number and exit -v, --verbose verbose output. specify twice for debug-level output. -Q, --no-query do not query; just generate output from cached data -G, --no-generate do not generate output; just query data and cache results -o OUT_DIR, --out-dir OUT_DIR output directory (default: ./pypi-stats -p PROJECT_ID, --project-id PROJECT_ID ProjectID for your Google Cloud user, if not using service account credentials JSON file -c CACHE_DIR, --cache-dir CACHE_DIR stats cache directory (default: ./pypi-stats-cache) -B BACKFILL_DAYS, --backfill-num-days BACKFILL_DAYS number of days of historical data to backfill, if missing (defaut: 7). Note this may incur BigQuery charges. Set to -1 to backfill all available history. -P PROJECT, --project PROJECT project name to query/generate stats for (can be specified more than once; this will reduce query cost for multiple projects) -U USER, --user USER Run for all PyPI projects owned by the specifieduser.
使用 google cloud credentials json文件位于 foo.json :
$ exportGOOGLE_APPLICATION_CREDENTIALS=/foo.json $ pypi-download-stats -P foo -P bar
运行查询但不为所有pypi项目生成报告用户内幕 "myname":
$ exportGOOGLE_APPLICATION_CREDENTIALS=/foo.json $ pypi-download-stats -G -U myname
根据项目"foo"的缓存查询数据生成报告:
$ exportGOOGLE_APPLICATION_CREDENTIALS=/foo.json $ pypi-download-stats -Q -P foo
为了每晚运行并将结果上传到托管s3 bucket的网站,我使用 通过cron执行以下脚本(请注意,路径是特定于我的目的的;还请注意 这两个命令,如 s3cmd 似乎没有为svg设置mime类型 图像正确):
#!/bin/bash -x exportGOOGLE_APPLICATION_CREDENTIALS=/home/jantman/.ssh/pypi-bigquery.json cd /home/jantman/GIT/pypi-download-stats bin/pypi-download-stats -vv -U jantman # sync html files ~/venvs/foo/bin/s3cmd -r --delete-removed --stats --exclude='*.svg' sync pypi-stats s3://jantman-personal-public/ # sync SVG and set mime-type, since s3cmd gets it wrong ~/venvs/foo/bin/s3cmd -r --delete-removed --stats --exclude='*.html' --mime-type='image/svg+xml' sync pypi-stats s3://jantman-personal-public/
成本
现在…我不知道。有些下载表是每天3+GB。 我想从现在 在那里(20160122)可能会产生相当大的数据成本。
错误和功能请求
通过github问题跟踪器可以愉快地接受错误报告和功能请求。拉取请求是 欢迎。将处理没有附带拉取请求的问题 在我的时间和优先权允许的情况下。