Какие есть способы обхода Cloudflare на Python?
очень интересны любые методы обхода данной защиты, испробовал уже много вариантов. Какие-то из них работают, но временно. У меня есть бот, который использует Selenium, может есть способ скрыть что это автоматизированное ПО. Библиотека undetected-chromedriver не подходит, т.к. некоторые функции не работают с ней, либо же я не понял как переписать весь код под использование UC. Работа с маркетплейсом OZON.
- Вопрос задан 05 июн.
- 529 просмотров
Python. Веб-бот VS CloudFlare (WebScrapping) [2]
На прошлом уроке вы познакомились с Selenium на практике, и сделали автоматизированного бота для накрутки лайков. В этом уроке вы научитесь обходить защиту cloudflare.
Цель.
Создать бота, который заходит на tf2.tm, и парсит цены на предметы.
Пишем бота
Для начала, попробуйте написать бота заходящего на этот сайт. Вы увидите следующую картину.

При загрузке страницы вылезает окно cloudflare, которое не даст пройти на сайт. Причина этому проста, браузер сам говорит сайту что он бот, исправим это, изменив один параметр.
option = webdriver.FirefoxOptions() option.set_preference('dom.webdriver.enabled',False) #тот самый параметр driver = webdriver.Firefox(options=option)
Теперь попробуйте запустить бота.

Прогресс. Двигаемся дальше.
Теперь нужно дождаться загрузки предмета на странице. Для этого нам понадобятся ожидания. Для работы с ожиданиями нам потребуются импортировать следующие библиотеки.
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
Далее, перепишите данный код:
driver.get(f'https://tf2.tm/') #заходим на сайт wait = WebDriverWait(driver, 60) # WebDriverWait указывает время ожидания в секундах items_selector = '#applications a.item' # css-селектор элемента который мы ждем wait.until(ec.visibility_of_element_located((By.CSS_SELECTOR,items_selector))) #Здесь мы ждем появления элемента item_selector, если в течении 60 секунд он не появится, произойдет исключение
У WebDriverWait в функции until, указывается тип ожидания. В нашем случае это ec.visibility_of_element_located, ждем появления элемента. Ждать его мы будем 60 секунд (как и указали в WebDriverWait), если за это время элемент не появится, вызовется исключение. Элемент мы ищем с помощью css-селектора (By.CSS_SELECTOR).
Узнать об остальных типах ожидания можно в документации в графе Expected Conditions.
Теперь, соберем названия предметов и его цену, и выведем все это на экран.
items = driver.find_elements(By.CSS_SELECTOR, items_selector) for item in items: price = item.find_element(By.CSS_SELECTOR,'div.imageblock div.price').text name = item.find_element(By.CSS_SELECTOR,'div.name').text print(f': ')
Похожий код я разбирал в предыдущем уроке. В итоге мы получили список цен предметов.

Заключение.
Теперь мы можем парсить любые сайты, где для доступа к информации не требуется авторизация. И это проблема, о сохранении куки браузера и последующей его загрузке, мы поговорим на следующем уроке.
Исходный код.
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec from selenium.webdriver.firefox.firefox_binary import FirefoxBinary def get_webdriver(): option = webdriver.FirefoxOptions() # option.set_preference('dom.webdriver.enabled',False) binary = FirefoxBinary('C:/Program Files/Mozilla Firefox/firefox.exe') driver = webdriver.Firefox(options=option, firefox_binary=binary) return driver driver = get_webdriver() driver.get(f'https://tf2.tm/') wait = WebDriverWait(driver, 60) items_selector = '#applications a.item' wait.until(ec.visibility_of_element_located((By.CSS_SELECTOR,items_selector))) items = driver.find_elements(By.CSS_SELECTOR, items_selector) for item in items: price = item.find_element(By.CSS_SELECTOR,'div.imageblock div.price').text name = item.find_element(By.CSS_SELECTOR,'div.name').text print(f': ')
Как обойти блокировку Cloudflare?
Cloudflare довольно активно улучшает методы борьбы с такими вот готовыми механизмами, так что любой метод может сломаться в любой момент.
Решения вопроса 0
Ответы на вопрос 2

