Веб-сайт, использующий DataDome, блокирует капчу при парсинге с использованием Selenium и Python
Я на самом деле пытаюсь очистить некоторые автомобильные данные с разных веб-сайтов, я использовал селен с chromebrowser, но некоторые веб-сайты фактически блокируют селен с помощью проверки captcha (пример: https://www.leboncoin.fr/), и это всего за 1 или 2 запроса. Я попытался изменить $_cdc в chromebrowser, но это не устранило проблему, и я использовал эти параметры для chromebrowser
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
options = webdriver.ChromeOptions()
options.add_argument(f'user-agent={user_agent}')
options.add_argument('start-maximized')
options.add_argument('disable-infobars')
options.add_argument('--profile-directory=Default')
options.add_argument("--incognito")
options.add_argument("--disable-plugins-discovery")
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors", "safebrowsing-disable-download-protection", "safebrowsing-disable-auto-update", "disable-client-side-phishing-detection"])
options.add_argument('--disable-extensions')
browser = webdriver.Chrome(chrome_options=options)
browser.delete_all_cookies()
browser.set_window_size(800,800)
browser.set_window_position(0,0)
Веб-сайт, который я пытаюсь очистить, использует DataDome для безопасности ботов, есть подсказка?
5 ответов
Чтобы избежать таких сервисов парсинга, как Datadome, мы должны сначала понять, как они работают, что на самом деле сводится к 3 категориям обнаружения:
- айпи адрес
- Отпечаток Javascript
- Детали запроса
Такие сервисы, как Datadome, используют эти инструменты для расчета рейтинга доверия для каждого посетителя. Низкий балл означает, что вы, вероятно, бот, поэтому вас либо попросят решить капчу, либо полностью откажут в доступе. Итак, как нам получить высокий балл?
IP-адреса/прокси
Что касается IP-адресов, мы хотим распределить нашу нагрузку через прокси, и существует несколько видов IP-адресов:
- Центр обработки данных : адреса, назначенные крупным корпорациям, таким как Google Cloud, AWS и т. д.
Это ужасно влияет на ваш рейтинг ботов , и их следует избегать. - Residential: адреса, присвоенные жилым помещениям.
Это отлично подходит для вашего бота. - Мобильный : адреса, присвоенные вышкам сотовой связи.
Они так же хороши, как жилые, а иногда даже лучше.
Таким образом, чтобы поддерживать высокий показатель доверия, наш парсер должен вращаться через пул резидентных или мобильных прокси.
Отпечаток Javascript
Эта тема слишком велика для вопроса StackOverflow, но давайте сделаем краткий обзор.
Веб-сайты могут использовать Javascript для отпечатка подключающегося клиента (скребка), поскольку javascript пропускает огромное количество данных о клиенте: операционная система, поддерживаемые шрифты, возможности визуального рендеринга и т. д.
Так, например: если Datadome видит группу клиентов Linux, подключающихся через окна 1280x720, то он может просто сделать вывод, что такая установка, вероятно, является ботом, и дает всем, у кого есть эти данные отпечатков пальцев, низкие оценки доверия.
Если вы используете Selenium для обхода Datadome, вам нужно исправить многие из этих дыр, чтобы выйти из зоны низкого доверия. Это можно сделать, исправив сам браузер, чтобы подделать детали отпечатков пальцев, такие как операционная система и т. Д.
Подробнее об этом читайте в моем блоге Как избежать блокировки веб-скрейпинга: Javascript
Детали запроса
Наконец, даже если у нас есть множество IP-адресов и мы исправим наш браузер от утечки ключевых данных об отпечатках пальцев, Datadome все равно может дать нам низкие оценки доверия, если наши схемы подключения необычны.
Чтобы обойти это, наш парсер должен очищать неочевидные шаблоны. Он должен время от времени подключаться к нецелевым страницам, таким как домашняя страница веб-сайта, чтобы выглядеть более похожим на человека.
Теперь, когда мы понимаем, как обнаруживается наш парсер, мы можем приступить к изучению того, как это обойти. Selenium имеет большое сообщество, и ключевое слово здесь — «стелс». Например, selenium-stealth (и его ответвления) — хорошая отправная точка для устранения утечек отпечатков пальцев Selenium.
К сожалению, эта область очистки не очень прозрачна, поскольку Datadome может просто собирать общеизвестные исправления и соответствующим образом корректировать свои услуги. Это означает, что вам нужно разобраться во многих вещах самостоятельно или использовать API веб-скрейпинга, чтобы сделать это, чтобы вы могли очищать защищенные веб-сайты после первых нескольких запросов.
Я вписал в этот ответ все, что мог, поэтому для получения дополнительной информации см. мою серию статей в блоге по этому вопросу. Как очищать, не будучи заблокированным.
Более подробная информация о вашем сценарии использования сбора данных об автомобилях с разных веб-сайтов или https://www.leboncoin.fr/ помогла бы нам составить более канонический ответ. Однако я смог получить доступ к источнику страницы с помощью Selenium следующим образом:
Блок кода:
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument("start-maximized") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe') driver.get('https://www.leboncoin.fr/') print(driver.page_source)
Консольный вывод:
<html class="gServer"><head><link rel="preconnect" href="//fonts.googleapis.com" crossorigin=""><link rel="preload" href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap" crossorigin="" as="style"><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap" crossorigin=""><style data-emotion-css=""></style><meta charset="utf-8"><link rel="manifest" href="/manifest.json"><link type="application/opensearchdescription+xml" rel="search" href="/opensearch.xml"><meta name="theme-color" content="#ff6e14"><meta property="og:locale" content="fr_FR"><meta property="og:site_name" content="leboncoin"><meta name="twitter:site" content="leboncoin"><meta http-equiv="P3P" content="CP="This is not a P3P policy""><meta name="viewport" content="initial-scale=1.0, width=device-width, maximum-scale=1.0, user-scalable=0"><script type="text/javascript" async="" src="https://www.googleadservices.com/pagead/conversion_async.js"></script><script type="text/javascript" async="" src="https://tp.realytics.io/sync/se/cnktbDNiMG5jb3xyeV83NTFGRUQwMy1CMDdGLTRBQTgtOTAxRi1DNUREMDVGRjkxQTJ8?ct=1&rt=1&u=https%3A%2F%2Fwww.leboncoin.fr%2F&r=&ts=1591306049397"></script><script type="text/javascript" async="" src="https://www.googleadservices.com/pagead/conversion_async.js"></script><script type="text/javascript" async="" src="https://www.googleadservices.com/pagead/conversion_async.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=AW-766292687&l=dataLayer&cx=c"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=AW-667462656&l=dataLayer&cx=c"></script><script type="text/javascript" async="" src="https://cdn-eu.realytics.net/realytics-1.2.min.js"></script><script type="text/javascript" async="" src="https://i.realytics.io/tc.js?cb=1591306047755"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=DC-4167650&l=dataLayer&cx=c"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=AW-744431185&l=dataLayer&cx=c"></script><script type="text/javascript" async="" charset="utf-8" src="//www.googleadservices.com/pagead/conversion_async.js" id="utag_82"></script><script type="text/javascript" async="" charset="utf-8" src="//sdk.mpianalytics.com/pulse.min.js" id="utag_47"></script><script async="true" type="text/javascript" src="https://sslwidget.criteo.com/event?a=50103&v=5.5.0&p0=e%3Dexd%26site_type%3Dd&p1=e%3Dvh&p2=e%3Ddis&adce=1&tld=leboncoin.fr&dtycbr=6569" data-owner="criteo-tag"></script><script type="text/javascript" src="//try.abtasty.com/09643a1c5bc909059579da8aac99e8f1.js"></script><script>window.dataLayer = window.dataLayer || []; . . . <iframe height="1" width="1" style="display:none" src="//4167650.fls.doubleclick.net/activityi;src=4167650;type=slbc01;cat=all-site;u1=homepage;ord=9979622847645.51?" id="utag_179_iframe"></iframe></body></html>
Однако из дерева DOM совершенно очевидно, что веб-сайт защищен от плохих ботов через DataDome, как в:
DataDome
Ключевые особенности заключаются в следующем:
- DataDome - единственное решение для защиты от ботов, предоставляемое как услуга.
- DataDome не требует изменений архитектуры или перенаправления DNS.
- Механизм обнаружения ботов DataDome сравнивает каждый запрос к веб-сайту с массивной базой данных шаблонов в памяти и использует сочетание искусственного интеллекта и машинного обучения, чтобы менее чем за 2 миллисекунды решить, следует ли предоставлять доступ к вашим страницам или нет.
- DataDome обнаруживает и идентифицирует 100% автоматических угроз OWASP.
- Функция Custom Rules DataDome может даже позволить вам блокировать человеческий трафик из стран, в которые вы не продаете, или разрешать партнерским ботам доступ к вашему сайту только в определенных обстоятельствах.
Outro
Документацию по DataDoe можно найти по адресу:
Я работаю в индустрии парсинга веб-страниц уже много лет, и мой опыт работы с Datadome на данный момент подсказывает следующее.
- Используйте более развитую библиотеку автоматизации, такую как Playwright, для очистки веб-сайтов, защищенных Datadome.
- Используйте удобный браузер (но не Chrome). В комплект Playwright входит также Firefox, я пробовал еще Brave Browser, и он работает.
- Если у вас есть некоторый бюджет, вы можете рассмотреть также платные решения, такие как Zyte API или Bright Data Web Unlocker. Они оба хорошо работают против Datadome.
Недавно я протестировал эти решения, они работают на другом веб-сайте, защищенном Datadome, и результаты могут отличаться в каждом конкретном случае. Пример парсера с Playwright и Firefox:
Это могло произойти по множеству причин. Попробуйте найти здесь ответ, который поможет вам предотвратить эту проблему.
Простое решение, которое иногда помогало мне, - использовать Waits
/Sleep
звонки в селен, см. здесь из документов о Waits. Или звонки в сон можно сделать так
Import time
time.sleep(2)
В чем проблема с капчей? Вы можете решить эту проблему с помощью дешевого сервиса, такого как Anti Captcha или других. Вот пример с NodeJS:https://github.com/MoterHaker/bypass-captcha-examples/blob/main/geo.captcha-delivery.com.js