
Взявшись за эту задачу, я около двух часов ваял небольшой скрипт, который будет скрейпить данные из базы крейтов 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-файла можно здесь.
Самые скачиваемые крейты в течение недели
Крейт |
Описание |
Скачиваний в неделю |
Скачиваний в выходные |
Работа÷Хобби |
Библиотека проверки JSON-схем |
6 329 667 |
246 262 |
10.44 |
|
Предоставляет метод |
2 730 719 |
114 647 |
9.68 |
|
Библиотека обработки дробей и десятичных значений абсолютной точности; позволяет выполнять замену значений с плавающей запятой без изменения кода. |
5 943 813 |
258 175 |
9.35 |
|
Обеспечивает базовую функциональность для поиска данных в соответствии с фильтрующим запросом. |
7 820 463 |
354 292 |
8.97 |
|
Вспомогательные типы/функции, используемые в системе метрик. |
5 696 846 |
261 035 |
8.87 |
О jsonschema
я раньше не слышал, но не удивлён, что крейт для проверки схем наиболее популярного формата сериализации в течение недели скачивают намного чаще, чем в выходные. В графике на crates.io этот нюанс явно выделяется:

Практически никто не скачивает jsonschema
на выходных.
Что же меня, наоборот, несколько удивило, так это появление здесь fraction
. Могу лишь предположить, что с помощью Rust выполняется большой объём академических или научных вычислений. Не знаю, насколько точные дроби помогают повысить доход или снизить затраты, но один из язвительных комментаторов на Reddit обязательно мне подскажет. Остальные же крейты, по всей видимости, в основном расширяют уже существующую функциональность.
Наименее скачиваемые крейты в течение недели
Крейт |
Описание |
Скачиваний в будни |
Скачиваний в выходные |
Работа÷Хобби |
Обеспечивает поддержку вложенных вызовов |
316 396 |
75 467 |
1.70 |
|
Библиотека для поиска различий между фрагментами кода и написания проверочных утверждений. |
1 209 375 |
255 015 |
1.93 |
|
Библиотека для сопоставления версий в любых форматах с помощью различных операторов сравнения. |
3 213 640 |
656 467 |
1.99 |
|
Расширения сетевых типов стандартной библиотеки в соответствии с предложением из RFC 1158. |
1 628 494 |
330 474 |
2.00 |
|
Портируемый буферный тип для выполнения ввода/вывода по механизму 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-данных сетевого ответа, поэтому в конечном итоге я эти метки раздобыл. ↩
Siemargl
Надо запустить скрипт и проверить хабраэффект на хранилище крейтов