aiohttp/ в логах — не имя одного конкретного бота, а технический отпечаток открытой Python-библиотеки для асинхронных HTTP-запросов. За этим токеном может стоять буквально что угодно: внутренний скрипт компании, webhook-сервис, монитор аптайма, интеграция через API — или наивный скрейпер, который просто не потрудился подменить User-Agent. Именно поэтому категория «Технические клиенты» здесь точнее, чем «бот» в привычном смысле: единого оператора у aiohttp нет и быть не может.
1. Что такое aiohttp Client на самом деле
aiohttp — популярная библиотека с открытым кодом (проект Aio-Libs) для асинхронных HTTP-запросов на Python, официальная документация — docs.aiohttp.org. Библиотекой пользуются тысячи независимых разработчиков и сервисов для совершенно разных задач: от простых internal-скриптов до промышленных интеграций. Библиотека может выступать и клиентом (делает запросы к вашему сайту — именно этот случай попадает в access.log), и сервером — это два разных режима использования одного и того же проекта.
Если разработчик не переопределяет заголовок явно, aiohttp автоматически подставляет собственный User-Agent в формате версии Python и версии библиотеки:
Python/3.9 aiohttp/3.8.6
Именно поэтому черновой паттерн поиска только по aiohttp/ технически верен, но обедняет картину: полная строка обычно включает и версию Python, что может пригодиться при более точной сегментации трафика по разным клиентам/скриптам.
| Параметр | Значение |
| Название | aiohttp Client |
| Природа | Открытая Python-библиотека для HTTP-запросов, а не отдельный именованный сервис или компания |
| User-Agent / паттерн | Полная форма по умолчанию: Python/X.X aiohttp/X.X.X; краткий поиск по aiohttp/ тоже сработает |
| Оператор | Не существует единого оператора — библиотеку использует неограниченное число независимых разработчиков и сервисов |
| Важная особенность | Заголовок User-Agent тривиально подменяется одной строкой кода — то, что он НЕ подменён, само по себе слабый сигнал: чаще так ведут себя внутренние скрипты и легитимные интеграции, а не боты, целенаправленно маскирующиеся под браузер |
| robots.txt | Нет смысла ожидать единообразного поведения — соблюдение полностью зависит от того, как написан конкретный скрипт конкретного разработчика |
| Пометка TrafficVeil | Легитимный / Технические клиенты |
2. Зачем aiohttp Client приходит на сайт
Поскольку это не единый сервис, а инструмент, реальных сценариев использования много одновременно на одном и том же домене:
- Мониторинг доступности — самописный или коробочный скрипт проверяет, что сайт или конкретный эндпоинт отвечает;
- Webhook и интеграции — сторонний сервис, подключённый к вашему сайту по API, делает запросы через aiohttp внутри своего кода;
- Внутренняя автоматизация — собственные скрипты компании (парсинг курсов, синхронизация данных, тестирование) написаны на Python с этой библиотекой;
- Начинающий или неаккуратный скрейпер — кто-то собирает данные с сайта и не позаботился о том, чтобы выглядеть как обычный браузер.
Типичный кейс: в аналитике фиксируется рост hits без реальных сессий, в access.log под этим временем преобладает aiohttp/ на пагинации и карточках. Поскольку у библиотеки нет единого владельца, разбираться нужно не «кто такой aiohttp», а какой конкретно скрипт это делает — через паттерн запрашиваемых URL, IP и время суток.
3. Нагрузка и риски
Главный практический риск — фоновый шум в аналитике и расход CPU/bandwidth, который искажает статистику «живого» трафика в Метрике/GA. Поскольку под одним UA может скрываться сразу несколько разных клиентов с разными целями, стоит сегментировать трафик по IP/ASN, а не считать весь aiohttp/-трафик однородным.
Полезный практический нюанс: если бы кто-то целенаправленно хотел замаскировать скрейпинг под обычного пользователя, подмена User-Agent на строку браузера — это буквально одна строка кода в aiohttp. Поэтому нетронутый заголовок aiohttp/ в логах чуть чаще указывает на легитимный внутренний или интеграционный трафик, чем на попытку скрытного парсинга, — хотя это лишь статистическая склонность, а не гарантия.
4. Как найти aiohttp Client в логах
# Базовый поиск
grep -i "aiohttp/" /var/log/nginx/access.log
# Более точный поиск с версией Python — помогает отличать разные скрипты
grep -iE "Python/[0-9.]+ aiohttp/" /var/log/nginx/access.log
# Топ URL, которые вычитывает клиент
grep -i "aiohttp/" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head
# Топ IP — здесь особенно важно, так как под одним UA могут быть разные источники
grep -i "aiohttp/" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head
# Суточная активность
grep -i "aiohttp/" /var/log/nginx/access.log | awk '{print $4}' | cut -d: -f1 | sort | uniq -c
# Разбивка по версии библиотеки — разные IP с разными версиями почти наверняка разные клиенты
grep -oiE "aiohttp/[0-9.]+" /var/log/nginx/access.log | sort | uniq -c | sort -rn
Верификация. Подделать строку легко, но, как отмечено выше, сам факт «честного» aiohttp-заголовка — слабый позитивный сигнал. Для решения allow/deny смотрите связку UA + IP/ASN + частоту + набор URL — при таком общем UA это единственный способ понять, кто именно за ним стоит:
IP="1.2.3.4"
whois -h whois.cymru.com " -v $IP"
dig +short -x "$IP"
5. robots.txt для aiohttp Client
# Жёсткий запрет
User-agent: aiohttp/
Disallow: /
# Разрешить всё
User-agent: aiohttp/
Allow: /
# Компромисс: закрыть личный кабинет и служебные разделы, оставить публичку
User-agent: aiohttp/
Disallow: /admin/
Disallow: /cart/
Disallow: /checkout/
Disallow: /account/
Disallow: /api/
Allow: /
Важно: поскольку под этим UA скрываются разные, никак не связанные между собой клиенты, правило в robots.txt заблокирует их все разом — включая, возможно, ваш собственный внутренний скрипт или полезную интеграцию. Прежде чем ставить общий Disallow, стоит убедиться, что среди источников нет своего же сервиса.
6. Блокировка вручную и через TrafficVeil
Nginx:
if ($http_user_agent ~* "aiohttp/") {
return 403;
}
limit_req_zone $binary_remote_addr zone=aiohttp:10m rate=10r/m;
location / {
if ($http_user_agent ~* "aiohttp/") {
limit_req zone=aiohttp burst=20 nodelay;
}
}
Apache (.htaccess):
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} aiohttp/ [NC]
RewriteRule ^ - [F,L]
TrafficVeil:
- перед блокировкой по UA уточните у команды разработки, не завязана ли на aiohttp своя интеграция или мониторинг;
- если источников несколько и часть из них полезна — точнее блокировать по конкретным IP/ASN нежелательных источников, а не по всему UA сразу;
- для разовых непонятных всплесков без явного вреда — rate-limit безопаснее полного deny именно из-за смешанной природы этого трафика;
- после изменения сверьте логи: нежелательные хиты должны уйти в блок/лимит, а собственные интеграции (если есть) — продолжать работать штатно.
7. Что делать: короткий алгоритм
- Убедитесь, что среди источников нет вашего же скрипта или подключённой интеграции — это единственный шаг, специфичный именно для этого UA;
- Пользы не найдено, источник чужой — Disallow/403;
- Источников несколько с разными целями — сегментируйте по IP/ASN вместо блокировки всего UA целиком;
- Нагрузка мешает, но природа трафика не ясна — сначала rate-limit, полный запрет позже;
- Не блокируйте по маске
User-agent: *, чтобы не задеть Googlebot/YandexBot заодно.
8. С кем не путать aiohttp Client
| Бот / сосед | Кластер | UA | Комментарий |
| Python Client (requests) | Технические клиенты | python-requests/ | легитимный, синхронный аналог aiohttp — та же логика «библиотека, не сервис» |
| Go Client | Технические клиенты | go-http-client | легитимный, тот же принцип для экосистемы Go |
| OkHttp | Технические клиенты | okhttp | легитимный, HTTP-библиотека для Java/Kotlin/Android — в том числе внутри мобильных приложений |
| curl | Технические клиенты | curl/ | легитимный, консольная утилита, а не библиотека приложений |
| Java HTTPClient | Технические клиенты | apache-httpclient | легитимный |
9. Стратегия allow/deny для aiohttp Client
| Ситуация | Действие |
| Источник — собственный скрипт или подключённая интеграция | Allow, при необходимости закрыть только /admin /cart /api |
| Несколько разных источников под одним UA, часть полезна | Разделять по IP/ASN, не блокировать весь UA целиком |
| Явно посторонний и мешает | Disallow + запрет в TrafficVeil |
| Нужен доступ, но пики нерегулярны | Rate-limit на nginx/TrafficVeil |
| Подозрение на скрытный скрейпинг под этим UA | Маловероятно технически — маскировка под браузер тривиальна, поэтому чистый aiohttp-заголовок чаще не признак попытки спрятаться, но проверяйте IP/ASN на всякий случай |