Бессерверные вычисления изменили способы создания и развертывания современных приложений. Используя бессерверные платформы, такие как AWS Lambda, разработчики теперь могут создавать высокомасштабируемые веб-скребки, которые снижают затраты и накладные расходы.
В этом подробном руководстве мы рассмотрим интеграцию Scrapy, популярной платформы парсинга Python, с AWS Lambda для невероятно быстрого бессерверного парсинга веб-страниц.
Преимущества бессерверной архитектуры веб-скрапинга
Традиционно парсинг веб-страниц требовал выделения и обслуживания серверов для обработки нагрузки. Это означало простаивание ресурсов, когда не выполнялась очистка, и ограниченные возможности масштабирования.
Бессерверные архитектуры решают эти проблемы, полностью абстрагируя серверы:
- AWS Lambda автоматически запускает код в ответ на события
- Ресурсы увеличиваются и уменьшаются точно в зависимости от спроса.
- Платите только за использованное вычислительное время
В качестве примера из реальной жизни, вот как бессерверные технологии могут оптимизировать затраты на проект парсинга веб-страниц:
Архитектура | Месячная стоимость |
---|---|
Традиционный (4 сервера) | $1000 |
Serverless | $250 |
Используя бессерверные технологии, мы сокращаем ежемесячные расходы в 4 раза! Экономия достигается за счет полного исключения простоя серверов времени между очистками.
Помимо стоимости, ключевые преимущества включают в себя:
- Справляйтесь с неожиданными всплесками трафика – Масштабирование со 100 до 1000 одновременных операций очистки.
- Никаких затрат на DevOps – Сосредоточьтесь на коде, а не на инфраструктуре
- Встроенная избыточность – Сбои сервера обрабатываются автоматически
Давайте посмотрим, как AWS Lambda предоставляет эти преимущества.
Введение в AWS Lambda
AWS Lambda — ведущая бессерверная платформа, которая позволяет запускать код без управления серверами.
Основные функции включают в себя:
- Гибкие триггеры – Выполнение кода в ответ на HTTP, S3, SQS и т. д.
- Эфемерные вычисления – Контейнеры предоставляются для каждого выполнения
- Автоматическое масштабирование – Тысячи параллельных исполнений
- Плата за использование – Шаг биллинга 100 мс
Это делает Lambda идеальным решением для таких рабочих нагрузок, как парсинг веб-страниц, которые:
- Событийный – Парсинг, инициируемый очередью URL-адресов
- Неспокойный трафик – Непредсказуемые скачки количества необходимых страниц.
- Короткие казни – Очистите каждую страницу за считанные секунды
Используя Lambda для парсинга веб-страниц, мы платим только за затраченное время вычислений. Остальное обрабатывает AWS.
Запуск веб-скребков на Lambda
Чтобы запустить парсеры Python на Lambda, нам необходимо:
- Зависимости пакетов – Загрузите библиотеки, такие как Scrapy, в пакет развертывания.
- Создание обработчиков – Точка входа, которая импортирует и запускает парсерный код.
- Настройка триггеров – Вызов функции по событию HTTP, загрузке S3 и т. д.
Lambda предоставляет дополнительные возможности интеграции:
- Слои – Добавляйте двоичные файлы, такие как Chrome, без пересборки пакета.
- Переменные среды – Безопасно передавайте секреты и учетные данные
- Доступ к VPC – Парсинг частных сайтов в VPC
- мониторинг – X-Ray, журналы CloudWatch, метрики для отладки
Это позволяет запускать полнофункциональные конвейеры парсинга в масштабируемой бессерверной инфраструктуре Lambda.
Далее давайте посмотрим, как Scrapy вписывается.
Введение в Scrapy — мощный фреймворк для парсинга веб-страниц
Scrapy — популярная платформа с открытым исходным кодом для сбора данных с веб-сайтов. Ключевые функции, созданные на Python, включают в себя:
- Ползком - Навигация по сайтам по ссылкам
- Извлечение данных – Используйте селекторы CSS и XPath для извлечения элементов.
- Spiders – Модульные сканеры, которые сканируют разные сайты
- Трубопроводы – Постобработка и хранение очищенных предметов.
- Готовый экспорт – JSON, CSV, XML с поддержкой S3
- Динамические страницы – Интеграция со Splash для рендеринга JavaScript
- совпадение – Контролировать количество запросов
- дросселирование – Установите политику вежливости и задержек.
Это делает Scrapy идеальным для создания сложных конвейеров очистки. Он обрабатывает сканирование целых веб-сайтов, анализирует ответы и выводит структурированные данные.
Некоторые примеры универсальности Scrapy:
- Парсинг сайтов электронной коммерции по ссылкам на категории
- Извлечение названий статей, авторов и текста на новостных сайтах
- Сбор данных о компаниях из каталогов Yellow Pages.
- Создание механизмов сравнения цен для мониторинга цен
- Создание наборов данных на основе данных государственного управления
Эти примеры демонстрируют, как Scrapy предоставляет основные функции, необходимые для парсинга веб-страниц промышленного уровня.
Почему Scrapy идеально подходит для бессерверного парсинга
Scrapy предоставляет два ключевых преимущества при переходе на бессерверную архитектуру:
Точный контроль над параллелизмом – Scrapy обрабатывает параллельные запросы и настройки вежливости, что важно для оптимизации бессерверной масштабируемости и минимизации затрат.
Модульные пауки – Абстракция паука позволяет запускать отдельные рабочие процессы очистки в разных функциях Lambda.
Объединив Scrapy и Lambda, мы получаем лучшее от обоих миров — простой параллелизм от Scrapy и бесконечную масштабируемость от Lambda.
Далее давайте рассмотрим практический пример.
Практический пример: создание бессерверного веб-скрейпера с помощью Scrapy и Lambda
Чтобы продемонстрировать бессерверный парсинг в действии, мы рассмотрим пример использования Scrapy на AWS Lambda для парсинга данных книги.
Цель — получить названия книг, авторов и цены из книжного интернет-магазина:
Вот шаги, которые мы рассмотрим:
- Создать Scrapy-паука
- Настройка функции AWS Lambda
- Развертывание пакета парсера
- Запустить паука через Лямбду
- Проверьте очищенный вывод
Шаг 1 – Создание Scrapy Spider
Сначала мы создадим паука Scrapy, который будет очищать книжный магазин:
import scrapy
class BookSpider(scrapy.Spider):
name = ‘books‘
allowed_domains = [‘books.toscrape.com‘]
start_urls = [‘http://books.toscrape.com‘]
def parse(self, response):
for book in response.css(‘article.product_pod‘):
yield {
‘title‘: book.css(‘h3 a::attr(title)‘).get(),
‘price‘: book.css(‘.price_color::text‘).get(),
‘author‘: book.xpath(‘./h3/following-sibling::p/text()‘).get(),
}
next_page = response.css(‘li.next > a::attr(href)‘).get()
if next_page is not None:
yield response.follow(next_page, callback=self.parse)
Этот паук просканирует все страницы и извлечет информацию для каждой книги.
Шаг 2 – Настройка лямбда-функции
Далее нам нужно настроить функцию Lambda для запуска паука:
# lambda_handler.py
from scrapy import signals
from scrapy.signalmanager import dispatcher
def lambda_handler(event, context):
dispatcher.connect(stop_reactor, signal=signals.spider_closed)
from spiders.books import BookSpider
try:
scraper = BookSpider()
scraper.scrape()
except Exception as e:
raise e
return {
‘statusCode‘: 200,
‘body‘: ‘Scrape completed‘
}
def stop_reactor():
from twisted.internet import reactor
reactor.stop()
Это служит точкой входа, которая импортирует нашего паука и обеспечивает корректное завершение работы.
Для развертывания мы используем Serverless Framework и создаем serverless.yml
:
service: book-scraper
provider:
name: aws
runtime: python3.8
region: us-east-1
functions:
scrapeBooks:
handler: lambda_handler.lambda_handler
layers:
- arn:aws:lambda:us-east-1:123456789012:layer:chrome:1
Эта конфигурация настраивает Lambda, слои для Headless Chrome и указывает на наш обработчик.
Шаг 3 – Развертывание парсера
Мы объединяем код в пакет развертывания .zip:
pip install scrapy -t ./package
zip -r deploy.zip .
Затем разверните с помощью Serverless:
serverless deploy
При этом пакет загружается в Lambda и настраивает функцию.
Шаг 4 – Запуск скребка
Чтобы запустить паука, мы вызываем функцию Lambda через интерфейс командной строки AWS:
aws lambda invoke --function-name book-scraper response.json
Это запускает паука асинхронно. Мы можем просмотреть журналы в CloudWatch.
Шаг 5 – Проверка вывода
Поскольку Scrapy автоматически экспортирует очищенные элементы, выходные данные сохраняются в корзину S3, которую мы настроили:
Вывод содержит все очищенные книги в формате JSON.
Это демонстрирует сквозной рабочий процесс запуска пауков Scrapy через Lambda. Бессерверная архитектура позволяет масштабировать весь сайт книжного магазина без каких-либо серверов, которыми нужно управлять.
Добавление поддержки прокси для крупномасштабного парсинга
Важной задачей при парсинге больших сайтов является добавление поддержки прокси. Это помогает обходить блокировки и масштабироваться для увеличения объемов запросов.
Вот как интегрировать прокси с помощью scrapy-rotating-proxies
библиотека:
1. Установите библиотеку
pip install scrapy-rotating-proxies
2. Включите промежуточное программное обеспечение загрузчика.
DOWNLOADER_MIDDLEWARES = {
# ...
‘rotating_proxies.middlewares.RotatingProxyMiddleware‘: 610,
‘rotating_proxies.middlewares.BanDetectionMiddleware‘: 620,
}
3. Настройте прокси
ROTATING_PROXY_LIST = [
‘http://proxy1‘,
‘http://proxy2‘ # Add your proxies
]
Это будет чередоваться по списку, просматривая разные IP-адреса.
Для более сложных настроек специальный прокси-сервис, такой как BrightData, предлагает более 30 миллионов домашних IP-адресов, оптимизированных для парсинга. Это заботится о пулах прокси, ротации и управлении блоками.
Архитектура распределенного конвейера парсинга веб-страниц
Ключевым преимуществом бессерверных технологий является возможность координации и масштабирования нескольких функций. При парсинге веб-страниц это позволяет разделить работу по организованному конвейеру.
Вот пример распределенной архитектуры парсинга на AWS:
- Очередь SQS – Содержит список URL-адресов для парсинга
- URL-адрес лямбда – Считывает очередь и вызывает парсеры, специфичные для сайта.
- Скрепочные лямбды – Парсит разные сайты и публикует данные
- DynamoDB – Сохраняет полученные результаты
- S3 – Сохраняет очищенные файлы в качестве резервной копии.
Разбив конвейер на отдельные функции, мы можем:
- Масштабируйте каждый компонент независимо – При необходимости добавьте больше Scrapy Lambdas.
- Обрабатывать разные сайты – Направляйте URL-адреса пользовательским паукам.
- Повторить попытку в случае неудачи – Автоматически запрашивать неудачные URL-адреса
Мы можем связать это вместе с помощью AWS Step Functions для создания рабочего процесса оркестрации.
Мониторинг и отладка Scrapy/Lambda
При построении сложных конвейеров нам нужна видимость того, что происходит. Некоторые ключевые инструменты мониторинга включают в себя:
Рентген AWS – Отслеживает запросы и задержки между службами.
Журналы CloudWatch — Журналы из Lambda и Scrapy
Часовой – Единый мониторинг ошибок
графана – Визуализация показателей вызовов Lambda, длительности, памяти и т. д.
Датадог / Новая Реликвия – Сквозная наблюдаемость с распределенной трассировкой
Сбои в распределенных системах могут быть непростыми — эти инструменты помогают выявить проблемы.
Для отладки Scrapy на Lambda:
- Перед развертыванием сначала выполните локальное воспроизведение.
- Протестируйте Lambdas индивидуально перед оркестровкой.
- Включить ведение журнала уровня DEBUG в Scrapy и Lambda.
- Используйте S3 для удаленной регистрации
- Выполняйте поэтапное развертывание для выявления ошибок.
При правильном мониторинге и проверке мы можем обеспечить надежность наших трубопроводов.
Итоги
В этом руководстве мы рассмотрели, как объединить Scrapy и AWS Lambda для реализации бессерверной архитектуры веб-скрапинга. Вот некоторые ключевые выводы:
- Бессерверные вычисления устраняют накладные расходы на серверы и легко масштабируются.
- AWS Lambda предоставляет гибкие вычислительные возможности, позволяющие запускать пауки Scrapy по требованию.
- Scrapy решает сложные задачи сканирования, анализа и извлечения данных.
- Эти два варианта идеально сочетаются, обеспечивая масштабируемый парсинг веб-страниц.
- Дополнительные методы, такие как прокси и оркестрация, максимизируют масштаб и пропускную способность.
Мир веб-скрапинга смещается в сторону бессерверных технологий. Я надеюсь, что в этом руководстве представлены полезные методы, которые помогут вам внедрить бессерверную архитектуру и открыть новые уровни масштабирования ваших проектов обработки данных. Дайте мне знать, если у вас есть еще вопросы!