Dimonchik @dimonchik2013
non progredi est regredi
+ еще несколько техник
Ответ написан более года назад
Этот проект мёртв.

Dimonchik @dimonchik2013
направление поиска, пара рабочих вполне
Lex100500proxy @Lex100500proxy
«+ ещё несколько техник» — каких?

Dimonchik @dimonchik2013

Старый я уже что бы что-то в себе менять
все можно так или иначе подделать или сымитировать но requests не поддерживает javascript и на этом летять все парсеры
если это единичный сервис доступ к которому вам нужен то есть вариант например с selenium
да медленно, да глючно но опять же при правильной постановке вопроса должную автоматизацию вы получите.
если процесс парсинга где-то в середине и есть какие-то клиентские онлайн морды к этому делу то смотрите с торону деанона сервера. механизмы есть но многое зависит от кривизны рук владельцев. например можно деанонить по зеркалам, sub доменам, почтовым headers, на загрузке фалов по ссылке и т.д.
есть комбинированный вариант с определенной задержкой актуальной информации. например, в несколько часов а не по запросу
если таких сервисов для пирсинга много то вышеописанный комбинированный вариант возможен но в геометрической прогрессии возрастает время и повышается глючность механизма в целом
Статья Методы обхода защиты от автоматизированного ПО в браузере Chrome под управлением Selenium в Python
При парсинге данных возникают ситуации, когда нужно получить доступ к сайту с помощью драйвера selenium. Так как на странице сайта в коде выполняются скрипты, которые добавляют в код данные, доступ к которым с помощью обычных запросов получить просто не получиться. Но, все может быть немного печальнее. К примеру, страница может находиться за CDN, такой как Cloudflare, с включенной проверкой браузера. В этом случае обычный драйвер selenium доступ к странице не получит, так как будет определено, что используется автоматизированное тестовое ПО. Но, даже в этих случаях выход есть. Давайте посмотрим, как можно обойти данную проверку с помощью отключения определенных опций в браузере, а также рассмотрим уже модифицированную версию драйвера для Chrome, в которой уже из коробки отключены данные опции. Но, обо всем по порядку.
Для начала, чтобы убедиться, что доступа к сайту у браузера под управлением Chrome все же нет, создадим простой код, который будет загружать драйвер и переходить на защищенную страницу.
Что потребуется?
Для данного кода потребуется установить selenium. Для этого пишем в терминале команду:
pip install selenium
Загрузка сайта с включенными опциями автоматизации
После того, как будет установлена нужная библиотека, импортируем в скрипт нужные модули. А понадобится нам модуль os, для получения пути к драйверу; time, для того, чтобы установить небольшую паузу перед закрытием; platform, для определения операционной системы, чтобы в зависимости от этого подгружать нужный драйвер.
Из библиотеки selenium импортируем webdriver, а также из selenium.webdriver.chrome.service — Service, для передачи драйверу нужных параметров. В частности, в данном коде передается путь к вебдрайверу, а также параметр log_path, в котором можно указать путь для сохранения логов. В данном случае логи сохраняются в null.
import os import time from platform import system from selenium import webdriver from selenium.webdriver.chrome.service import Service exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \ os.path.join(os.getcwd(), 'driver', 'chromedriver') driver = webdriver.Chrome(service=Service(log_path=os.devnull, executable_path=exec_path))
Ну и перейдем на нужную страницу, подождем 10 секунд и закроем браузер.
driver.get('https://nowsecure.nl') time.sleep(10) driver.close() driver.quit()
Страница, на которую переходит браузер, как раз находится под защитой Cloudflare. Доступ получить к сайту не получилось. Нам было предложено подтвердить, что мы люди. То есть, браузер проверку не прошел и было определено автоматизированное ПО.
