70

大约 2 个月前,我第一次在 PyPi 上放了一个包,并且从那时起进行了一些版本更新。本周我注意到下载计数记录,并惊讶地发现它已被下载数百次。在接下来的几天里,我更惊讶地看到下载量每天增加数百,尽管这是一个小众统计测试工具箱。特别是,旧版本的软件包继续被下载,有时比最新版本的下载速度更高。

这里发生了什么?

PyPi 的下载计数中是否存在错误,或者是否有大量爬虫抓取开源代码(就像我的一样)?

4

4 回答 4

78

在这一点上,这是一个老问题,但我注意到我在 PyPI 上的一个包有同样的事情,并进一步调查。事实证明,PyPI 保留了相当详细的下载统计信息,包括(显然是稍微匿名的)用户代理。由此可见,大多数下载我的包的人都是“z3c.pypimirror/1.0.15.1”和“pep381client/1.5”之类的。(PEP 381 描述了 PyPI 的镜像基础设施。)

我编写了一个快速脚本来统计所有内容,首先包括所有这些,然后忽略最明显的机器人,结果证明我的包的99%的下载活动是由镜像机器人引起的:总共 14,335 次下载,相比之下只有 146 次下载并过滤了机器人。这只是忽略了非常明显的那些,所以它可能仍然被高估了。

看起来 PyPI 需要镜像的主要原因是因为它有镜像。

于 2013-02-06T10:05:29.630 回答
11

从 Cairnarvon 的总结声明开始:

“看起来 PyPI 需要镜像的主要原因是因为它有镜像。”

我会稍微修改一下:

它可能更像是 PyPI 实际工作的方式,因此必须进行镜像,这可能会为实际流量贡献额外的一点(或两点:-) 。

目前,我认为您必须与主索引交互才能知道要在存储库中更新什么。状态不能简单地通过某些可公开访问的文件夹层次结构上的时间戳来访问。所以,不好的是,rsync 不在等式。好消息是,您可以通过 JSON、OAuth、XML-RPC 或 HTTP 接口与索引通信。

对于 XML-RPC:

$> python
>>> import xmlrpclib
>>> import pprint
>>> client = xmlrpclib.ServerProxy('http://pypi.python.org/pypi')
>>> client.package_releases('PartitionSets')
['0.1.1']

对于 JSON,例如:

$> curl https://pypi.python.org/pypi/PartitionSets/0.1.1/json

如果有大约。托管了 30.000 个包 [ 1 ],其中一些包每周下载 50.000 到 300.000 次 [ 2 ](如分发、pip、请求、paramiko、lxml、boto、paramike、redis 等),至少从可访问性的角度来看,您确实需要镜像。想象一下pip install NeedThisPackage失败时用户会做什么:等待?此外,公司范围内的 PyPI 镜像也很常见,它们充当其他无法路由的网络的代理。最后不要忘记通过 virtualenv 和朋友启用的精彩的多版本检查。这些都是 IMO 合法的和潜在的美妙的包用途......

最后,您永远不知道代理对下载的包真正做了什么:让 N 个用户真正使用它,或者下次只是覆盖它......毕竟,恕我直言,包作者应该更关心使用的数量和性质,而不是潜在用户的纯数量;-)


参考:猜测的数字来自https://pypi.python.org/pypi(29303个包)和http://pypi-ranking.info/week(对于每周数字,请求 2013-03-23)。

于 2013-03-23T07:47:19.030 回答
10

您还必须考虑到 virtualenv 越来越受欢迎。如果您的包类似于人们在许多项目中使用的核心库,他们通常会多次下载它。

考虑一个用户有 5 个项目,他在其中使用你的包,每个项目都存在于自己的 virtualenv 中。使用 pip 满足要求,你的包已经被下载了 5 次。然后这些项目可能会设置在不同的机器上,比如工作、家庭和笔记本电脑,此外,如果是 Web 应用程序,可能还会有一个登台和一个实时服务器。总结一下,你最终会得到一个人的许多下载。

只是一个想法......也许你的包裹只是很好。;)

于 2012-03-10T18:46:30.777 回答
3

假设:Travis CI 和 Appveyor 等 CI 工具也做出了相当大的贡献。这可能意味着每次提交/推送都会导致构建包并安装 requirements.txt 中的所有内容

于 2016-04-14T13:23:04.147 回答