Взявшись за эту задачу, я около двух часов ваял небольшой скрипт, который будет скрейпить данные из базы крейтов Rust crates.io и анализировать их для выяснения, какие пакеты чаще скачивают для работы (то есть в будние дни), а какие для хобби-проектов (то есть в выходные).

И вы можете опробовать этот скрипт прямо сейчас с помощью uv:

uv run https://gist.githubusercontent.com/beyarkay/6e752756f71b3a84f44af42a964cc399/raw/main.py serde tokio anyhow

На что получите такой вывод:

Крейт         В будни    Н Business÷Pleasure
--------------------------------------------------
tokio        40358216    6136704 2.67
anyhow       43630626    6789537 2.61
serde        63175072   11452723 2.24

Это означает, что tokio в будни скачивался в 2,67 раза чаще, чем в выходные (и да, здесь учитывается то, что будних дней в 2,5 раза больше, чем выходных).

Скачивание метаданных 1000 крейтов

Воспользовавшись помощью ChatGPT, я написал команду bash для скачивания 1000 самых популярных крейтов, извлечения их названий и последующей обработки этой информации скриптом для определения, какие чаще всего используются в хобби-проектах:

for p in {1..10}; do
  curl -s "https://crates.io/api/v1/crates?page=${p}&per_page=100&sort=downloads" \
    -H "User-Agent: Script for https://gist.github.com/beyarkay/6e752756f71b3a84f44af42a964cc399" \
    | jq -r '.crates[].id'
  sleep 1
done | xargs uv run https://gist.githubusercontent.com/beyarkay/6e752756f71b3a84f44af42a964cc399/raw/main.py

Для скачивания метаданных всех крейтов этой команде требуется около 10 минут. Если же вы хотите получить не 1000, а 100 самых популярных крейтов, то используйте этот скрипт:

curl -s 'https://crates.io/api/v1/crates?page=1&per_page=100&sort=downloads' \
    | jq -r '.crates[].id' \
    | xargs uv run https://gist.githubusercontent.com/beyarkay/6e752756f71b3a84f44af42a964cc399/raw/main.py

Дополнение от 19.06.2025: один из разработчиков crates.io указал мне на их политику использования API. В предыдущей версии этой статьи я не устанавливал в запросах строку User Agent и не делал между ними паузу. Признаю свою вину. Мне следовало ознакомиться с политиками и не злоупотреблять благами свободного интернета. В будущем я всё это учту и в своих экспериментах буду использовать базу данных, а не API.

Скачать все 1000 топовых крейтов в виде CSV-файла можно здесь.

Самые скачиваемые крейты в течение недели

Крейт

Описание

Скачиваний в неделю

Скачиваний в выходные

Работа÷Хобби

jsonschema

Библиотека проверки JSON-схем

6 329 667

246 262

10.44

retain_mut

Предоставляет метод retain_mut, обеспечивающий ту же функциональность, что и retain, но с возможностью изменения заимствованных предикатов.

2 730 719

114 647

9.68

fraction

Библиотека обработки дробей и десятичных значений абсолютной точности; позволяет выполнять замену значений с плавающей запятой без изменения кода.

5 943 813

258 175

9.35

jsonpath-rust

Обеспечивает базовую функциональность для поиска данных в соответствии с фильтрующим запросом.

7 820 463

354 292

8.97

metrics-util

Вспомогательные типы/функции, используемые в системе метрик.

5 696 846

261 035

8.87

О jsonschema я раньше не слышал, но не удивлён, что крейт для проверки схем наиболее популярного формата сериализации в течение недели скачивают намного чаще, чем в выходные. В графике на crates.io этот нюанс явно выделяется:

Практически никто не скачивает jsonschema на выходных.

Что же меня, наоборот, несколько удивило, так это появление здесь fraction. Могу лишь предположить, что с помощью Rust выполняется большой объём академических или научных вычислений. Не знаю, насколько точные дроби помогают повысить доход или снизить затраты, но один из язвительных комментаторов на Reddit обязательно мне подскажет. Остальные же крейты, по всей видимости, в основном расширяют уже существующую функциональность.

Наименее скачиваемые крейты в течение недели

Крейт

Описание

Скачиваний в будни

Скачиваний в выходные

Работа÷Хобби

proc-macro-nested

Обеспечивает поддержку вложенных вызовов proc-macro-hack.

