В этом руководстве вы узнаете:
- Что такое Pydoll и какие возможности он предоставляет
- Как использовать его для поиска веб-сайтов с поддержкой JavaScript
- Как обойти защиту Cloudflare
- Его самые большие ограничения
- Как преодолеть эти ограничения с помощью интеграции вращающегося прокси-сервера
- Лучшие альтернативы Pydoll на основе Python
Давайте погрузимся!
Знакомство с Pydoll
Узнайте, что такое Pydoll, как он работает и что он предлагает в качестве библиотеки для веб-скрапинга на Python.
Что это такое
Pydoll – это библиотека автоматизации браузера на Python, созданная для веб-скреппинга, тестирования и автоматизации повторяющихся задач. Ее отличает то, что она устраняет необходимость в традиционных веб-драйверах. Она напрямую подключается к браузерам через протокол DevTools – никаких внешних зависимостей не требуется.
Первый стабильный релиз Pydoll, версия 1.0, вышел в феврале 2025 года. Это делает его относительно новым игроком в сфере веб-скреппинга. Несмотря на это, он уже успел завоевать большую популярность, получив более 3 000 звезд на GitHub:
Как вы уже поняли, библиотека набирает популярность в сообществе веб-скрапперов на Python.
Характеристики
Вот краткое описание основных функций, предлагаемых Pydoll:
- Ноль веб-драйверов: Устраняет зависимость от драйверов браузеров, уменьшая проблемы несоответствия версий и упрощая настройку автоматизации на базе Chromium.
- Асинхронная архитектура: Полностью построена на asyncio для обеспечения высокого параллелизма, эффективного использования памяти и современных паттернов разработки на Python.
- Человекоподобное взаимодействие: Имитирует реалистичный ввод текста, движения мыши и нажатия, чтобы снизить вероятность обнаружения ботов при автоматизации.
- Возможности управления событиями: Позволяет реагировать на события браузера, DOM, сети и жизненного цикла в режиме реального времени для автоматизации реагирования.
- Поддержка нескольких браузеров: Совместимость с Chrome, Edge и другими браузерами Chromium, использующими один и тот же унифицированный интерфейс.
- Снимки экрана и экспорт в PDF: Снимайте полные страницы, отдельные элементы или создавайте высококачественные PDF-файлы с любой загруженной веб-страницы.
- Встроенный обход Cloudflare: Автоматически обходит антибот Cloudflare без сторонних сервисов, имитируя доверенные сессии браузера при высокой репутации IP-адреса.
- Параллельное соскабливание: Параллельное соскабливание нескольких страниц или веб-сайтов, что значительно сокращает общее время выполнения.
- Расширенное управление клавиатурой: Имитация реального ввода текста пользователем с точным контролем времени, модификаторов и специальных клавиш.
- Мощная система событий: Обеспечивает мониторинг и обработку сетевых запросов, загрузки страниц и пользовательских событий браузера в режиме реального времени.
- Поддержка загрузки файлов: Автоматизирует загрузку файлов, используя как прямой ввод, так и интерактивные диалоги выбора файлов.
- Интеграция с прокси: Поддерживает использование прокси для ротации IP-адресов, геотаргетинга или обхода ограничений скорости при скраппинге.
- Перехват запросов: Перехватывайте, изменяйте или блокируйте HTTP-запросы и ответы для расширенной автоматизации и управления скраппингом.
Узнайте больше в официальной документации.
Использование Pydoll для веб-скрапинга: Полное руководство
В этом учебном разделе вы узнаете, как использовать Pydoll для соскабливания данных из асинхронной версии “Quotes to Scrape“, работающей на JavaScript:
Эта страница динамически отображает элементы цитаты с помощью JavaScript после небольшой задержки. Таким образом, традиционные инструменты для скраппинга не будут работать из коробки. Чтобы извлечь содержимое этой страницы, вам понадобится инструмент автоматизации браузера, такой как Pydoll.
Выполните следующие шаги, чтобы создать веб-скрепер Pydoll, который динамически извлекает данные о цитатах из “Quotes to Scrape”.
Шаг №1: Настройка проекта
Прежде чем приступить к работе, убедитесь, что на вашем компьютере установлен Python 3+. В противном случае загрузите его и следуйте инструкциям по установке.
Затем выполните следующую команду, чтобы создать папку для проекта скрапбукинга:
mkdir pydoll-scraper
В качестве папки проекта будет использоваться каталог pydoll-scraper
.
Перейдите в папку в терминале и инициализируйте в ней виртуальную среду Python:
cd pydoll-scraper
python -m venv venv
Загрузите папку с проектом в вашу любимую Python IDE. Подойдет Visual Studio Code с расширением Python или PyCharm Community Edition.
Создайте файл scraper.py
в папке проекта, который теперь должен содержать:
На данный момент scraper.py
– это просто пустой Python-скрипт. Однако вскоре он будет содержать логику разбора данных.
Затем активируйте виртуальную среду в терминале вашей IDE. В Linux или macOS выполните команду:
source venv/bin/activate
Аналогично, в Windows запустите:
venv/Scripts/activate
Замечательно! Ваша среда Python теперь настроена для веб-скрапинга с помощью Pydoll.
Шаг #2: Настройка Pydoll
В активированной виртуальной среде установите Pydoll с помощью пакета pydoll-python
:
pip install pydoll-python
Теперь добавьте приведенную ниже логику в файл scraper.py
, чтобы начать работу с Pydoll:
import asyncio
from pydoll.browser.chrome import Chrome
async def main():
async with Chrome() as browser:
# Launch the Chrome browser and open a new page
await browser.start()
page = await browser.get_page()
# scraping logic...
# Execute the async scraping function
asyncio.run(main())
Обратите внимание, что Pydoll предоставляет асинхронный API для веб-скрапинга и требует использования стандартной библиотеки Python asyncio
.
Отлично! Теперь у вас есть базовый скрипт Pydoll.
Шаг № 3: Подключение к целевому сайту
Вызовите метод go_to()
, предоставленный объектом страницы
, для перехода на целевой сайт:
await page.go_to("https://quotes.toscrape.com/js-delayed/?delay=2000")
Параметр запроса ?delay=2000
указывает странице на динамическую загрузку нужных данных после 2-секундной задержки. Это особенность целевого сайта-песочницы, созданного для тестирования динамического поведения скраппера.
Теперь попробуйте запустить вышеуказанный скрипт. Если все работает правильно, Pydoll запустится:
- Запустите экземпляр Chrome
- Перейдите на целевой сайт
- Закройте окно браузера немедленно, поскольку в скрипте пока нет никакой дополнительной логики.
В частности, вот что вы должны увидеть до того, как он будет закрыт:
Отлично! Вы готовы добавить логику ожидания.
Шаг #4: Дождитесь появления HTML-элементов
Взгляните на последнее изображение из предыдущего шага. Оно представляет собой содержимое страницы, управляемой Pydoll в экземпляре Chrome. Вы заметите, что она полностью пуста – никакие данные не были загружены.
Причина в том, что целевой сайт динамически отображает данные с 2-секундной задержкой. Эта задержка характерна только для данного сайта. Тем не менее, необходимость ждать, пока страница отрендерится, является распространенным сценарием при скраппинге SPA (одностраничных приложений) и других динамических сайтов, которые полагаются на AJAX.
Узнайте больше в нашей статье о создании динамических веб-сайтов с помощью Python.
Чтобы справиться с этим распространенным сценарием, Pydoll предоставляет встроенные механизмы ожидания с помощью этого метода:
wait_element()
: Ожидает появления одного элемента (с поддержкой таймаута)
Вышеописанный метод поддерживает CSS-селекторы, выражения XPath и многое другое – аналогично тому, как работает объект By
в Selenium.
Настало время познакомиться с HTML целевой страницы. Итак, откройте ее в браузере, подождите, пока загрузятся кавычки, щелкните правой кнопкой мыши одну из кавычек и выберите опцию “Инспектировать”:
На панели DevTools вы увидите, что каждая цитата обернута в
quote
. Это означает, что их можно выделить с помощью селектора CSS:
.quote
Теперь с помощью Pydoll дождитесь появления этих элементов, прежде чем продолжить:
await page.wait_element(By.CSS_SELECTOR, ".quote", timeout=3)
Не забудьте импортировать By
:
from pydoll.constants import By
Выполните скрипт еще раз, и на этот раз вы увидите, что Pydoll ждет, пока загрузятся элементы цитаты, прежде чем закрыть браузер. Отличная работа!
Шаг #5: Подготовка к веб-скрапингу
Помните, что целевая страница содержит не только одну цитату. Так как вы хотите соскрести их все, вам нужна структура данных для хранения этих данных. Простой массив отлично работает, так что инициализируйте его:
quotes = []
Чтобы найти элементы на странице, Pydoll предоставляет два удобных метода:
find_element()
: Находит первый подходящий элементfind_elements()
: Находит все совпадающие элементы
Как и в случае с wait_element()
, эти методы принимают селектор, используя объект By
.
Итак, выделите все элементы цитаты на странице с помощью:
quote_elements = await page.find_elements(By.CSS_SELECTOR, ".quote")
Далее пройдитесь по элементам и приготовьтесь применить логику скраппинга:
for quote_element in quote_elements:
# Scraping logic...
Потрясающе! Пора приступить к логике извлечения данных.
Шаг #6: Реализация логики разбора данных
Начните с осмотра одного элемента цитаты:
Как видно из приведенного выше HTML, один элемент цитаты содержит:
- Текстовая цитата в узле
.text
- Автор в элементе
.author
- Список тегов в элементах
.tag
Реализуйте логику скраппинга, чтобы выбрать эти элементы и извлечь из них интересующие вас данные:
# Extract the quote text (and remove curly quotes)
text_element = await quote_element.find_element(By.CSS_SELECTOR, ".text")
text = (await text_element.get_element_text()).replace("“", "").replace("”", "")
# Extract the author name
author_element = await quote_element.find_element(By.CSS_SELECTOR, ".author")
author = await author_element.get_element_text()
# Extract all associated tags
tag_elements = await quote_element.find_elements(By.CSS_SELECTOR, ".tag")
tags = [await tag_element.get_element_text() for tag_element in tag_elements]
Примечание: Метод replace()
удаляет ненужные фигурные двойные кавычки из извлеченного текста кавычек.
Теперь используйте полученные данные для создания нового объекта словаря и добавьте его в массив котировок
:
# Populate a new quote with the scraped data
quote = {
"text": text,
"author": author,
"tags": tags
}
# Append the extracted quote to the list
quotes.append(quote)
Отлично! Осталось только экспортировать собранные данные в CSV.
Шаг #7: Экспорт в CSV
В настоящее время отсканированные данные хранятся в списке Python. Экспортируйте их в человекочитаемый формат, например CSV, чтобы ими было удобнее делиться и изучать с другими.
С помощью Python создайте новый файл quotes.csv
и заполните его полученными данными:
with open("quotes.csv", "w", newline="", encoding="utf-8") as csvfile:
# Add the header
fieldnames = ["text", "author", "tags"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# Populate the output file with the scraped data
writer.writeheader()
for quote in quotes:
writer.writerow(quote)
Не забудьте импортировать csv
из стандартной библиотеки Python:
import csv
Миссия выполнена! Ваш скребок Pydoll готов к выполнению.
Шаг № 8: Соберите все вместе
Теперь файл scraper.py
должен содержать:
import asyncio
from pydoll.browser.chrome import Chrome
from pydoll.constants import By
import csv
async def main():
async with Chrome() as browser:
# Launch the Chrome browser and open a new page
await browser.start()
page = await browser.get_page()
# Navigate to the target page
await page.go_to("https://quotes.toscrape.com/js-delayed/?delay=2000")
# Wait up to 3 seconds for the quote elements to appear
await page.wait_element(By.CSS_SELECTOR, ".quote", timeout=3)
# Where to store the scraped data
quotes = []
# Select all quote elements
quote_elements = await page.find_elements(By.CSS_SELECTOR, ".quote")
# Iterate over them and scrape data from them
for quote_element in quote_elements:
# Extract the quote text (and remove curly quotes)
text_element = await quote_element.find_element(By.CSS_SELECTOR, ".text")
text = (await text_element.get_element_text()).replace("“", "").replace("”", "")
# Extract the author
author_element = await quote_element.find_element(By.CSS_SELECTOR, ".author")
author = await author_element.get_element_text()
# Extract all tags
tag_elements = await quote_element.find_elements(By.CSS_SELECTOR, ".tag")
tags = [await tag_element.get_element_text() for tag_element in tag_elements]
# Populate a new quote with the scraped data
quote = {
"text": text,
"author": author,
"tags": tags
}
# Append the extracted quote to the list
quotes.append(quote)
# Export the scraped data to CSV
with open("quotes.csv", "w", newline="", encoding="utf-8") as csvfile:
# Add the header
fieldnames = ["text", "author", "tags"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# Populate the output file with the scraped data
writer.writeheader()
for quote in quotes:
writer.writerow(quote)
# Execute the async scraping function
asyncio.run(main())
Вот это да! Менее чем за 60 строк кода вы можете создать бота для веб-скреппинга с помощью Pydoll.
Проверьте работу приведенного выше сценария, запустив его:
python scraper.py
По окончании выполнения в папке проекта появится файл quotes.csv
. Откройте его, и вы увидите аккуратно упорядоченные данные:
И вуаля! Ваш скрипт веб-скрапинга Pydoll работает как надо.
Обход Cloudflare с помощью Pydoll
При взаимодействии с сайтом в инструменте автоматизации браузера одна из самых больших проблем, с которой вы столкнетесь, – это брандмауэры веб-приложений (WAF). Подумайте о таких решениях, как Cloudflare, которые обычно поставляются с расширенной защитой от ботов.
Если есть подозрение, что ваш запрос исходит от автоматического браузера, такие системы обычно показывают капчу. В некоторых случаях они показывают его всем пользователям при первом посещении сайта.
Обойти CAPTCHA в Python не так-то просто. Однако есть способы обмануть Cloudflare, заставив его думать, что вы реальный пользователь, чтобы он не показывал CAPTCHA в первую очередь. Здесь на помощь приходит Pydoll, предоставляющий специальный API для этой цели.
Чтобы продемонстрировать, как это работает, мы воспользуемся тестовой страницей “Antibot Challenge” с сайта ScrapingCourse:
Как видите, страница всегда выполняет Cloudflare JavaScript Challenge. После обхода она отображает образец содержимого, чтобы подтвердить, что защита от ботов была побеждена.
Pydoll предлагает два подхода к работе с Cloudflare:
- Подход контекстного менеджера: Обрабатывает вызов антибота синхронно, приостанавливая выполнение сценария до тех пор, пока вызов не будет решен.
- Подход к фоновой обработке: Работает с анти-ботом асинхронно в фоновом режиме.
Мы рассмотрим оба метода. Однако, как сказано в официальной документации, имейте в виду, что обход Cloudflare может сработать не всегда. Это связано с такими проблемами, как репутация IP-адреса или история навигации.
Чтобы узнать о более продвинутых методах, прочтите наше полное руководство по соскабливанию сайтов, защищенных Cloudflare.
Подход контекстного менеджера
Чтобы автоматически позволить Pydoll справиться с вызовом антибота Cloudflare, используйте метод expect_and_bypass_cloudflare_captcha()
следующим образом:
import asyncio
from pydoll.browser.chrome import Chrome
from pydoll.constants import By
async def main():
async with Chrome() as browser:
# Launch the Chrome browser and open a new page
await browser.start()
page = await browser.get_page()
# Wait for the Cloudflare challenge to be executed
async with page.expect_and_bypass_cloudflare_captcha():
# Connect to the Cloudflare-protected page:
await page.go_to("https://www.scrapingcourse.com/antibot-challenge")
print("Waiting for Cloudflare anti-bot to be handled...")
# This code runs only after the anti-bot is successfully bypassed
print("Cloudflare anti-bot bypassed! Continuing with automation...")
# Print the text message on the success page
await page.wait_element(By.CSS_SELECTOR, "#challenge-title", timeout=3)
success_element = await page.find_element(By.CSS_SELECTOR, "#challenge-title")
success_text = await success_element.get_element_text()
print(success_text)
asyncio.run(main())
Когда вы запустите этот скрипт, окно Chrome автоматически обойдет вызов и загрузит целевую страницу.
Выходные данные будут такими:
Waiting for Cloudflare anti-bot to be handled...
Cloudflare anti-bot bypassed! Continuing with automation...
You bypassed the Antibot challenge! :D
Подход к обработке фона
Если вы предпочитаете не блокировать выполнение скрипта, пока Pydoll обрабатывает вызов Cloudflare, вы можете использовать методы enable_auto_solve_cloudflare_captcha()
и disable_auto_solve_cloudflare_captcha()
следующим образом:
import asyncio
from pydoll.browser import Chrome
from pydoll.constants import By
async def main():
async with Chrome() as browser:
# Launch the Chrome browser and open a new page
await browser.start()
page = await browser.get_page()
# Enable automatic captcha solving before navigating
await page.enable_auto_solve_cloudflare_captcha()
# Connect to the Cloudflare-protected page:
await page.go_to("https://www.scrapingcourse.com/antibot-challenge")
print("Page loaded, Cloudflare anti-bot will be handled in the background...")
# Disable anti-bot auto-solving when no longer needed
await page.disable_auto_solve_cloudflare_captcha()
# Print the text message on the success page
await page.wait_element(By.CSS_SELECTOR, "#challenge-title", timeout=3)
success_element = await page.find_element(By.CSS_SELECTOR, "#challenge-title")
success_text = await success_element.get_element_text()
print(success_text)
asyncio.run(main())
Такой подход позволяет вашему скреперу выполнять другие операции, в то время как Pydoll решает проблему антибота Cloudflare в фоновом режиме.
На этот раз вывод будет таким:
Page loaded, Cloudflare anti-bot will be handled in the background...
You bypassed the Antibot challenge! :D
Ограничения данного подхода к веб-скрапингу
Если вы отправляете слишком много запросов, то есть вероятность, что вы будете заблокированы сервером Pydoll или любым другим инструментом для скраппинга. Это происходит потому, что большинство сайтов ограничивают скорость передачи данных, чтобы боты (например, ваш скрипт) не перегружали их серверы запросами.
Это распространенная техника защиты от скаппинга и DDoS. В конце концов, никто не хочет, чтобы его сайт был наводнен автоматическим трафиком.
Даже если вы придерживаетесь лучших практик, таких как соблюдение robots.txt
, выполнение множества запросов с одного IP-адреса все равно может вызвать подозрения. В результате вы можете столкнуться с ошибками 403 Forbidden
или 429 Too Many Requests
.
Лучший способ избежать этого – изменить свой IP-адрес с помощью веб-прокси.
Если вы не знакомы с этим понятием, веб-прокси выступает в роли посредника между вашим скрепером и целевым сайтом. Он пересылает ваши запросы и возвращает ответы, создавая у целевого сайта впечатление, что трафик идет с прокси, а не с вашего компьютера.
Эта техника не только помогает скрыть ваш реальный IP, но и полезна для обхода гео-ограничений и многих других случаев использования.
Сейчас существует несколько типов прокси. Чтобы избежать блокировки, вам нужен качественный провайдер, предлагающий настоящие вращающиеся прокси, например Bright Data.
В следующем разделе вы увидите, как интегрировать вращающиеся прокси Bright Data с Pydoll для более эффективного соскабливания веб-страниц, особенно в масштабе.
Интеграция Pydoll с вращающимися прокси Bright Data
Bright Data контролирует одну из крупнейших прокси-сетей в мире, которой доверяют компании из списка Fortune 500 и более 20 000 клиентов. Ее прокси-сеть включает в себя:
- Прокси для дата-центров – более 770 000 IP-адресов дата-центров.
- Прокси-серверы для жилых помещений – более 150 000 000 IP-адресов в более чем 195 странах.
- Прокси-провайдеры – более 700 000 IP-адресов провайдеров.
- Мобильные прокси – более 7 000 000 мобильных IP-адресов.
Следуйте приведенным ниже инструкциям и узнайте, как использовать прокси-серверы Bright Data для жилых помещений с Pydoll.
Если у вас еще нет учетной записи, зарегистрируйтесь в Bright Data. В противном случае войдите в систему, чтобы получить доступ к панели управления:
На приборной панели нажмите кнопку “Получить прокси-продукты”:
Вы будете перенаправлены на страницу “Прокси и инфраструктура скрапинга”:
В таблице найдите строку “Residential” и щелкните по ней:
Вы попадете на страницу настройки жилого прокси:
Если это ваш первый раз, следуйте указаниям мастера настройки, чтобы сконфигурировать прокси в соответствии с вашими потребностями. За помощью обращайтесь в круглосуточную службу поддержки.
Перейдите на вкладку “Обзор” и найдите хост, порт, имя пользователя и пароль вашего прокси-сервера:
Используйте эти данные для создания URL-адреса прокси-сервера:
proxy_url = "<brightdata_proxy_username>:<brightdata_proxy_password>@<brightdata_proxy_host>:<brightdata_proxy_port>";
Замените местами (,
,
,
) на ваши фактические учетные данные прокси.
Убедитесь, что прокси-продукт активирован, переключив переключатель с “Off” на “On”:
Теперь, когда вы подготовили свой прокси, вот как интегрировать его в Pydoll, используя встроенные возможности настройки прокси:
import asyncio
from pydoll.browser.chrome import Chrome
from pydoll.browser.options import Options
from pydoll.constants import By
import traceback
async def main():
# Create browser options
options = Options()
# The URL of your Bright Data proxy
proxy_url = "<brightdata_proxy_username>:<brightdata_proxy_password>@<brightdata_proxy_host>:<brightdata_proxy_port>" # Replace it with your proxy URL
# Configure the proxy integration option
options.add_argument(f"--proxy-server={proxy_url}")
# To avoid potential SSL errors
options.add_argument("--ignore-certificate-errors")
# Start browser with proxy configuration
async with Chrome(options=options) as browser:
await browser.start()
page = await browser.get_page()
# Visit a special page that returns the IP of the caller
await page.go_to("https://httpbin.io/ip")
# Extract the page content containing only the IP of the incoming
# request and print it
body_element = await page.find_element(By.CSS_SELECTOR, "body")
body_text = await body_element.get_element_text()
print(f"Current IP address: {body_text}")
# Execute the async scraping function
asyncio.run(main())
Каждый раз, когда вы запускаете этот скрипт, вы будете видеть другой IP-адрес выхода, благодаря ротации прокси Bright Data.
Примечание: Обычно флаг Chrome --proxy-server
не поддерживает аутентифицированные прокси-серверы из коробки. Однако продвинутый прокси-менеджер Pydoll отменяет это ограничение, позволяя использовать прокси-серверы, защищенные паролем.
С вращающимися прокси Bright Data ротация прокси Pydoll становится простой, надежной и масштабируемой!
Альтернативы Pydoll для веб-скрапинга
Pydoll – это, несомненно, мощная библиотека для веб-скрапинга, особенно для автоматизации браузеров со встроенными функциями обхода ботов. Тем не менее, это не единственный инструмент в игре.
Ниже представлены несколько надежных альтернатив Pydoll, которые стоит рассмотреть:
- SeleniumBase: Python-фреймворк, построенный на основе API Selenium/WebDriver и предлагающий набор инструментов профессионального уровня для автоматизации веб-процессов. Он поддерживает все: от сквозного тестирования до продвинутых рабочих процессов скрапинга.
- Необнаруженный ChromeDriver: Исправленная версия ChromeDriver, предназначенная для обхода обнаружения популярными антибот-сервисами, такими как Imperva, DataDome и Distil Networks. Идеально подходит для скрытого скраппинга при использовании Selenium.
Если вы ищете более универсальное решение для веб-скреппинга, которое работает на любом сайте и поддерживает несколько языков программирования, обратите внимание на наши услуги по скреппингу:
- Браузер для скрапинга: Браузер, совместимый с Selenium-, Playwright-, Puppeteer, со встроенными возможностями разблокировки.
- API для веб-скреперов: Предварительно настроенные API для извлечения структурированных данных из 100+ основных доменов.
- Web Unlocker: Универсальный API, позволяющий разблокировать сайты с защитой от ботов.
- SERP API: Специализированный API, который открывает результаты поисковых систем и извлекает полные данные SERP.
Заключение
В этом уроке по интеграции прокси вы узнали, что такое Pydoll и как он работает. Мы рассмотрели, как использовать его для веб-скрапинга на сайте с JavaScript, и увидели, как устранить его основное
ограничение с помощью интеграции прокси.
Вы также поняли, почему использование Pydoll без механизма ротации IP-адресов может привести к ненадежным результатам. Для стабильной работы, повышенной безопасности и масштабируемости необходимо выбрать надежного прокси-провайдера. Сэкономьте время и силы, обратившись к лучшему прокси-провайдеру на рынке– Bright Data.
Создайте аккаунт и начните тестировать наши прокси бесплатно уже сегодня!
Кредитная карта не требуется