You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程获取符合特定条件的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:31:18