316 396

75 467

1.70

difference

Библиотека для поиска различий между фрагментами кода и написания проверочных утверждений.

1 209 375

255 015

1.93

version-compare

Библиотека для сопоставления версий в любых форматах с помощью различных операторов сравнения.

3 213 640

656 467

1.99

net2

Расширения сетевых типов стандартной библиотеки в соответствии с предложением из RFC 1158.

1 628 494

330 474

2.00

iovec

Портируемый буферный тип для выполнения ввода/вывода по механизму scatter/gather.

1 697 529

331 185

2.08

Похоже, энтузиасты любят экспериментировать с proc-macro (или, скорее, proc-macro-nested просто совсем непопулярен). Ниже я привёл аналогичный график с crates.io. Он по-прежнему скачкообразный, но разрывы с выходными уже намного меньше. Здесь также не особо велики абсолютные показатели скачиваний (это касается всех наименее популярных крейтов), поэтому график вполне могут исказить несколько особо активных пользователей.

Графики и графы

Взглянем на распределение соотношений количества скачиваний 1000 самых популярных крейтов:

Разброс получился очень плотный. Среди наиболее популярных крейтов нет таких, отличие в числе скачиваний которых между буднями и выходными составляло более 5х или менее 2х. Это также видно по статистике, где стандартное отклонение составляет всего 0,93:

mean        3.39
std         0.93
min         1.70
25%         2.79
50%         3.16
75%         3.76
max        10.44

Ниже показан график скачиваний 1000 самых популярных крейтов. Зелёная линия указывает на точку, где крейт скачивался одинаковое количество раз в будни и выходные:

Вы также можете поэкспериментировать с интерактивной версией этого графика (после перехода по ссылке обновите страницу).

Интересно видеть некоторый изгиб в распределении точек, который говорит, что молодые крейты активно скачиваются в будние дни и по мере своего взросления начинают получать больше внимания на выходных. Этот тренд противоречит моим ожиданиям. Я думал, что небольшие крейты сперва находят энтузиасты, после чего они постепенно перетекают в бизнес-сферу.

О создании скрипта

Учитывая, что мы живём в эпоху ИИ, и у меня обычно нет возможности тратить лишнее время на написание веб-скрейпера полностью самостоятельно, я активно использовал для реализации основной его части ChatGPT.

Не без усилий1 мне удалось выяснить, что первый свой запрос я отправил в понедельник 9 июня 2025 года в 20:35, а последнее значительное изменение внёс около 21:10. То есть для получения от ChatGPT нужного мне результата потребовалось где-то 40 минут. Первый сгенерированный ботом скрипт работал отлично, так что в процессе я просто добавлял всякие фишки. Например:

  • текстовую помощь на случай, если пользователь не предоставит параметров командной строки,

  • шкалу прогресса, отражающую скачивание метаданных крейтов (для каждого крейта это примерно 1,5 с),

  • цветной вывод — почему бы нет…

  • упорядочивание крейтов по соотношению «Работа÷Хобби»,

  • удаление невнятного форматирования, которое в скрипт добавил ChatGPT.

В целом, можно было обойтись передачей информации твита в ChatGPT и получить набросок кода (gist). Поразительно, насколько далеко продвинулись LLM.

Когда всё было готово, я записал демо-ролик, загрузил скрипт в виде гиста, разобрался, как правильно выполнить этот гист через uv и отправил ответ автору поста с инструкциями.

Выводы

Это получился очень интересный короткий проект. Мне очень понравилось, что LLM ускорила и упростила весь процесс. Всё это и раньше не составляло для меня сложности, но просто не так я себе представляю развлекательный досуг. LLM же позволила мне отбросить всю рутинную составляющую и заняться самым интересным. Надеюсь, такой тренд сохранится.

Если вы интересуетесь наукой о данных и любите изучать всякие графики, то вам будет любопытно взглянуть на мой улов из TikTok.

Обсуждение проекта на:

Сноска

  • По непонятной причине интерфейс ChatGPT не присваивает сообщениям временные метки, но они присутствуют в JSON-данных сетевого ответа, поэтому в конечном итоге я эти метки раздобыл. 

 

Комментарии (1)


  1. Siemargl
    29.06.2025 09:15

    Надо запустить скрипт и проверить хабраэффект на хранилище крейтов