Руководство по веб-скрейпингу на Elixir

Веб-скрейпинг на Elixir в 2026 году: исчерпывающее руководство

В этом руководстве я покажу, как использовать Elixir Для веб-скрапинга. Мы разберем основы — настройку окружения, необходимые инструменты и лучшие практики. Я также расскажу о техниках извлечения данных со страниц с пагинацией и страниц, отрисовываемых JavaScript. Посмотрим, почему Elixir становится одним из основных вариантов для веб-скрапинга!

Почему стоит выбрать Elixir для веб-скрейпинга?

Сильные стороны Elixir заключаются в масштабируемости и конкурентном выполнении. Построенный на Виртуальная машина Erlang (BEAM), Elixir способен обрабатывать миллионы легковесных процессов, при этом накладные расходы на каждый из них минимальны. Это делает Elixir идеальным для задач, где требуется параллельная обработка множества запросов, например при скрейпинге сайтов с постраничным контентом. Синтаксис Elixir и его экосистема инструментов делают язык доступным даже для разработчиков, которые только начинают работать с функциональным программированием.

Ключевые причины рассмотреть Elixir для веб-скрапинга:

  1. Конкурентность и масштабируемость: Elixir может обрабатывать несколько запросов одновременно без потери скорости или эффективности использования памяти, что делает его идеальным для веб-скрапинга нескольких страниц или сайтов.
  2. Reliability: Философия BEAM «let it crash» позволяет организовать корректную обработку сбоев, так что ваш скрейпер сможет самовосстановиться, если какой-то процесс упадет.
  3. Fault Tolerance: Встроенные деревья супервизии Elixir и отказоустойчивая архитектура позволяют приложению восстанавливаться после непредвиденных проблем, не прерывая весь процесс сбора данных.

Лучшие автоматизированные альтернативы Elixir

Если вас вообще не интересует скрейпинг и нужны только данные, обратите внимание на эти сайты с датасетами:

  1. Яркие данные — Настраиваемые и готовые наборы данных по различным отраслям.
  2. Statista — Подробная статистика и отчеты для бизнеса и исследований.
  3. Datarade — Маркетплейс премиальных data-продуктов от разных поставщиков.
  4. AWS Data Exchange Наборы данных сторонних поставщиков, интегрированные с сервисами AWS.
  5. Zyte — Веб-скрейпинг и пользовательские наборы данных, адаптированные под потребности бизнеса.
  6. Data & Sons — Открытая торговая площадка для покупки и продажи разнообразных наборов данных.
  7. Coresignal — Аналитика рынка труда с обширными данными о вакансиях и занятости.
  8. Oxylabs — Специализированные услуги по данным компаний и веб-скрейпингу.
  9. Bloomberg Enterprise Data Catalog — Финансовые данные для корпоративного использования.
  10. Kaggle — Бесплатные общедоступные наборы данных и инструменты для науки о данных.

Некоторые бесплатны, некоторые нет, некоторые предлагают бесплатные образцы. Выберите то, что подходит вашим задачам. Я не связан ни с одним из них.

Настройка окружения для веб-скрейпинга на Elixir

Чтобы начать веб-скрейпинг на Elixir, вам нужно настроить проект Elixir и добавить две основные библиотеки: Crawly и Floki.

  1. Crawly Это мощный фреймворк для краулинга, который повторяет структуру и функциональность Scrapy, одной из самых популярных библиотек Python для веб-скрапинга. Он предоставляет основные компоненты для сбора данных, включая спайдеры, пайплайны и middleware.
  2. Floki Простой HTML-парсер для Elixir. Он позволяет использовать CSS-селекторы для поиска и извлечения конкретных элементов из HTML-документов.

Шаг 1: Настройка проекта Elixir

Сначала установите Elixir (а на Windows — также Erlang), затем создайте новый проект Elixir:

mix новый elixir_scraper - sup

This command initializes a new supervised project named elixir_scraper.

Шаг 2: Добавление зависимостей

In your mix.exs file, add Crawly and Floki as dependencies:

defp deps сделать
[
{:crawly, "~> 0.16.0"},
{:floki, "~> 0.33.0"}
]
конец
Затем установите libraries:
mix deps.get

Ваш проект Elixir теперь готов к веб-скрапингу.

Создание простого паука на Elixir с Crawly

A Crawly spider is essentially an Elixir module that defines how to retrieve and parse data from a target website. In this example, we’ll create a spider to scrape data from ScrapingCourse.com, a mock e-commerce site.

Шаг 1: Создание паука

Сгенерируйте спайдер Crawly с помощью следующей команды:

mix crawly.gen.spider - filepath ./lib/scrapingcourse_spider.ex - spidername ScrapingcourseSpider

This creates a file in the lib directory called scrapingcourse_spider.ex. Here’s how the initial code should look:

defmodule ScrapingcourseSpider сделать
use Crawly.Spider
@impl Crawly.Spider
def base_url(), сделать: "https://www.scrapingcourse.com/ecommerce/"
@impl Crawly.Spider
def init() сделать
[start_urls: ["https://www.scrapingcourse.com/ecommerce/"]]
конец
@impl Crawly.Spider
def parse_item(response) сделать
{:ok, document} = Floki.parse_document(response.body)
product_items =
document
|> Floki.find("li.product")
|> Enum.map(fn x ->
%{
url: Floki.find(x, "a.woocommerce-LoopProduct-link") |> Floki.attribute("href") |> Floki.text(),
name: Floki.find(x, "h2.woocommerce-loop-product__title") |> Floki.text(),
image: Floki.find(x, "img.attachment-woocommerce_thumbnail") |> Floki.attribute("src") |> Floki.text(),
price: Floki.find(x, "span.price") |> Floki.text()
}
конец)
%Crawly.ParsedItem{items: product_items}
конец
конец

