如何通过编程获取符合特定条件的PyPI及GitHub托管的Python包列表?
获取符合条件的PyPI+GitHub Python包列表的可行方案
核心思路
通过PyPI官方API获取特定日期后的包元数据,从中筛选出源代码托管在GitHub的条目,再验证包是否可通过pip正常下载。
1. 从PyPI获取特定日期后的包列表
PyPI提供REST API用于查询包的更新信息,你可以按日期筛选指定时间后更新的包:
import requests def get_pypi_packages_after_date(date_str): url = "https://pypi.org/search/" params = { "q": f"updated:>{date_str}", "o": "desc", "page": 1 } packages = [] while True: response = requests.get(url, params=params) response.raise_for_status() data = response.json() if not data["results"]: break packages.extend([pkg["name"] for pkg in data["results"]]) params["page"] += 1 return packages
注意:PyPI搜索API有分页限制,需要循环遍历所有页码获取完整结果。
2. 筛选源代码托管在GitHub的包
对每个PyPI包,调用/pypi/{package_name}/json接口获取完整元数据,提取仓库地址并判断是否指向GitHub:
import re def is_hosted_on_github(package_name): url = f"https://pypi.org/pypi/{package_name}/json" response = requests.get(url) if response.status_code != 200: return False data = response.json() # 检查home_page字段 home_page = data["info"].get("home_page", "") if re.match(r"https?://github\.com/.*", home_page): return True # 检查project_urls中的仓库链接 project_urls = data["info"].get("project_urls", {}) for url in project_urls.values(): if re.match(r"https?://github\.com/.*", url): return True return False
3. 验证包可通过pip下载
用pip install --dry-run模拟安装,判断包是否能正常获取:
import subprocess def is_pip_installable(package_name): try: subprocess.run( ["pip", "install", "--dry-run", package_name], capture_output=True, text=True, check=True ) return True except subprocess.CalledProcessError: return False
整合所有步骤
将上述函数组合,即可得到符合所有条件的包列表:
import time def get_target_packages(date_str): pypi_packages = get_pypi_packages_after_date(date_str) target_packages = [] for pkg in pypi_packages: # 添加请求间隔避免PyPI限流 time.sleep(1) if is_hosted_on_github(pkg) and is_pip_installable(pkg): target_packages.append(pkg) print(f"符合条件的包:{pkg}") return target_packages # 使用示例:获取2024-01-01之后的目标包 target_list = get_target_packages("2024-01-01")
注意事项
- PyPI API有请求频率限制,必须添加请求间隔避免被限流。
- 部分包的元数据可能未填写GitHub地址,这类会被自动过滤。
- 若本地pip配置了镜像源,
--dry-run的验证结果可能受影响,也可以通过检查PyPI元数据中releases字段是否存在可下载发行版来替代。
内容的提问来源于stack exchange,提问作者Exploring
相关产品推荐
相关产品推荐

