Curl cffi
curl_cffi — это попытка прикрутить к Питону мощь и славу curl (точнее, его библиотеки libcurl) через механизм CFFI (C Foreign Function Interface), который позволяет питонячьему скрипту дёргать Си-шные функции, делая вид, что так и было задумано. Главная фишка и причина существования сего творения — возможность прикидываться браузером на уровне TLS-рукопожатия, обходя хитрожопые защиты, которые палят стандартные питонячьи SSL/TLS-стеки за версту.
Зачем и почему?[править]
Представь себе типичную ситуацию: некий школьник или быдлокодер решает накодить скрипт для парсинга котиков (или чего поинтереснее, вроде курсов крипты или цен на аниме-фигурки) с очередного сайтеца. Он берёт свой любимый requests, пишет три строки кода и… получает кукиш с маслом. Сайт, защищённый какой-нибудь вундервафлей типа Cloudflare, вежливо посылает его куда подальше, определив по уникальному отпечатку пальца TLS-хендшейка, что перед ним не хомо сапиенс с Хромом последней версии, а жалкий бот на питоне.
Тут-то на сцену и выходит наш герой — curl_cffi. В отличие от стандартных питоньих библиотек, которые используют свои, зачастую палящиеся реализации TLS (вроде OpenSSL в стандартной комплектации), curl_cffi тащит за собой libcurl. А libcurl, в свою очередь, может быть скомпилирован с использованием тех же TLS-библиотек, что и браузеры (например, BoringSSL, форк OpenSSL от Google, используемый в Chrome). При правильной настройке (или просто удачном стечении обстоятельств и версии библиотеки) curl_cffi может сгенерировать TLS-рукопожатие, неотличимое от браузерного (привет, JA3/JA4 и прочие акронимы из трёх/четырёх букв!).
В результате сервер думает, что к нему ломится обычный юзер, и невозбранно отдаёт контент. Лулз в том, что это вечная игра в кошки-мышки: завтра Cloudflare выкатит новую проверку, послезавтра обновятся браузеры и их отпечатки, и придётся снова обновлять curl_cffi или искать новый, ещё более хитрый велосипед.
Альтернативы и перспективы[править]
Конечно, curl_cffi — не единственный способ борьбы с ветряными мельницами веб-защит. Есть старый добрый Selenium или более модный Playwright, которые запускают полноценный браузер. Но это тяжеловесно, медленно и жрёт память как не в себя. Есть хардкорный pycurl — прямые биндинги к libcurl без CFFI-прослойки, но с ещё более вырвиглазным API. Есть даже попытки патчить стандартные библиотеки или использовать нодовские поделия через subprocess.