Скрапинг данных GitHub за пределами лимита API: Звезды, Зависимости

API GitHub ограничивает неаутентифицированные вызовы до 60 в час и полностью скрывает зависимости и тренды. Вот как добывать важные сигналы через дешевые IP.

GitHub — это кладезь исследований: кривые принятия, динамика конкурентов, графики зависимостей, сигналы найма — и его официальный API предоставит вам часть этого бесплатно. Затем он останавливается. Неаутентифицированные вызовы ограничены 60 в час, а два набора данных, которые больше всего интересуют людей, граф зависимостей и страница трендов, вообще не входят в API. Это руководство охватывает, как скрапить данные GitHub за пределами этих ограничений: что дает API, что нужно читать из HTML и почему GitHub — это редкая цель, где дешевые датацентровые и IPv6 прокси являются правильным инструментом.

Знайте пределы, прежде чем бороться с ними

Начните с API — он структурирован, одобрен и дешев по квоте, если вы аутентифицируетесь. Числа, которые формируют все: неаутентифицированные REST-запросы ограничены 60 в час, считаются по IP; аутентифицированный токен получает 5,000 в час; Search API еще более строгий — 30 запросов в минуту аутентифицированных (10 неаутентифицированных). Ключевой момент в том, что неаутентифицированный потолок считается по IP — именно поэтому маршрутизация чтений через множество IP увеличивает ваш запас.

import requests

# Authenticated API call - watch the rate-limit headers
headers = {"Authorization": "Bearer YOUR_GH_TOKEN",
           "Accept": "application/vnd.github+json"}
r = requests.get("https://api.github.com/repos/psf/requests", headers=headers, timeout=15)
repo = r.json()
print(repo["stargazers_count"], repo["forks_count"], repo["open_issues_count"])
print("remaining this hour:", r.headers["X-RateLimit-Remaining"])

Используйте API для всего, что он чисто предоставляет, и используйте git clone для содержимого файлов — клонирование и обработка репозитория локально быстрее и мягче, чем скрапинг отдельных страниц файлов. Скрапинг HTML предназначен для сигналов, которые API ограничивает до бесполезности или полностью исключает.

Что нужно читать из HTML

Три ценных набора данных существуют только на отрисованных страницах. Граф зависимостей — счетчик "Используется в" GitHub и список репозиториев, которые зависят от пакета — это один из самых сильных показателей принятия, и его нет в API. Страницы трендов (github.com/trending, фильтруемые по языку и окну) существуют только в HTML. И страницы тем выводят репозитории по темам гораздо полезнее, чем позволяет квота поиска. Все три — это простой серверный HTML, так что простое запрос-парсирование работает — браузер не требуется.

import requests
from bs4 import BeautifulSoup

# Scrape the trending page through a datacenter proxy
PROXY = "http://USER:PASS@dc.quantumproxies.io:8000"

def trending(language="python", since="daily"):
    url = f"https://github.com/trending/{language}?since={since}"
    r = requests.get(url, proxies={"https": PROXY}, timeout=20,
                     headers={"User-Agent": "Mozilla/5.0"})
    soup = BeautifulSoup(r.text, "html.parser")
    repos = []
    for row in soup.select("article.Box-row"):
        name = row.select_one("h2 a")["href"].strip("/")
        stars = row.select_one("a[href$='/stargazers']")
        repos.append({"repo": name,
                      "stars": stars.get_text(strip=True) if stars else None})
    return repos

print(trending("rust", "weekly")[:5])
Панель статистики, показывающая лимиты API GitHub: 60 неаутентифицированных запросов в час, 5000 аутентифицированных, 30 поисковых в минуту
Неаутентифицированный потолок считается по IP — именно это делает распределение чтений по пулу эффективным.

GitHub — это цель для датацентровых (и, возможно, IPv6) прокси

Вот часть, которую люди переусложняют. Публичные страницы GitHub серверно-отрисованы, снисходительны и не содержат агрессивных JavaScript вызовов — так что вам не нужны премиум жилые IP для их чтения. Это классический случай для датацентровых прокси: дешевые, быстрые и обильные, распределенные широко, чтобы ни один IP не приближался к неаутентифицированному лимиту или не вызывал вторичного ограничения скорости. Использование жилых здесь — это платить роскошные цены за работу, которую идеально выполняет экономичный IP. Наше руководство по когда датацентровые прокси — правильный выбор объясняет именно такую снисходительную, высокопроизводительную цель.

Есть еще более дешевый вариант, который стоит протестировать: IPv6. Когда цель отвечает через IPv6, пулы IPv6 прокси предоставляют огромное, недорогое адресное пространство — идеально для распределения чтений, ограниченных по IP, через тысячи выходов. GitHub внедряет поддержку IPv6, так что это одна из немногих крупных целей, где это стоит проверить, а не предполагать. Протестируйте это, прежде чем принимать решение: пропустите цель через наш бесплатный проверщик совместимости IPv6 и прочитайте экономику в нашем полном руководстве по прокси IPv6.

Получите быстрые датацентровые прокси для GitHub

Учитывайте вторичное ограничение скорости

