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