CoderCastrov logo
CoderCastrov
Парсер

Парсинг веб-страниц с использованием пула прокси (дешевый способ)

Парсинг веб-страниц с использованием пула прокси (дешевый способ)
просмотров
3 мин чтение
#Парсер

С помощью функций AWS Lambda 100 ГБ обойдутся вам всего в $9

Вероятно, самая сложная задача в Data Science - получение данных. Компании готовы предоставить "бесплатные" услуги в обмен на данные, которые они собирают о том, как вы их используете, и это дает им преимущество перед конкурентами. Неудивительно, что они не очень любят людей, беспрестанно парсящих данные с их веб-сайтов, и используют ряд сложных алгоритмов обнаружения, чтобы отклонять запросы, поступающие с одного и того же IP-адреса, слишком похожие или просто выглядящие подозрительно. Хотя скачивание неразумных объемов данных является неморальным (и иногда незаконным), без данных развитие моделей монополизируется и, следовательно, подавляется. Я не собираюсь одобрять или осуждать парсинг веб-страниц, но я собираюсь показать вам полезный трюк.

Пулы прокси-серверов

Самый простой способ определить, что кто-то парсит ваши данные, - это большое количество запросов с одного IP-адреса. По этой причине появилось несколько сервисов, которые предоставляют доступ к большому пулу серверов, которые можно использовать в качестве прокси для доступа к веб-сайту. Основной недостаток заключается в стоимости.

Входные функции AWS Lambda

Функции Lambda являются примером FaaS - Functions as a Service - и являются одним из наиболее известных компонентов так называемой безсерверной архитектуры. Раньше вам приходилось создавать сервер для размещения вашего приложения, включая любые функции, такие как возврат значения из базы данных и т.д. С помощью функций Lambda вы можете создать довольно сложную систему, не запуская никаких серверов, объединяя все компоненты - статические веб-страницы, базы данных и другую функциональность - с функциями Lambda. Зачем вам это нужно? Потому что таким образом вы платите только за использование вашего приложения, а не за "оставление света включенным" путем запуска сервера 24/7. Если вы ожидаете разрозненные или низкие объемы, использование безсерверной архитектуры гораздо более эффективно с точки зрения стоимости. Вы можете сделать миллион вызовов к функции Lambda в месяц без каких-либо затрат, кроме передачи данных из них, которая оплачивается по той же ставке, что и экземпляр EC2 (в настоящее время 9 долларов за 100 ГБ). Для сравнения, oxylabs.io берет 15 долларов за ГБ.

Функции Lambda могут быть написаны на большинстве популярных языков, но я собираюсь использовать Python, так как это все еще основной язык для Data Scientists. К счастью для нас, функции Lambda не гарантируют сохранение своего IP-адреса. Я обнаружил, что если к ним не обращаются более 6 минут, их IP-адрес меняется. Кроме того, нет реального ограничения на количество функций Lambda, которые вы создаете. Так почему бы не создать столько, сколько вам нужно, и циклически использовать их в режиме round robin для парсинга веб-страниц, которые вас интересуют? Именно это мы собираемся сделать сейчас.

Terraform

Использование консоли AWS является трудоемким и порой запутанным, поэтому нам нужен автоматический способ создания столько Lambda-функций, сколько нам нужно. Terraform - отличный инструмент для этого. После установки Terraform и AWS CLI и связывания их с вашей учетной записью AWS, вы можете выполнить следующее:

resource "aws_lambda_function" "proxy" {
  count         = 10
  function_name = "proxy-${count.index}"
  role          = aws_iam_role.lambda_exec.arn
  handler       = "lambda_function.lambda_handler"
  runtime       = "python3.8"
  timeout       = 10

  environment {
    variables = {
      URL = "https://example.com"
    }
  }

  lifecycle {
    ignore_changes = [
      environment
    ]
  }
}

Это автоматически создаст 10 Lambda-функций с именами proxy-0 до proxy-9, которые мы можем использовать для доступа к веб-странице, как в этом примере:

import boto3

lambda_client = boto3.client('lambda')

while True:
    for i in range(10):
        response = lambda_client.invoke(
            FunctionName='proxy-{}'.format(i),
            InvocationType='RequestResponse'
        )
        print(response['Payload'].read())

(Вам потребуется pip install boto3 - Python-обертка для программного управления AWS.) Если вы запустите это, вы должны увидеть 10 уникальных IP-адресов, повторяющихся в цикле. Просто замените URL на веб-страницы, которые вас интересуют, и вперед. Вы можете настроить количество создаваемых Lambda-функций в файле variables.tf, а также регион - что может быть полезно для веб-страниц, к которым можно получить доступ только из определенных частей мира.

Однако у Lambda-функций есть определенные ограничения. В частности, размер ответа должен быть менее 6 МБ. Называть Lambda-функцию "proxy", возможно, слишком громко, так как она может обрабатывать только GET-запросы в текущем виде, но она вполне подходит для парсинга данных из HTML-страниц с использованием, например, Beautiful Soup.

teticio/lambda-scraper

Используйте функции AWS Lambda в качестве прокси для получения HTTP. Сотрудничайте с teticio/lambda-scraper, создавая...

github.com