перейти к содержанию

Раскройте возможности бессерверного парсинга веб-страниц с помощью Scrapy и AWS Lambda

Бессерверные вычисления изменили способы создания и развертывания современных приложений. Используя бессерверные платформы, такие как 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, нам необходимо:

  1. Зависимости пакетов – Загрузите библиотеки, такие как Scrapy, в пакет развертывания.
  2. Создание обработчиков – Точка входа, которая импортирует и запускает парсерный код.
  3. Настройка триггеров – Вызов функции по событию 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 для парсинга данных книги.

Цель — получить названия книг, авторов и цены из книжного интернет-магазина:

Образец книги

Вот шаги, которые мы рассмотрим:

  1. Создать Scrapy-паука
  2. Настройка функции AWS Lambda
  3. Развертывание пакета парсера
  4. Запустить паука через Лямбду
  5. Проверьте очищенный вывод

Шаг 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, которую мы настроили:

Ведро 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:

Бессерверная Scrapy-архитектура

  • Очередь 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 решает сложные задачи сканирования, анализа и извлечения данных.
  • Эти два варианта идеально сочетаются, обеспечивая масштабируемый парсинг веб-страниц.
  • Дополнительные методы, такие как прокси и оркестрация, максимизируют масштаб и пропускную способность.

Мир веб-скрапинга смещается в сторону бессерверных технологий. Я надеюсь, что в этом руководстве представлены полезные методы, которые помогут вам внедрить бессерверную архитектуру и открыть новые уровни масштабирования ваших проектов обработки данных. Дайте мне знать, если у вас есть еще вопросы!

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *