Skip to main content

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 Таймаут загрузки (в секундах)

Принцип работы и архитектура

  1. При первом выполнении запроса с уникальным набором параметров (impersonate, proxy, proxy_headers), обработчик инициализирует и кеширует новую сессию curl_cffi.AsyncSession.
  2. Последующие запросы с тем же набором параметров используют кешированную сессию, переиспользуя TCP-соединения (Connection Pooling).
  3. При завершении работы Scrapy-паука (остановка движка), все открытые сессии корректно закрываются.

Зависимости

  • Python >= 3.10
  • Scrapy >= 2.11
  • curl_cffi >= 0.7

Лицензия

Распространяется на условиях лицензии MIT.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

scrapy_fake_tls-1.0.0.tar.gz (7.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

scrapy_fake_tls-1.0.0-py3-none-any.whl (7.3 kB view details)

Uploaded Python 3

File details

Details for the file scrapy_fake_tls-1.0.0.tar.gz.

File metadata

  • Download URL: scrapy_fake_tls-1.0.0.tar.gz
  • Upload date:
  • Size: 7.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for scrapy_fake_tls-1.0.0.tar.gz
Algorithm Hash digest
SHA256 d6a64ae063abe1eacd55678f23ec845a6d07d185f38aedf7e421340df55e5e6d
MD5 8c824cba63625100f47cad0a10a8e4b4
BLAKE2b-256 38355f987741ea55aad84a59fc4b6fe21a874d616f5ac81505bf10f5e973b5e2

See more details on using hashes here.

File details

Details for the file scrapy_fake_tls-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for scrapy_fake_tls-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c68370255c9bdfb517159c153d9a35a46621c7b64cb72f0d7022e623bd9d7be2
MD5 da35a176ea0052d7a359c3366dd96ba1
BLAKE2b-256 3f22bb67212fc4baa8682dbfe8df52bcb35025c507e203aabc6f771e04d82b59

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page