Этот код определяет модуль ScrapingcourseSpider, который:

  • Targets the ScrapingCourse.com website.
  • Использует CSS-селекторы для извлечения таких данных, как название товара, цена, изображение и URL.

Шаг 2: Запуск паука

Чтобы запустить паука, выполните следующую команду:

iex -S mix run -e "Crawly.Engine.start_spider(ScrapingcourseSpider)"

Ваш скрейпер должен логировать каждый извлеченный элемент, что дает ценное представление о структуре данных целевого сайта.

Экспорт собранных данных в CSV

Чтобы сохранять собранные данные в CSV-файл, настройте pipeline так, чтобы он включал Crawly CSVEncoder:

import Config
config :crawly,
middlewares: [],
pipelines: [
{Crawly.Pipelines.CSVEncoder, fields: [:url, :name, :image, :price]},
{Crawly.Pipelines.WriteToFile, extension: "csv", folder: "output"}
]

Запустите паука еще раз, и Crawly выведет CSV-файл с нужными полями данных в папку output.

Handling Paginated Pages

Многие сайты распределяют данные по нескольким страницам. Чтобы обработать пагинацию, изучите навигационные элементы целевого сайта и настройте своего паука на переход по дополнительным страницам.

Например, чтобы скрапить постраничные списки товаров:

Определите CSS-селектор for pagination links (e.g., a.page-numbers).

Use Floki to extract each page URL and add it to Crawly’s next_requests array.

def parse_item(response) do
{:ok, document} = Floki.parse_document(response.body)
product_items = # parse products…
next_requests =
document
|> Floki.find("a.page-numbers")
|> Floki.attribute("href")
|> Enum.map(&Crawly.Utils.request_from_url/1)
%Crawly.ParsedItem{items: product_items, requests: next_requests}
конец

Такая настройка позволяет Crawly переходить по каждой ссылке пагинации, гарантируя сбор всех товаров.

Работа с контентом, отрисованным JavaScript

Elixir, как и многие языки, не умеет нативно выполнять JavaScript внутри HTTP-ответов. Однако вы можете интегрировать Всплеск браузер без интерфейса для обработки страниц, отрисованных JavaScript. Splash рендерит содержимое на стороне сервера, предоставляя Elixir полный HTML-документ, включая элементы, сгенерированные JavaScript.

Шаг 1: Настройка Splash

Splash можно запускать как Docker-контейнер. Скачайте и запустите образ Splash:

docker pull scrapinghub/splash docker run -it -p 8050:8050 - rm scrapinghub/splash

Шаг 2: Настройка Crawly для использования Splash

In your config.exs file, configure Crawly to fetch pages through Splash:

import Config
config :crawly,
fetcher: {Crawly.Fetchers.Splash, [base_url: "http://localhost:8050/render.html", wait: 3]}

Такая конфигурация обеспечивает получение данных Crawly через Splash, что позволяет обрабатывать контент, отрисованный JavaScript. Теперь, когда ваш паук отправляет запросы, Splash будет обрабатывать весь JavaScript и передавать Elixir уже отрисованный HTML.

Прокси и User-Agent'ы для обхода блокировок

Многие сайты используют антибот-защиту, которая может блокировать повторяющиеся запросы с одного IP. Обойти эти блокировки можно за счет ротации User Agents и использования прокси-серверов.

Rotating User-Agents: Add Crawly.Middlewares.UserAgent middleware to rotate User-Agents:

config :crawly,
middlewares: [
{Crawly.Middlewares.UserAgent, user_agents: [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
]}
]

Using Proxy Servers: Используйте прокси, чтобы скрыть свой IP и повысить устойчивость вашего скрейпера к блокировкам.

config :crawly,
middlewares: [
{Crawly.Middlewares.RequestOptions, [proxy: {"http://proxyaddress.com", 8000}]}
]

Продвинутые приёмы веб-скрапинга на Elixir

С помощью Elixir можно вывести веб-скрейпинг на новый уровень, повысив производительность за счет дополнительных настроек и продвинутых техник.

Parallel Requests: Crawly allows concurrent requests for faster data gathering. Set concurrent_requests_per_domain to a higher value in config.exs.

config :crawly,
concurrent_requests_per_domain: 4

Error Handling: Возможности обработки ошибок Crawly позволяют корректно восстанавливаться при сбоях во время скрапинга, обеспечивая максимальное извлечение данных при минимальных перебоях.

Заключение

Elixir — мощный выбор для веб-скрапинга, в первую очередь потому, что он умеет параллельно выполнять задачи и сохранять устойчивость при высокой нагрузке. Библиотеки вроде Crawly и Floki позволяют быстро начать работу, предлагая мощные инструменты для всего: от простых сценариев до более сложных задач, таких как обработка пагинации, скрапинг страниц, отрендеренных JavaScript, и обход блокировок.

Веб-скрейпинг развивается в сторону более распределенных и устойчивых конфигураций, и функциональный стиль Elixir вместе с его высокой производительностью идеально для этого подходят. Если вы изучаете извлечение данных в более крупном масштабе, Elixir - надежный вариант, который отвечает современным требованиям к веб-скрейпингу.

Похожие записи