Эта статья посвящена использованию прокси для веб-скрейпинга, что является важным шагом для серьезного скейлинга ваших скрейперов. Работая со скрейперами локально с вашего ноутбука или домашнего компьютера, вы скоро столкнетесь с ограничениями и проблемами, такими как блокировка по IP или лимиты скорости запросов. Прокси и облачные сервисы для скрейпинга могут помочь обойти эти проблемы.
Преимущества использования прокси
- Обход блокировок по IP: Многие веб-сайты блокируют IP-адреса, которые отправляют слишком много запросов. Использование прокси позволяет вам менять IP-адреса, с которых делаются запросы, что помогает избежать блокировки.
- Сокрытие вашего настоящего IP-адреса: Это полезно для защиты вашей приватности и анонимности.
- Параллельный скрейпинг: Используя множество прокси, вы можете параллельно скрейпить данные с разных IP-адресов, что значительно ускоряет процесс.
- Доступ к географически ограниченному контенту: Некоторые веб-сайты предоставляют разный контент в зависимости от страны пользователя. Прокси с IP-адресами из нужной страны могут обойти эти ограничения.
Как настроить и использовать прокси
1. Использование локальных или общедоступных прокси
Простой способ начать использовать прокси — это настроить их в вашем скрейпере. Python requests
поддерживает прокси прямо из коробки:
import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080'
}
response = requests.get('http://example.com', proxies=proxies)
print(response.text)
2. Использование прокси с аутентификацией
Если прокси требует аутентификации, вы можете передать свои учетные данные так:
proxies = {
'http': 'http://user:password@10.10.1.10:3128',
'https': 'http://user:password@10.10.1.10:1080'
}
response = requests.get('http://example.com', proxies=proxies)
print(response.text)
3. Использование прокси-сервисов для веб-скрейпинга
Существует множество сервисов, таких как ScraperAPI, ScrapingBee, Zyte Smart Proxy Manager (ранее Crawlera), которые предоставляют API для скрейпинга через прокси. Эти сервисы управляют прокси-серверами, автоматически обходят капчи и JavaScript-рендеринг, предоставляя вам чистые данные.
Пример использования ScraperAPI:
import requests
api_key = 'your_scraperapi_key'
url = 'http://example.com'
proxy_url = f'http://api.scraperapi.com?api_key={api_key}&url={url}'
response = requests.get(proxy_url)
print(response.text)
Масштабирование и управление прокси
Для серьезного скейлинга скрейпинга стоит рассмотреть динамическое управление пулом прокси:
- Ротация прокси: Регулярно меняйте прокси, чтобы избежать блокировок и ограничений.
- Автоматическое отключение неработающих прокси: Если прокси перестает отвечать или возвращает ошибки, автоматически замените его на другой.
- Балансировка нагрузки: Распределите запросы равномерно между прокси, чтобы избежать перегрузки отдельных серверов.
Заключение
Использование прокси в веб-скрейпинге — это мощный способ увеличить эффективность и объем собираемых данных, а также снизить риск блокировки и других ограничений со стороны целевых веб-сайтов. Подходя к этому инструменту с умом и планированием, вы можете значительно улучшить результаты своих скрейпинг-проектов.
Зачем использовать удаленные серверы?
Хотя использование удаленного сервера может показаться очевидным шагом при запуске веб-приложения, предназначенного для широкой аудитории, программисты часто оставляют инструменты, созданные для своих нужд, работающими на локальных машинах. Если нет особой необходимости переносить программу на другой сервер, зачем что-то менять? Обычно существует две основные причины для переноса приложения на удаленный сервер:
- Необходимость в другом IP-адресе: иногда ваш IP-адрес может быть заблокирован или есть риск его блокировки. В таких случаях использование удаленного сервера с другим IP-адресом помогает решить эту проблему.
- Необходимость в большей мощности и гибкости: если ваше приложение требует больше ресурсов, чем может предоставить локальный компьютер, или вам нужны специальные настройки и возможности, которые недоступны локально, удаленный сервер может стать идеальным решением. Он предоставляет дополнительную мощность, память, пропускную способность и гибкость в настройке окружения.
Использование удаленных серверов также помогает сделать ваше приложение более доступным для пользователей со всего мира и обеспечить более высокую стабильность и безопасность работы.
Избегание блокировки по IP-адресу
При создании веб-скрейперов есть общее правило: почти все можно подделать. Вы можете отправлять электронные письма с адресов, которые вам не принадлежат, автоматизировать данные движения мыши из командной строки или даже шокировать администраторов веб-сайтов, посылая на их сайты трафик от Internet Explorer 9.0.
Однако подделать ваш IP-адрес невозможно. В реальном мире любой может отправить вам письмо с обратным адресом: «Президент, 1600 Пенсильвания авеню, Северо-Запад, Вашингтон, округ Колумбия, 20500». Но если на письме стоит почтовый штемпель из Альбукерке, штат Нью-Мексико, можно быть уверенным, что вы не переписываетесь с Президентом Соединенных Штатов.
Большинство мер против веб-скрейперов направлено на выявление различий между людьми и ботами. Блокировка IP-адресов — это как если бы фермер, вместо использования пестицидов, решил просто сжечь поле. Это крайняя, но эффективная мера для отбрасывания пакетов от проблемных IP-адресов. Однако у этого решения есть свои недостатки:
- Списки доступа по IP-адресам трудно поддерживать. Хотя крупные веб-сайты часто имеют собственные программы, автоматизирующие некоторые аспекты управления этими списками (боты блокируют ботов!), кому-то все равно приходится время от времени проверять их или, по крайней мере, следить за их ростом на предмет проблем.
- Каждый адрес добавляет небольшое количество времени на обработку пакетов, так как сервер должен проверять входящие пакеты на соответствие списку, чтобы решить, разрешать их или нет. Множество адресов, умноженное на множество пакетов, быстро складывается. Чтобы сэкономить время обработки и упростить задачу, администраторы часто группируют эти IP-адреса в блоки и устанавливают правила вроде «все 256 адресов в этом диапазоне заблокированы», если есть несколько тесно сгруппированных нарушителей. Это приводит нас к третьему пункту.
- Блокировка IP-адресов может привести к блокировке «хороших парней». Например, будучи студентом колледжа Олин по инженерным наукам, один студент написал программу, пытаясь манипулировать голосами за контент на тогда популярном сайте http://digg.com. Эта программа была заблокирована, и один заблокированный IP-адрес привел к тому, что целая общежитие не могло получить доступ к сайту. Студент просто перенес свою программу на другой сервер; тем временем Digg потерял посещения многих регулярных пользователей из своей основной целевой аудитории.
Несмотря на свои недостатки, блокировка IP-адресов остается чрезвычайно распространенным методом, с помощью которого администраторы серверов пытаются остановить подозреваемых веб-скрейперов от доступа к серверам. Если IP-адрес заблокирован, единственным реальным решением является скрейпинг с другого IP-адреса. Это можно сделать, переместив скрейпер на новый сервер или маршрутизируя ваш трафик через другой сервер с использованием сервиса, такого как Tor.
Переносимость и расширяемость
Некоторые задачи слишком велики для домашнего компьютера и интернет-соединения. Хотя вы не хотите создавать большую нагрузку на какой-либо один сайт, вы можете собирать данные с широкого круга сайтов, что требует гораздо большего объема интернет-трафика и хранилища, чем может предоставить ваша текущая конфигурация.
К тому же, перенося вычислительно интенсивные процессы на другие мощности, вы освобождаете ресурсы своего домашнего компьютера для более важных задач (кто-нибудь за «World of Warcraft»?). Вам не нужно беспокоиться о поддержании электропитания и интернет-соединения. Вы можете запустить ваше приложение в кафе, сложить свой ноутбук и уйти, зная, что все продолжает безопасно работать. Аналогично, позже вы можете получить доступ к своим собранным данным в любом месте, где есть интернет.
Если ваше приложение требует так много вычислительной мощности, что одного экземпляра высокопроизводительного сервера на Amazon не хватает, вы можете также рассмотреть возможность распределенных вычислений. Это позволяет нескольким машинам работать параллельно для достижения ваших целей. Например, одна машина может анализировать один набор сайтов, а другая — второй набор сайтов, и обе они могут сохранять собранные данные в одной и той же базе данных.
Конечно, как отмечено в предыдущих главах, многие могут воспроизводить то, что делает поисковик Google, но немногие могут воспроизводить масштаб, в котором это делает Google. Распределенные вычисления — это обширная область информатики, выходящая за рамки этой статьи. Однако, научиться запускать ваше приложение на удаленном сервере — это необходимый первый шаг, и вы можете быть удивлены, на что способны компьютеры в наши дни.
Tor (The Onion Router)
Сеть The Onion Router, более известная как Tor, представляет собой сеть из серверов-волонтеров. Она настроена таким образом, чтобы маршрутизировать и перенаправлять трафик через множество уровней (отсюда и название «луковица») различных серверов, чтобы скрыть его источник. Данные шифруются еще до входа в сеть, так что если кто-то перехватывает данные на каком-то сервере, он не сможет узнать содержание сообщения. К тому же, даже если входящие и исходящие сообщения на каком-то одном сервере могут быть скомпрометированы, для расшифровки реальных начальной и конечной точек коммуникации нужно знать детали входящих и исходящих сообщений всех серверов в цепочке — задача, близкая к невозможной.
Tor часто используется правозащитниками и политическими информаторами для общения с журналистами, и значительная часть его финансирования идет от правительства США. Конечно, Tor также широко используется для незаконной деятельности, и поэтому постоянно находится в поле зрения правительственного наблюдения — хотя насколько это наблюдение эффективно, остается неясным.
Tor является важным инструментом для тех, кто стремится сохранить конфиденциальность и анонимность в интернете, особенно в условиях, когда прямая коммуникация может подвергнуть пользователя риску.
Ограничения анонимности Tor
Хотя в этой книге вы используете Tor для изменения вашего IP-адреса, а не для достижения полной анонимности как таковой, стоит уделить время, чтобы обсудить некоторые сильные и слабые стороны Tor в плане анонимизации трафика.
Когда вы используете Tor, можно предположить, что IP-адрес, с которого вы подключаетесь (с точки зрения веб-сервера), не может быть прослежен до вас. Однако любая информация, которую вы делитесь с этим веб-сервером, может раскрыть вашу личность. Например, если вы войдете в свою учетную запись Gmail, а затем совершите компрометирующие поисковые запросы в Google, эти запросы могут быть связаны с вашей личностью.
Кроме того, даже сам факт использования Tor может быть рискованным для вашей анонимности. В декабре 2013 года студент Гарварда попытался избежать сдачи экзаменов, отправив через сеть Tor анонимное письмо с угрозой взрыва. Когда IT-отдел Гарварда проанализировал свои логи, они обнаружили трафик, направленный в сеть Tor, только с одного компьютера, зарегистрированного на известного студента, во время отправки угрозы. Хотя они не могли определить конечный пункт этого трафика (только то, что он был отправлен через Tor), совпадение времени и факт использования одного компьютера были достаточными основаниями для привлечения студента к ответственности.
Использование Tor — это не магический плащ невидимости и не дает вам свободы делать все, что вздумается в интернете. Хотя это полезный инструмент, важно использовать его осторожно, с умом и, конечно, морально.
Установка и запуск Tor являются необходимыми условиями для использования Python с Tor, как вы увидите в следующем разделе. К счастью, установить и начать работать с Tor очень просто. Достаточно перейти на страницу загрузки Tor, скачать, установить, открыть и подключиться. Имейте в виду, что скорость интернета может показаться медленнее при использовании Tor. Будьте терпеливы — ваш трафик может обходить весь мир несколько раз!
PySocks
PySocks — это удивительно простой модуль Python, который может направлять трафик через прокси-серверы и отлично работает в связке с Tor. Вы можете скачать его с официального сайта или использовать любой сторонний менеджер модулей для его установки.
Хотя документации по этому модулю не так много, использовать его довольно просто. Служба Tor должна быть запущена на порту 9150 (это порт по умолчанию) во время выполнения этого кода:
import socks
import socket
from urllib.request import urlopen
# Устанавливаем прокси SOCKS5 для всех сокетов
socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, "localhost", 9150)
socket.socket = socks.socksocket
# Отправляем запрос на веб-сайт, который возвращает наш IP-адрес
print(urlopen('http://icanhazip.com').read())
Веб-сайт http://icanhazip.com
показывает только IP-адрес клиента, подключающегося к серверу, и может быть полезен для тестирования. При запуске этого скрипта должен отображаться IP-адрес, который не является вашим собственным.
Если вы хотите использовать Selenium и ChromeDriver с Tor, вам не нужен PySocks. Просто убедитесь, что Tor запущен, и добавьте опциональный параметр proxy-server
в настройки Chrome, указав, что Selenium должен подключаться по протоколу socks5 на порт 9150:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
# Устанавливаем путь к ChromeDriver
CHROMEDRIVER_PATH = ChromeDriverManager().install()
# Настраиваем опции для Chrome
chrome_options = Options()
chrome_options.add_argument('--headless') # Режим без графического интерфейса
chrome_options.add_argument('--proxy-server=socks5://127.0.0.1:9150') # Указываем прокси
# Создаем экземпляр драйвера
driver = webdriver.Chrome(
service=Service(CHROMEDRIVER_PATH),
options=chrome_options
)
# Переходим на страницу и выводим источник страницы
driver.get('http://icanhazip.com')
print(driver.page_source)
# Закрываем драйвер
driver.close()
Опять же, этот код должен вывести IP-адрес, который не является вашим собственным, а тот, который в данный момент использует запущенный клиент Tor.
Удаленный Хостинг
Хотя полная анонимность теряется, как только вы используете свою кредитную карту, размещение ваших веб-скрейперов на удаленных серверах может существенно улучшить их скорость. Это связано с тем, что вы можете арендовать время на гораздо более мощных машинах, чем те, которые у вас есть, а также потому, что соединение больше не нужно пропускать через слои сети Tor, чтобы достичь своей цели.
Запуск с сервера хостинга веб-сайтов
Если у вас есть личный или корпоративный веб-сайт, скорее всего, у вас уже есть средства для запуска ваших веб-скрейперов с внешнего сервера. Даже на относительно закрытых веб-серверах, где у вас нет доступа к командной строке, возможно запускать скрипты через веб-интерфейс.
Если ваш сайт размещен на сервере Linux, скорее всего, на сервере уже установлен Python. Если вы используете сервер Windows, у вас могут быть проблемы; вам нужно будет проверить, установлен ли Python, или готов ли администратор сервера его установить.
Большинство небольших веб-хостингов поставляются с программным обеспечением под названием cPanel, которое используется для предоставления базовых административных услуг и информации о вашем сайте и связанных с ним услугах. Если у вас есть доступ к cPanel, вы можете убедиться, что Python настроен для работы на вашем сервере, перейдя в «Apache Handlers» и добавив новый обработчик (если он еще не присутствует):
- Handler:
cgi-script
- Extension(s):
.py
Это сообщает вашему серверу, что все скрипты Python должны выполняться как CGI-скрипты. CGI, что означает Common Gateway Interface, — это любая программа, которая может быть запущена на сервере и динамически генерировать контент, отображаемый на веб-сайте. Явно определяя скрипты Python как CGI-скрипты, вы даете серверу разрешение их выполнять, а не просто отображать их в браузере или отправлять пользователю на скачивание.
Напишите свой скрипт Python, загрузите его на сервер и установите права доступа к файлу 755, чтобы разрешить его выполнение. Чтобы выполнить скрипт, перейдите в место, куда вы его загрузили, через ваш браузер (или, что еще лучше, напишите скрейпер, который сделает это за вас). Если вы беспокоитесь о том, что общественность получит доступ и выполнит скрипт, у вас есть два варианта:
- Храните скрипт по неявной или скрытой URL-адресу и убедитесь, что никогда не ссылаетесь на скрипт с любого другого доступного URL, чтобы избежать индексации поисковыми системами.
- Защитите скрипт паролем или требуйте, чтобы перед его выполнением был отправлен пароль или секретный токен.
Конечно, запуск скрипта Python из сервиса, который специально предназначен для отображения веб-сайтов, является некоторым костылем. Например, вы, вероятно, заметите, что ваш веб-скрейпер-сайт загружается немного медленно. Фактически, страница не загружается (с выводом всех операторов print
, которые вы могли написать) до тех пор, пока скрейпинг полностью не завершится. Это может занять минуты, часы или вообще никогда не завершиться, в зависимости от того, как он написан. Хотя это определенно работает, возможно, вы захотите более реального времени вывода. Для этого вам понадобится сервер, предназначенный для большего, чем просто веб.
Запуск в облаке
В старые добрые времена в области вычислительной техники программисты платили за время или резервировали время на компьютерах для выполнения своего кода. С появлением персональных компьютеров это стало ненужным — вы просто пишете и выполняете код на своем собственном компьютере. Теперь программисты снова переходят к модели вычислений с оплатой по часам. Однако на этот раз пользователи не платят за время на одной физической машине, а за эквивалентную вычислительную мощность, часто распределенную между многими машинами. Туманная структура этой системы позволяет «ценообразовать» вычислительную мощность в зависимости от пикового спроса. Например, Amazon позволяет делать ставки на «спотовые экземпляры» (spot instances), когда низкая стоимость важнее немедленности.
Вычислительные экземпляры также более специализированы и могут быть выбраны в зависимости от потребностей вашего приложения, с опциями, такими как «высокая память», «быстрые вычисления» и «большое хранилище». Хотя веб-скрейперы обычно не используют много памяти, вы можете рассмотреть возможность выбора экземпляра с большим хранилищем или быстрыми вычислениями вместо экземпляра более общего назначения для вашего скрейпинга. Если вы занимаетесь большим объемом обработки естественного языка, работой с OCR или поиском путей (например, с проблемой шести степеней отделения Википедии), быстрый вычислительный экземпляр может работать хорошо. Если вы скрейпите большие объемы данных, храните файлы или занимаетесь масштабной аналитикой, вам может понадобиться экземпляр с оптимизацией хранения.
Хотя пределы расходов заоблачные, на момент написания этого текста, экземпляры начинаются всего с 0.9 цента в час за самый дешевый экземпляр Google, f1-micro, и 0.8 цента в час за сопоставимый микро-экземпляр Amazon EC2. Благодаря экономии за счет масштаба, покупка небольшого вычислительного экземпляра у крупной компании почти всегда дешевле, чем покупка собственной физической выделенной машины. Потому что теперь вам не нужно нанимать IT-специалиста, чтобы он поддерживал его работу.
Конечно, пошаговые инструкции по настройке и запуску экземпляров облачных вычислений немного выходят за рамки этой книги, но вы, вероятно, обнаружите, что пошаговые инструкции не нужны. Как Amazon, так и Google (не говоря уже о бесчисленных меньших компаниях в этой отрасли), соперничающих за доллары облачных вычислений, сделали настройку новых экземпляров такой же простой, как следование простому приглашению, придумывание названия приложения и предоставление номера кредитной карты. На момент написания этого текста как Amazon, так и Google также предлагают сотни долларов стоимости бесплатных часов вычислений, чтобы дополнительно привлечь новых клиентов.
Если вы новичок в облачных вычислениях, DigitalOcean также является отличным провайдером вычислительных экземпляров (которые они называют каплями, droplets), начиная с 0.6 цента в час. У них невероятно простой пользовательский интерфейс, и они просто отправляют вам по электронной почте IP-адрес и учетные данные для любой новой капли, которую они создают, чтобы вы могли войти и начать работу. Хотя они больше специализируются на хостинге веб-приложений, управлении DNS и балансировке нагрузки, вы можете запускать все, что хотите, с вашего экземпляра!
После настройки экземпляра вы должны стать гордым новым владельцем IP-адреса, имени пользователя и публичных/личных ключей, которые можно использовать для подключения к вашему экземпляру через SSH. Оттуда все должно быть так же, как и при работе с сервером, который вы физически владеете — за исключением, конечно, того, что вам больше не нужно беспокоиться о техническом обслуживании оборудования или о запуске собственного множества продвинутых инструментов мониторинга.
Для быстрых и грязных заданий, особенно если у вас нет большого опыта работы с SSH и парами ключей, я обнаружил, что экземпляры платформы Google Cloud могут быть легче настроить и запустить сразу. У них есть простой запускатель и даже есть кнопка после запуска для просмотра терминала SSH прямо в браузере.
Движение вперёд
Веб постоянно меняется. Технологии, которые доставляют нам изображения, видео, текст и другие типы файлов данных, постоянно обновляются и переизобретаются. Чтобы не отставать, сбор технологий, используемых для извлечения данных из Интернета, также должен изменяться. Кто знает? В будущих версиях этого текста может вовсе не упоминаться JavaScript как устаревшая и редко используемая технология, а вместо этого акцент будет сделан на парсинг голограмм HTML8. Однако то, что не изменится, — это образ мышления и общий подход, необходимые для успешного скрейпинга любого веб-сайта (или того, что мы будем использовать вместо «веб-сайтов» в будущем).
При столкновении с любым проектом веб-скрейпинга вам всегда следует задавать себе следующие вопросы:
- Какой вопрос я хочу решить или какую проблему я хочу решить?
- Какие данные помогут мне в этом, и где они находятся?
- Как веб-сайт отображает эти данные? Могу ли я точно определить, какая часть кода веб-сайта содержит эту информацию?
- Как я могу изолировать данные и извлечь их?
- Какая обработка или анализ должны быть выполнены, чтобы сделать данные более полезными?
- Как я могу сделать этот процесс лучше, быстрее и надежнее?
Кроме того, вам нужно понимать не только то, как использовать представленные в этой книге инструменты по отдельности, но и то, как они могут работать вместе для решения более крупной задачи. Иногда данные легко доступны и хорошо отформатированы, что позволяет простому скрейперу справиться с задачей. Другие разы вам приходится немало подумать.
Например, в статье про обработку изображений, вы использовали библиотеку Selenium для идентификации изображений, загружаемых через Ajax на Amazon, и Tesseract для использования OCR для их чтения. В проблеме «Шесть степеней разделения Википедии» вы использовали регулярные выражения для написания скрейпера, который хранил информацию о ссылках в базе данных, а затем использовали алгоритм поиска в графе, чтобы ответить на вопрос: «Каков кратчайший путь по ссылкам между Кевином Бейконом и Эриком Айдлом?»
Редко бывает неразрешимая проблема, когда дело доходит до автоматизированного сбора данных в Интернете. Просто помните: Интернет — это один гигантский API с довольно плохим пользовательским интерфейсом. Ваша задача — научиться эффективно взаимодействовать с этим «интерфейсом», чтобы извлекать нужные данные и использовать их для решения ваших задач.
Прокси для Веб-Скрейпинга
В этой статье обсуждаются многие продукты и технологии с акцентом на бесплатное и открытое программное обеспечение. В случаях, когда обсуждаются платные продукты, это обычно происходит потому, что бесплатная альтернатива не существует, не практична и/или платные продукты настолько повсеместны, что я почувствовал бы упущение, не упомянув их.
Индустрия прокси и API сервисов для веб-скрейпинга — довольно странная, как для отраслей в целом. Она нова, узка, но при этом чрезвычайно переполнена предложениями с низким порогом входа. Из-за этого пока не существует крупных «бытовых имен», на которые все программисты согласились бы, что они требуют обсуждения. Да, некоторые имена больше других, и некоторые сервисы лучше других, но выбор все еще представляет собой настоящую джунгли.
Также, поскольку проксирование веб-скрейпинга требует огромных объемов оборудования и электроэнергии для работы, жизнеспособная бесплатная альтернатива не существует и вряд ли появится в будущем.
Когда вы читаете этот раздел, я предлагаю вам думать более обще о атрибутах прокси для веб-скрейпинга и API-сервисов, их специализациях, вашем бюджете и требованиях вашего проекта. Эти профили предназначены для чтения в качестве кейс-стади и примеров того, «что есть на рынке», а не конкретных рекомендаций. И если вы все же решите отдать свои деньги какой-либо из этих компаний, это между вами и ними!
Как выбрать прокси для веб-скрейпинга
При выборе прокси для веб-скрейпинга учитывайте следующие аспекты:
- Анонимность: Прокси должен обеспечивать достаточный уровень анонимности, чтобы ваш истинный IP-адрес оставался скрытым.
- Надежность: Выбирайте прокси-сервера, которые известны своей стабильностью и малым количеством отказов.
- Скорость: Быстрые прокси уменьшают время загрузки страниц и увеличивают эффективность скрейпинга.
- Географическое расположение: Если вам нужно извлекать контент, который специфичен для определенной географической локации, выбирайте прокси, расположенные в нужной стране или регионе.
- Цена: Определите ваш бюджет и ищите оптимальное соотношение цены и качества.
- Лимиты и ограничения: Проверьте, есть ли у прокси лимиты на количество запросов или объем передаваемых данных.
- Тип прокси: Различайте между разными типами прокси (например, HTTP, HTTPS, SOCKS, приватные, общедоступные), в зависимости от ваших потребностей.
- Поддержка протоколов: Убедитесь, что прокси поддерживает необходимые вам протоколы и технологии.
Используя эти критерии, вы сможете выбрать подходящий прокси, который поможет вам эффективно собирать данные с веб-сайтов, минимизируя риск блокировки и другие потенциальные проблемы, связанные с веб-скрейпингом.
ScrapingBee
ScrapingBee — это одна из самых маленьких компаний в этом списке, но она активно фокусируется на автоматизации JavaScript, безголовых браузерах и неприметных IP-адресах. Её API хорошо документирован, но если вы предпочитаете не читать документацию, на сайте ScrapingBee есть инструмент генерации запросов к API, который сводит задачу к кликам по кнопкам и копированию/вставке.
Важная особенность, которую следует учитывать при оценке прокси-сервисов, — это время, затрачиваемое на возврат данных запроса. Запрос должен быть направлен от вашего компьютера на их сервер, затем на сервер цели и обратно. Кроме того, прокси-сервис может буферизировать эти запросы на своем конце и не отправлять их немедленно. Не редкость, когда запрос занимает минуту или дольше. Во время формальной оценки важно измерять время этих запросов в течение дня и учитывать различные типы запросов для любых функций, которые вы хотите использовать.
Используя API ScrapingBee напрямую, мы можем получить страницу продукта и вывести как результаты, так и время, затраченное на их получение:
import requests
import time
start = time.time()
params = {
'api_key': 'SCRAPING_BEE_KEY',
'url': 'https://www.target.com/p/-/A-83650487',
}
response = requests.get('https://app.scrapingbee.com/api/v1/', params=params)
print(f'Time: {time.time() - start}')
print(f'HTTP status: {response.status_code}')
print(f'Response body: {response.content[:500]}') # Выводим часть содержимого для удобства
ScrapingBee также имеет Python пакет, который можно установить с помощью pip:
$ pip install scrapingbee
Это SDK (набор инструментов для разработки), позволяющий использовать различные функции API более удобным способом. Например, вышеупомянутый запрос можно написать так:
from scrapingbee import ScrapingBeeClient
import time
start = time.time()
client = ScrapingBeeClient(api_key='SCRAPING_BEE_KEY')
response = client.get('https://www.target.com/p/-/A-83650487')
print(f'Time: {time.time() - start}')
print(f'HTTP status: {response.status_code}')
print(f'Response body: {response.content[:500]}') # Выводим часть содержимого для удобства
Обратите внимание, что ответ — это ответ Python requests
, и его можно использовать так же, как в предыдущем примере.
Сервисы Scraping API обычно используют единицы «кредитов», где один базовый API-запрос стоит один кредит. Функции, такие как рендеринг JavaScript с помощью безголового браузера или резидентный IP-адрес, могут стоить от 5 до 75 кредитов. Каждый платный уровень учетной записи дает вам определенное количество кредитов в месяц.
Хотя есть бесплатная пробная версия с 1,000 кредитов, платные подписки ScrapingBee начинаются от 50 долларов в месяц за 150,000 кредитов, или 3,000 кредитов за доллар. Как и в случае с большинством таких сервисов, при больших объемах есть значительные скидки — кредиты могут стоить 13,000 за доллар или меньше при больших ежемесячных расходах.
Если вы хотите максимизировать количество запросов, имейте в виду, что ScrapingBee взимает 5 кредитов за рендеринг JavaScript и включает его по умолчанию. Это означает, что вышеупомянутые запросы будут стоить 5 кредитов каждый, а не 1.
Это удобно для клиентов, которые, возможно, не читали статью про парсинг JavaScript и не понимают, почему данные, появляющиеся в их веб-браузере, не появляются в результатах скрейпинга, возвращаемых ScrapingBee. Если бы эти клиенты изучили парсинг API, они также поняли бы, как получить данные, которые они хотят, без рендеринга JavaScript вообще. Если вы прочитали обе эти статьи, вы можете отключить рендеринг JavaScript и снизить стоимость запросов на 80%, используя:
client = ScrapingBeeClient(api_key='SCRAPING_BEE_KEY')
params = {'render_js': 'false'}
response = client.get('https://www.target.com/p/-/A-83650487', params=params)
Как и многие из этих сервисов, ScrapingBee предлагает возможность использования «премиум» IP-адресов, которые могут предотвратить блокировку ваших скрейперов веб-сайтами, опасающимися IP-адресов, часто используемых ботами. Эти IP-адреса сообщаются как резидентные адреса, принадлежащие меньшим телекоммуникационным компаниям. Если этого недостаточно, ScrapingBee также предлагает «скрытый» IP-адрес за 75 кредитов за запрос. IP-адреса скрытого типа, которые мне давали, были перечислены как центры данных и серверы VPN, поэтому не совсем ясно, что такое IP-адреса скрытого типа и какие реальные преимущества они предлагают по сравнению с премиальными адресами.
ScraperAPI
ScraperAPI, как следует из названия, имеет в основном чистое и REST-подобное API с множеством функций. Оно поддерживает асинхронные запросы, которые позволяют вам сделать запрос на скрейпинг и получить результаты позже в отдельном вызове API. Альтернативно, вы можете предоставить конечную точку webhook, на которую будут отправлены результаты после завершения запроса.
Простой вызов за один кредит с использованием ScraperAPI выглядит так:
import requests
import time
start = time.time()
params = {
'api_key': 'SCRAPER_API_KEY',
'url': 'https://www.target.com/p/-/A-83650487'
}
response = requests.get('http://api.scraperapi.com', params=params)
print(f'Time: {time.time() - start}')
print(f'HTTP status: {response.status_code}')
print(f'Response body: {response.content[:500]}') # Выводим часть содержимого
ScraperAPI также имеет SDK, который можно установить с помощью pip:
$ pip install scraperapi-sdk
Как и в большинстве подобных SDK, это очень тонкая оболочка вокруг библиотеки Python requests
. Как и с API ScrapingBee, возвращается ответ Python Requests:
from scraper_api import ScraperAPIClient
client = ScraperAPIClient('SCRAPER_API_KEY')
start = time.time()
result = client.get('https://www.target.com/p/-/A-83650487')
print(f'Time: {time.time() - start}')
print(f'HTTP status: {result.status_code}')
print(f'Response body: {result.content[:500]}') # Выводим часть содержимого
При оценке сервисов веб-скрейпинга может возникнуть соблазн предпочесть те, у которых есть Python SDK, созданные вокруг их API. Однако вам следует тщательно рассмотреть, сколько усилий по программированию это сократит или какое удобство это обеспечит. Технически, Python «SDK» может быть написан вокруг любого скрейпинг API с очень небольшими усилиями, включая ваш собственный. Например, этот SDK написан вокруг воображаемого API всего в несколько строк кода:
class RyansAPIClient:
def __init__(self, key):
self.key = key
self.api_root = 'http://api.pythonscraping.com/ryansApiPath'
def get(self, url):
params = {'key': self.key, 'url': url}
return requests.get(self.api_root, params=params)
Но уникальная особенность ScraperAPI — это его автоматические инструменты для парсинга продуктов Amazon и результатов поиска Google. Запрос к странице продукта Amazon или к странице результатов поиска Amazon или Google стоит 5 кредитов, а не 1 кредит для большинства запросов. Хотя в документации упоминается явный вызов к Amazon Product Endpoint по адресу https://api.scraperapi.com/structured/amazon/product
, этот сервис, похоже, включен по умолчанию:
from scraper_api import ScraperAPIClient
client = ScraperAPIClient('SCRAPER_API_KEY')
start = time.time()
result = client.get('https://www.amazon.com/Web-Scraping-Python-Collecting-Modern/dp/1491985577')
print(f'Time: {time.time() - start}')
print(f'HTTP status: {result.status_code}')
print(f'Response body: {result.text[:500]}') # Выводим часть содержимого
С ответом:
Time: 4.672130823135376
HTTP status: 200
Response body: {"name":"Web Scraping with Python: Collecting More Data from the Modern Web","product_information":{"publisher":"O'Reilly Media; 2nd edition (May 8, 2018)","language":"English","paperback":"306 pages","isbn_10":"1491985577","isbn_13":"978-1491985571","item_weight":"1.21 pounds" ...
Написание инструмента для парсинга продуктов Amazon вряд ли является непреодолимой задачей, но передача ответственности за тестирование и поддержание этого инструмента парсинга на протяжении многих лет может быть вполне оправдана затратами.
Как упоминалось ранее, ScraperAPI также позволяет делать асинхронные запросы к его API и получать результаты позже. Этот запрос занимает менее 100 мс для возврата:
start = time.time()
params = {
'apiKey': 'SCRAPER_API_KEY',
'url': 'https://www.target.com/p/-/A-83650487'
}
response = requests.post('https://async.scraperapi.com/jobs', json=params)
print(f'Time: {time.time() - start}')
print(f'HTTP status: {response.status_code}')
print(f'Response body: {response.content[:500]}') # Выводим часть содержимого
Обратите внимание, что это POST-запрос, а не GET-запрос, как показано в предыдущих примерах. Мы, в некотором роде, отправляем данные для создания сохраненной сущности на сервере Scraper API. Также атрибут, используемый для отправки ключа, изменяется с api_key
на apiKey
.
Тело ответа содержит только URL, по которому можно получить задание:
Time: 0.09664416313171387
HTTP status: 200
Response body: {"id":"728a365b-3a2a-4ed0-9209-cc4e7d88de96","attempts":0,"status":"running","statusUrl":"https://async.scraperapi.com/jobs/728a365b-3a2a-4ed0-9209-cc4e7d88de96","url":"https://www.target.com/p/-/A-83650487"}
Вызов его не требует API-ключа — достаточно UUID. Предполагая, что запрос был завершен на их стороне, он возвращает тело цели:
response = requests.get('https://async.scraperapi.com/jobs/728a365b-3a2a-4ed0-9209-cc4e7d88de96')
print(f'Response body: {response.content[:500]}') # Выводим часть содержимого
Результаты этих асинхронных запросов хранятся до четырех часов или до тех пор, пока вы не получите данные. Хотя вы могли бы достичь аналогичного результата дома с многопоточным скрейпером и немного кода, вы не смогли бы легко сделать это, вращая резидентные и мобильные IP-адреса, меняя страны происхождения, управляя данными сессии, рендеря весь JavaScript (что быстро перегрузит машину) и отслеживая все успехи и неудачи на панели управления.
Oxylabs
Oxylabs — это крупная компания, базирующаяся в Литве, с фокусом на скрейпинг страниц результатов поисковых систем (SERP) и страниц продуктов. Их экосистема продуктов и API имеют определённый порог вхождения. После создания аккаунта вам нужно активировать (с помощью недельного пробного периода или платной подписки) каждый «продукт», который вы хотите использовать, и создать отдельные учетные данные (имя пользователя и пароль) для каждого продукта. Эти учетные данные работают примерно как API-ключ.
Продукт Web Scraper API позволяет делать вызовы, которые выглядят следующим образом, с использованием имени пользователя и пароля Web Scraper API:
import requests
import time
start = time.time()
data = {
'url': 'https://www.target.com/p/-/A-83650487',
'source': 'universal',
}
response = requests.post(
'https://realtime.oxylabs.io/v1/queries',
auth=('OXYLABS_USERNAME', 'OXYLABS_PASSWORD'),
json=data
)
response = response.json()['results'][0]
print(f'Time: {time.time() - start}')
print(f'HTTP status: {response["status_code"]}')
print(f'Response body: {response["content"]}')
Однако пользователи могут столкнуться с сюрпризом, если URL-адрес цели изменён на один из домена amazon.com:
data = {
'url': 'https://www.amazon.com/Web-Scraping-Python-Collecting-Modern-dp-1491985577/dp/1491985577',
'source': 'universal',
}
response = requests.post(
'https://realtime.oxylabs.io/v1/queries',
auth=('OXYLABS_USERNAME', 'OXYLABS_PASSWORD'),
json=data
)
print(response.json())
Этот код выводит сообщение об ошибке:
{'message': 'provided url is not supported'}
Как и ScraperAPI, Oxylabs имеет инструменты для парсинга, предназначенные для сайтов, таких как Amazon и Google. Однако, чтобы скрейпить эти домены — с использованием специальных парсинг инструментов или без них — вам нужно подписаться специально на продукт SERP Scraper API (для скрейпинга Google, Bing, Baidu или Yandex) или на продукт E-Commerce Scraper API (для скрейпинга Amazon, Aliexpress, eBay и многих других).
Основные Особенности Oxylabs
- Множество Продуктов: Oxylabs предлагает различные продукты под разные задачи скрейпинга, такие как SERP Scraper API и E-Commerce Scraper API.
- Отдельные Учетные Данные: Для каждого продукта необходимо создать отдельные учетные данные, что увеличивает безопасность, но также добавляет сложности в управление.
- Специализированные Инструменты: Поддерживаются специализированные инструменты парсинга для популярных сайтов, таких как Amazon и Google.
- Поддержка Асинхронных Запросов: Отправка запроса и получение результатов могут быть разделены, что удобно для обработки больших объемов данных.
- Управление Разными Источниками: Указание источника данных (например,
universal
) позволяет настроить обработку запросов в зависимости от целевого сайта.
Использование Oxylabs
Для использования Oxylabs ваши проекты должны быть готовы к определённому порогу входа из-за необходимости управления множеством продуктов и учетных записей. Вот как можно организовать работу с этим сервисом:
- Исследуйте и Активируйте Нужные Продукты: Перед началом работы убедитесь, что нужные продукты активированы в вашем аккаунте Oxylabs.
- Настройте Учетные Данные: Создайте и сохраните учетные данные для каждого используемого продукта.
- Определите Цели Скрейпинга: Уточните, какие сайты (Amazon, Google, eBay и другие) и какую информацию вы хотите извлекать.
- Настройте Интеграцию: Используйте SDK или прямые HTTP запросы для интеграции скрейпинга в ваше приложение.
- Обработайте Ошибки: Учтите потенциальные ошибки, как показано в примере с Amazon, и настройте обработку таких случаев.
- Оптимизируйте Затраты: Управляйте использованием кредитов, выбирая оптимальные параметры для каждого запроса (например, отключение специальных парсинг инструментов, когда они не нужны).
Используя Oxylabs, вы можете масштабировать ваши проекты скрейпинга, обеспечивая эффективную обработку данных с различных источников и доменов.
Если вы подписаны на продукт E-Commerce Scraper API от Oxylabs, вы можете успешно скрейпить домен Amazon, изменив атрибут source
на amazon
и передав учетные данные, специфичные для E-Commerce:
data = {
'url': 'https://www.amazon.com/Web-Scraping-Python-Collecting-Modern-dp-1491985577/dp/1491985577',
'source': 'amazon',
}
response = requests.post(
'https://realtime.oxylabs.io/v1/queries',
auth=('OXYLABS_USERNAME_ECOMMERCE', 'OXYLABS_PASSWORD'),
json=data
)
print(response.json())
Скрипт не делает ничего особенного; это просто возвращает содержимое страницы как обычно. Чтобы использовать шаблоны форматирования информации о продуктах, мы также должны установить атрибут parse
в True
:
data = {
'url': 'https://www.amazon.com/Web-Scraping-Python-Collecting-Modern-dp-1491985577/dp/1491985577',
'source': 'amazon',
'parse': True
}
response = requests.post(
'https://realtime.oxylabs.io/v1/queries',
auth=('OXYLABS_USERNAME_ECOMMERCE', 'OXYLABS_PASSWORD'),
json=data
)
# Выводим результат в удобочитаемом виде
print(json.dumps(response.json(), indent=4))
Скрипт анализирует веб-сайт и возвращает отформатированные данные JSON:
{
"page": 1,
"price": 32.59,
"stock": "Only 7 left in stock - order soon",
"title": "Web Scraping with Python: Collecting More Data from the Modern Web",
"buybox": [
{
"name": "buy_new",
"price": 32.59,
"condition": "new"
}
]
...
}
Использование регулярного Web Scraper API продукта для target.com
Важно иметь в виду, что инструменты парсинга сами по себе не являются специфическими для продукта E-Commerce Scraper API. Мы также можем анализировать домен target.com, используя регулярный продукт Web Scraper API, установив source
обратно в universal
и используя учетные данные Web Scraper API:
data = {
'url': 'https://www.target.com/p/-/A-83650487',
'source': 'universal',
'parse': True
}
response = requests.post(
'https://realtime.oxylabs.io/v1/queries',
auth=('OXYLABS_USERNAME', 'OXYLABS_PASSWORD'),
json=data
)
# Выводим результат в удобочитаемом виде
print(json.dumps(response.json(), indent=4))
Который возвращает данные о продукте в формате JSON:
{
"url": "https://www.target.com/p/-/A-83650487",
"price": 44.99,
"title": "Web Scraping with Python - 2nd Edition by Ryan Mitchell (Paperback)",
"category": "Target/Movies, Music & Books/Books/All Book Genres/Computers & Technology Books",
"currency": "USD",
"description": "Error while parsing `description`: `(<class 'AttributeError'>, AttributeError(\"'NoneType' object has no attribute 'xpath'\"))`.",
"rating_score": 0,
"parse_status_code": 12004
}
Поскольку скрипт пытался автоматически анализировать страницы на домене target.com, он подвержен ошибкам здесь и там, как это было с description
. К счастью, пользователи также могут написать собственные парсеры, которые совместимы с любым типом продукта API (Web Scraper API, SERP Scraper API, E-Commerce Scraper API и т.д.). Эти собственные парсеры имеют форму JSON-файлов с форматом, определенным Oxylabs, который определяет различные поля и селекторы XPath, которые собирают данные для них.
Создание собственных парсеров в Oxylabs
Чтобы создать собственный парсер, вы определяете JSON-файл, который описывает, как извлекать нужные поля из HTML-документа. Например:
{
"fields": {
"title": {
"selector": "//h1[@id='productTitle']/text()",
"type": "Text"
},
"price": {
"selector": "//span[@id='priceblock_ourprice']/text()",
"type": "Text"
},
"description": {
"selector": "//div[@id='description']/text()",
"type": "Text"
}
}
}
Этот парсер можно использовать для извлечения заголовка, цены и описания продукта с веб-страницы.
Использование собственных парсеров позволяет вам гибко настраивать процесс скрейпинга под конкретные задачи и структуры данных, что делает Oxylabs мощным инструментом для сложных задач веб-скрейпинга.
Пользовательские парсеры в Oxylabs по сути являются «бизнес-логикой» самого веб-скрейпера. Стоит учесть, что при переходе на другой API для веб-скрейпинга или на другую прокси-платформу эти шаблоны станут практически бесполезными и потребуют серьезной модификации, переписывания или ваша новая кодовая база должна быть написана специально для работы с ними. Написание шаблонов для веб-скрейпинга на специфическом для Oxylabs языке может быть ограничивающим, если вы решите перейти на другую платформу.
Также важно подчеркнуть, что разные API-продукты (которые, фактически, используют одну и ту же точку API и структуру вызова) определяются не своими конкретными функциями, а доменами, на которые они могут отправлять запросы, что может изменяться в любой момент.
Домены, находящиеся под контролем конкретного продукта, не обязательно хорошо поддерживаются этим продуктом. Например, API для скрейпинга SERP от Oxylabs рекламирует поддержку сайтов, таких как Baidu и Bing, но не имеет разработанных шаблонов парсинга для них. Эта «поддержка» может быть такой же простой, как возможность указать поиск вида:
data = {
'query': 'foo',
'source': 'bing_search',
}
вместо написания полного URL:
data = {
'url': 'https://bing.com?q=foo',
'source': 'bing',
}
Обратите внимание, что, хотя я критичен к некоторым аспектам API-продуктов Oxylabs, эта критика не направлена на компанию как таковую и не должна интерпретироваться как всесторонний обзор или рекомендация. Я предназначаю это только как кейс-стади, или как пример для рассмотрения теми, кто может оценивать подобные продукты в будущем.
При оценке API и сервисов веб-скрейпинга всегда важно учитывать, что рекламируется, что предоставляется и кто является целевой аудиторией. Структура вызова API может раскрыть важную информацию о фактическом построении продукта, и даже документация может вводить в заблуждение.
Преимущества Oxylabs
Oxylabs также обладает множеством отличных качеств. Это один из лучших поставщиков прокси-IP-адресов. Oxylabs постоянно предоставляет широкий ассортимент и большое количество IP-адресов, публично заявленных как жилые, мобильные и центров данных. Как и другие прокси-сервисы, эти IP-адреса доступны по более высокой цене в зависимости от типа. Однако Oxylabs взимает плату за эти прокси-услуги за гигабайт, а не за запрос. В настоящее время стоимость колеблется от $22/GB (мобильные IP-адреса низкого объема) до $8/GB (жилые IP-адреса большого объема).
Пример использования пользовательского парсера в Oxylabs
Чтобы использовать пользовательские парсеры в Oxylabs, вы можете определить формат JSON, который описывает, как извлекать нужные поля из HTML-документа. Например, если вы хотите извлечь название, цену и описание продукта с веб-страницы:
Пример JSON-структуры для парсера:
{
"fields": {
"title": {
"selector": "//h1[@id='productTitle']/text()",
"type": "Text"
},
"price": {
"selector": "//span[@id='priceblock_ourprice']/text()",
"type": "Text"
},
"description": {
"selector": "//div[@id='productDescription']/p/text()",
"type": "Text"
}
}
}
Этот парсер можно использовать для создания запроса к Oxylabs, который возвращает данные в структурированном формате:
data = {
'url': 'https://www.amazon.com/Web-Scraping-Python-Collecting-Modern/dp/1491985577',
'source': 'amazon',
'parse': True,
"parser": {
"fields": {
"title": {
"selector": "//h1[@id='productTitle']/text()",
"type": "Text"
},
"price": {
"selector": "//span[@id='priceblock_ourprice']/text()",
"type": "Text"
},
"description": {
"selector": "//div[@id='productDescription']/p/text()",
"type": "Text"
}
}
}
}
response = requests.post(
'https://realtime.oxylabs.io/v1/queries',
auth=('OXYLABS_USERNAME', 'OXYLABS_PASSWORD'),
json=data
)
# Выводим результат в удобочитаемом виде
print(json.dumps(response.json(), indent=4))
Этот подход позволяет гибко настраивать процесс скрейпинга под конкретные задачи и структуры данных, обеспечивая высокую эффективность и точность извлечения данных.
Zyte (ранее Scrapinghub)
Zyte, бывший Scrapinghub, — ещё одна крупная компания, предоставляющая услуги прокси и API для веб-скрейпинга. Она также является одной из старейших в этой области, основанной в 2010 году. Хотя у меня нет особой привязанности к какой-либо из этих компаний, было бы неправдой сказать, что Zyte не выделяется среди конкурентов, особенно как разработчики Scrapy. Начиная с 2019 года, компания также организует Web Data Extraction Summit.
Как крупная компания, Zyte обладает большинством функций, упомянутых в предыдущих компаниях, и даже больше. В отличие от большинства других, Zyte также продаёт данные напрямую. Если вам нужны, например, объявления о вакансиях, данные о недвижимости или информация о продуктах, компания может предоставить эти наборы данных или предложить консультантов, которые могут создать пользовательские наборы данных.
Zyte поддерживает Scrapy и включил его в свою линейку продуктов в виде Scrapy Cloud. Этот инструмент позволяет развертывать и запускать проекты Scrapy в облаке из репозитория GitHub или с локальной машины с использованием командной строки Scrapinghub. Это позволяет сохранить ваши веб-скрейперы платформонезависимыми и портативными, но при этом тесно интегрироваться с экосистемой Zyte.
После развертывания проекта Scrapy, Zyte находит все классы пауков в проекте и автоматически загружает их в вашу панель управления. Вы можете использовать панель управления Zyte для запуска и мониторинга этих пауков, когда они работают в облаке, а затем просматривать или скачивать полученные данные.
API Zyte
Конечно, у Zyte также есть API. Он во многом похож на другие API тем, что в значительной степени зависит от пакета Python requests
. Он также похож на API Oxylab тем, что использует метод POST
полностью вместе с HTTP Basic Authentication. Однако, в отличие от Oxylab, через Basic Auth отправляется только ключ Zyte, а не имя пользователя и пароль:
import time
from base64 import b64decode
import requests
json_data = {
'url': 'https://www.target.com/p/-/A-83650487',
'httpResponseBody': True,
}
start = time.time()
response = requests.post(
'https://api.zyte.com/v1/extract',
auth=(ZYTE_KEY, ''),
json=json_data
)
response = response.json()
print(f'Time: {time.time() - start}')
print(f'HTTP status: {response["statusCode"]}')
body = b64decode(response["httpResponseBody"])
print(f'Response body: {body[:500]}') # Выводим часть содержимого
Другое значительное отличие заключается в том, что все тела ответов возвращаются как строки, закодированные в base64, а не как HTML или текст JSON. Эта особенность, легко обрабатывается с помощью пакета Python base64
. Это также позволяет получать бинарные данные, изображения и другие файлы так же, как и любой другой ответ запроса, просто декодируя ответ как этот тип файла.
Преимущества Zyte
- Поддержка Scrapy Cloud: Один из ключевых продуктов Zyte — это Scrapy Cloud, позволяющий развертывать и запускать проекты Scrapy в облаке. Это обеспечивает высокую степень интеграции для пользователей Scrapy.
- Прямая продажа данных: Zyte предлагает не только инструменты для скрейпинга, но и готовые наборы данных, что может быть ценным для компаний, нуждающихся в определенных типах данных без необходимости самостоятельного скрейпинга.
- Мощная панель управления: Панель управления Zyte позволяет легко запускать, мониторить и управлять скрейпингом, а также анализировать и скачивать данные.
- Advanced API Features: API Zyte поддерживает аутентификацию и передачу данных с использованием стандартных и безопасных методов, включая кодирование ответов в base64 для более безопасной передачи данных.
Использование Zyte для Обработки бинарных данных и изображений
Поскольку Zyte возвращает данные в формате base64, вы можете легко обрабатывать и сохранять бинарные данные и изображения. Например, если вам нужно сохранить изображение из веб-скрейпинга:
from base64 import b64decode
import requests
json_data = {
'url': 'https://example.com/some-image.png',
'httpResponseBody': True,
}
response = requests.post(
'https://api.zyte.com/v1/extract',
auth=(ZYTE_KEY, ''),
json=json_data
)
response = response.json()
image_data = b64decode(response["httpResponseBody"])
with open('output_image.png', 'wb') as file:
file.write(image_data)
Этот подход делает Zyte удобным инструментом для работы с различными типами веб-контента, включая мультимедийные файлы и другие типы данных, требующие более сложной обработки.
Если вам не хочется использовать Scrapy и у вас есть относительно простой проект, Automatic Extraction API от Zyte использует искусственный интеллект для определения различных полей на странице и возвращает их в формате JSON. На данный момент он работает как с типами «статьи», так и с типами «продукты». Очевидно, ему не нужно использовать кодирование base64, потому что все страницы, которые он анализирует, должны быть текстовыми:
json_data = [{
'url': 'https://www.target.com/p/-/A-83650487',
'pageType': 'product',
}]
response = requests.post(
'https://autoextract.zyte.com/v1/extract',
auth=(ZYTE_KEY, ''),
json=json_data
)
print(response.json())
Документация для Automatic Extraction API от Zyte предоставляет URL https://autoextract.scrapinghub.com/v1/extract
как артефакт их предыдущего названия, ScrapingHub. Если вы видите это, знайте, что вы обычно можете заменить zyte.com
на scrapinghub.com
и придать вашему коду некоторую обратную совместимость, на случай если Zyte решит закрыть старый домен.
Продукты Zyte сильно ориентированы на разработчиков, работающих в корпоративной среде, которые хотят полной прозрачности и контроля над своими скрейперами. Однако, Zyte предпочитает забирать управление IP-адресами из рук пользователей с помощью своего Zyte Smart Proxy Manager. Zyte контролирует, через какие IP-адреса проксируется трафик. IP-адреса сохраняются между сессиями, но IP-адреса переключаются, если один из них блокируется. Zyte пытается использовать переключение IP-адресов для создания органичного потока трафика на сайт, который не вызывает подозрений.
Использование Smart Proxy Manager простое, хотя установка сертификатов на вашей машине может добавить сложности:
response = requests.get(
'https://www.target.com/p/-/A-83650487',
proxies={
'http': f'http://{ZYTE_KEY}:@proxy.crawlera.com:8011/',
'https': f'http://{ZYTE_KEY}:@proxy.crawlera.com:8011/',
},
verify='/path/to/zyte-proxy-ca.crt'
)
print(response.text)
Если вы не хотите использовать сертификат (хотя это не рекомендуется), вы можете отключить проверку в модуле requests:
response = requests.get(
...
verify=False
)
Конечно, Zyte также имеет инструкции для интеграции своих прокси-сервисов с Scrapy, которые затем могут быть запущены в его Scrapy Cloud.
Запросы через прокси стоят около 1,600 за доллар (или меньше с более дорогими месячными планами), запросы API начинаются примерно с 12,000 за доллар. Планы Scrapy Cloud относительно недорогие, с щедрым бесплатным уровнем и профессиональным уровнем за 9 долларов в месяц. Это, вероятно, призвано поощрять использование Scrapy и способствовать интеграции с платформой Zyte.
Пример использования Automatic Extraction API для анализа продуктов
Для использования Automatic Extraction API от Zyte для анализа страницы продукта и получения структурированных данных, вы можете выполнить следующие шаги:
json_data = [{
'url': 'https://www.amazon.com/Web-Scraping-Python-Collecting-Modern/dp/1491985577',
'pageType': 'product',
}]
response = requests.post(
'https://autoextract.zyte.com/v1/extract',
auth=(ZYTE_KEY, ''),
json=json_data
)
# Выводим результат в удобочитаемом формате
import json
print(json.dumps(response.json(), indent=4))
Этот запрос вернет JSON-объект с различными полями, связанными с продуктом, такими как название, описание, цена и другие.
Интеграция Scrapy с Zyte Smart Proxy Manager
Для интеграции Scrapy с Zyte Smart Proxy Manager и запуска в Scrapy Cloud, вы должны выполнить следующие действия:
- Установите Scrapy и Scrapinghub CLI:
pip install scrapy scrapinghub
- Настройте проект Scrapy:
Создайте новый проект Scrapy и настройте его для использования прокси Zyte Smart Proxy Manager в вашемsettings.py
:# settings.py BOT_NAME = 'zyte_spider' SPIDER_MODULES = ['zyte_spider.spiders'] NEWSPIDER_MODULE = 'zyte_spider.spiders' DOWNLOADER_MIDDLEWARES = { 'scrapy_crawlera.CrawleraMiddleware': 610, } CRAWLERA_ENABLED = True CRAWLERA_APIKEY = '<ZYTE_KEY>'
- Разверните проект в Scrapy Cloud:
Используйте Scrapinghub CLI для развертывания вашего проекта в Scrapy Cloud:shub login shub deploy
- Запустите вашего паука в Scrapy Cloud:
После развертывания вы можете запустить вашего паука через интерфейс Scrapy Cloud или используя Scrapinghub CLI.
Дополнительные ресурсы
Много лет назад работа «в облаке» была в основном делом тех, кто был готов изучать техническую документацию и уже имел опыт администрирования серверов. Сегодня инструменты значительно улучшились благодаря росту популярности и конкуренции среди провайдеров облачных вычислений.
Тем не менее, для создания крупномасштабных или более сложных скрейперов и краулеров вам может понадобиться дополнительное руководство по созданию платформы для сбора и хранения данных.
Google Compute Engine авторов Марка Коэна, Кэтрин Хёрли и Пола Ньюсона (издательство O’Reilly) — это понятное руководство по использованию облачных вычислений Google Cloud с использованием Python и JavaScript. Оно охватывает не только пользовательский интерфейс Google, но и командную строку и инструменты для написания скриптов, которые можно использовать для повышения гибкости вашего приложения.
Если вы предпочитаете работать с Amazon, книга Python and AWS Cookbook Митча Гарната (издательство O’Reilly) — это краткое, но чрезвычайно полезное руководство, которое поможет вам начать работу с Amazon Web Services и показать, как запустить масштабируемое приложение.
Индивидуальное и групповое обучение «Аналитик данных»
Если вы хотите стать экспертом в аналитике, могу помочь. Запишитесь на мой курс «Аналитик данных» и начните свой путь в мир ИТ уже сегодня!
Контакты
Для получения дополнительной информации и записи на курсы свяжитесь со мной:
Телеграм: https://t.me/Vvkomlev
Email: victor.komlev@mail.ru
Объясняю сложное простыми словами. Даже если вы никогда не работали с ИТ и далеки от программирования, теперь у вас точно все получится! Проверено десятками примеров моих учеников.
Гибкий график обучения. Я предлагаю занятия в мини-группах и индивидуально, что позволяет каждому заниматься в удобном темпе. Вы можете совмещать обучение с работой или учебой.
Практическая направленность. 80%: практики, 20% теории. У меня множество авторских заданий, которые фокусируются на практике. Вы не просто изучаете теорию, а сразу применяете знания в реальных проектах и задачах.
Разнообразие учебных материалов: Теория представлена в виде текстовых уроков с примерами и видео, что делает обучение максимально эффективным и удобным.
Понимаю, что обучение информационным технологиям может быть сложным, особенно для новичков. Моя цель – сделать этот процесс максимально простым и увлекательным. У меня персонализированный подход к каждому ученику. Максимальный фокус внимания на ваши потребности и уровень подготовки.