Потолки по часам — не единственные ограничения, с которыми вы столкнетесь. GitHub также запускает обнаружение злоупотреблений, которое реагирует на резкий, высококонкурентный или подозрительно регулярный трафик — так что даже если вы находитесь под числовым лимитом, интенсивные запросы с одного IP могут привести к временному блокированию. Защиты те же, что делают вас вежливым клиентом: ограничьте конкурентность, добавьте немного случайности между запросами, уважайте любой заголовок Retry-After, который сервер вам передает, и распределяйте нагрузку, чтобы ни один выход не имел беглого паттерна. Это настоящая причина, почему широкий пул важен — это не только арифметика 60 в час, это то, что ни один индивидуальный IP не должен выглядеть как сбой скрипта. Отступите при первом 403 или замедлении, а не повторяйте сразу в более длительный бан.

Преобразование данных репозитория в информацию о разработке

Суть всего этого — аналитический слой. Отслеживайте скорость звезд и количество зависимостей библиотеки конкурента с течением времени, и вы наблюдаете принятие в реальном времени. Сравнивайте страницы трендов по языкам неделю за неделей, чтобы заметить растущие инструменты до того, как они станут очевидными. Извлекайте списки участников, чтобы оценить размер команды и сигналы найма. Комбинируйте разбивки по языкам по теме, чтобы картировать всю экосистему. Снимайте снимки репозиториев по расписанию, сохраняйте каждую запись с временной меткой, и дельты становятся продуктом — динамика, а не одно число. Однократное чтение 40,000 звезд — это тривиальность; тот же репозиторий, добавляющий 2,000 звезд в неделю, пока его количество зависимостей растет, — это настоящий сигнал принятия, на который вы можете действовать до того, как его заметит более широкий рынок.

import requests
from bs4 import BeautifulSoup

# The 'Used by' dependents count - a top adoption signal, HTML-only
def used_by(owner, repo):
    url = f"https://github.com/{owner}/{repo}/network/dependents"
    proxy = "http://USER:PASS@dc.quantumproxies.io:8000"
    r = requests.get(url, proxies={"https": proxy}, timeout=20,
                     headers={"User-Agent": "Mozilla/5.0"})
    soup = BeautifulSoup(r.text, "html.parser")
    tab = soup.select_one("a.btn-link.selected")
    return tab.get_text(strip=True) if tab else None

print(used_by("pallets", "flask"))   # e.g. '1.4m Repositories'

Одна привычка держит затраты в разумных пределах при большом объеме: запрашивайте только то, что вам нужно. Страницы репозиториев легковесны, но если вы расширяетесь до тысяч репозиториев, блокируйте активы и повторно используйте соединения — наши заметки о сокращении затрат на пропускную способность прокси применимы даже к дешевой цели, потому что выигрыш накапливается.

Сравнение датацентровых, IPv6 и жилых прокси для скрапинга GitHub
Для снисходительной публичной цели датацентровые и IPv6 IP выигрывают по стоимости; жилые — это излишество, которое вы сохраняете для более сложных сайтов.

Часто задаваемые вопросы

Каков лимит скорости API GitHub?

Неаутентифицированные REST-запросы ограничены 60 в час, считаются по IP-адресу. Аутентифицированный токен повышает это до 5,000 в час. Search API отдельный и более строгий — 30 запросов в минуту аутентифицированных, 10 неаутентифицированных. Поскольку неаутентифицированный лимит действует на IP, распределение чтений через пул прокси — это эффективный способ масштабирования сбора.

Могу ли я скрапить данные GitHub, которые API не предоставляет?

Да. Граф зависимостей ("Используется в"), страницы трендов, списки тем и временные шкалы звезд — это только HTML или сильно ограниченные по квоте через API. Это простые серверно-отрисованные страницы, так что запрос-парсирование с BeautifulSoup работает без браузера. Маршрутизируйте через датацентровые прокси и распределяйте чтения, чтобы оставаться ниже вторичных ограничений скорости.

Нужны ли мне жилые прокси для GitHub?

Обычно нет. Публичные страницы GitHub снисходительны и серверно-отрисованы без агрессивных JavaScript вызовов, так что дешевые датацентровые прокси справляются с ними хорошо — цель состоит в распределении запросов по IP, а не в маскировке их под домашние. Если цель отвечает через IPv6, пулы IPv6 еще дешевле. Оставьте жилые IP для действительно враждебных целей.

Должен ли я использовать git clone или скрапить страницы файлов?

Клонируйте для содержимого файлов. Запуск git clone и обработка репозитория локально быстрее, мягче для GitHub и полностью избегает ограничений скорости на файл. Оставьте HTML-скрапинг и API для метаданных и сигналов — звезд, зависимостей, трендов, участников — которые вы не можете получить из самих проверенных файлов.

GitHub вознаграждает многослойный подход: API, где он щедр, git clone для файлов и HTML-скрапинг для сигналов принятия, которые он скрывает — все распределено по дешевым IP, чтобы ни один адрес не достигал стены 60 в час. Тестируйте на IPv6, полагайтесь на датацентровые пулы, и вся платформа становится живым набором данных экосистемы разработчиков.

Попробуйте IPv6 прокси для высокообъемных чтений GitHub