Scrapy download handler with TLS fingerprint impersonation via curl_cffi
Project description
scrapy-fake-tls
Scrapy download handler с подменой TLS-отпечатков на базе библиотеки curl_cffi.
Является drop-in заменой для стандартного HTTP-обработчика Scrapy. Позволяет имитировать TLS/HTTP2-отпечатки (JA3/JA4, AKAMAI) реальных браузеров, делая запросы вашего парсера неотличимыми от трафика обычных пользователей.
Особенности
- Подмена TLS-отпечатка: поддержка Chrome, Firefox, Safari, Edge и других браузеров.
- Ротация отпечатков на лету: изменение отпечатка для каждого отдельного запроса через
request.meta["impersonate"]. - Поддержка прокси: возможность передачи пользовательских заголовков для прокси-серверов (например,
Proxy-Authorization). - Асинхронная архитектура: нативная поддержка
asyncioи пулинг соединений для высокой производительности. - Работа "из коробки" без сложной настройки — используются оптимальные параметры по умолчанию.
- Полная совместимость со Scrapy версий от 2.11 до 2.15+.
Установка
pip install scrapy-fake-tls
Быстрый старт
Настройте проект Scrapy, добавив в settings.py следующие параметры:
# Обязательно: использование асинхронного реактора
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
# Замена стандартных обработчиков загрузки
DOWNLOAD_HANDLERS = {
"http": "scrapy_fake_tls.AsyncCurlCffiDownloadHandler",
"https": "scrapy_fake_tls.AsyncCurlCffiDownloadHandler",
}
# Опционально: браузер для имитации по умолчанию (стандартно "chrome")
CURL_CFFI_IMPERSONATE = "chrome"
После этого все запросы будут использовать базовый TLS-отпечаток выбранного браузера (по умолчанию — Chrome последних версий).
Параметры отдельных запросов (Request Meta)
Вы можете изменять отпечаток и другие параметры прямо в запросах.
import scrapy
class MySpider(scrapy.Spider):
name = "example"
def start_requests(self):
yield scrapy.Request(
"https://tls.browserleaks.com/json",
meta={"impersonate": "firefox"},
)
yield scrapy.Request(
"https://tls.browserleaks.com/json",
meta={"impersonate": "safari"},
)
Поддерживаемые браузеры
Существует возможность использовать общие сокращения (подставляющие актуальную версию) или указывать конкретную сборку:
| Общее имя | Доступные версии |
|---|---|
chrome |
chrome99, chrome120, chrome131, chrome136, chrome142, chrome145 |
firefox |
firefox133, firefox135, firefox144, firefox147 |
safari |
safari15_3, safari17_0, safari18_0, safari18_4 |
edge |
edge99, edge101 |
Указание общего имени (например, "chrome") автоматически задействует последнюю поддерживаемую версию.
Прокси и заголовки прокси
Для использования прокси и специфических заголовков, отправляемых только на прокси-узел (и недоступных конечному серверу), используйте proxy_headers:
yield scrapy.Request(
url,
meta={
"proxy": "http://user:pass@proxy-host:8080",
"proxy_headers": {
"Proxy-Authorization": "Basic dXNlcjpwYXNz",
"X-Custom-Proxy-Header": "value",
},
},
)
Заголовки прокси передаются через механизм CURLOPT_PROXYHEADER в libcurl.
Спецификация параметров Request.meta
| Ключ | Тип | Описание |
|---|---|---|
impersonate |
str |
Отпечаток какого браузера имитировать (напр. "chrome") |
proxy |
str |
URL прокси-сервера |
proxy_headers |
dict |
Словарь дополнительных заголовков для прокси |
download_timeout |
float |
Индивидуальный таймаут загрузки (в секундах) |
dont_redirect |
bool |
Принудительный запрет на редиректы для запроса |
Основные настройки (Settings)
| Параметр | По умолчанию | Описание |
|---|---|---|
CURL_CFFI_IMPERSONATE |
"chrome" |
Глобальный отпечаток браузера |
DOWNLOAD_TIMEOUT |
180 |
Таймаут загрузки (в секундах) |
Принцип работы и архитектура
- При первом выполнении запроса с уникальным набором параметров
(impersonate, proxy, proxy_headers), обработчик инициализирует и кеширует новую сессиюcurl_cffi.AsyncSession. - Последующие запросы с тем же набором параметров используют кешированную сессию, переиспользуя TCP-соединения (Connection Pooling).
- При завершении работы Scrapy-паука (остановка движка), все открытые сессии корректно закрываются.
Зависимости
- Python >= 3.10
- Scrapy >= 2.11
- curl_cffi >= 0.7
Лицензия
Распространяется на условиях лицензии MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scrapy_fake_tls-1.0.1.tar.gz.
File metadata
- Download URL: scrapy_fake_tls-1.0.1.tar.gz
- Upload date:
- Size: 7.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b0f67ae3d0710055ffd48a335f35ab760e407203a2503cb752b4e7827b8703d1
|
|
| MD5 |
12e9de719c335f2d28c26bc8dd77c613
|
|
| BLAKE2b-256 |
3823eaa141274eedefa3148555cf5da49a978ca1ad6d5853e53c0693ff1c4946
|
File details
Details for the file scrapy_fake_tls-1.0.1-py3-none-any.whl.
File metadata
- Download URL: scrapy_fake_tls-1.0.1-py3-none-any.whl
- Upload date:
- Size: 7.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
904dcf64f7b7efa41cedba686cb455a79e4d03c7a0e67c68f4f72ec89d3edca1
|
|
| MD5 |
1c8666e10a99335cde8aa35109babf31
|
|
| BLAKE2b-256 |
332f706859bc821dfefba679faa6f801416467c1dd7efc40add9473523995f2d
|