Посібник з вебскрапінгу на Elixir

Elixir Web Scraping у 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. Bright Data — Налаштовувані та готові набори даних для різних галузей.
  2. Statista — Розширена статистика та звіти для бізнесу й досліджень.
  3. Datarade — Маркетплейс преміальних продуктів з даними від різних постачальників.
  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 and Floki.

  1. Crawly Це потужний фреймворк для краулінгу, який відтворює структуру та функціональність Scrapy, однієї з найпопулярніших бібліотек вебскрапінгу для Python. Він надає ключові компоненти вебскрапінгу, зокрема спайдери, пайплайни та middleware.
  2. Floki є простим HTML-парсером для Elixir. Він дає змогу використовувати CSS-селектори для пошуку та отримання конкретних елементів з HTML-документів.

Крок 1: Налаштування проєкту Elixir

Спершу встановіть Elixir (і Erlang, якщо ви використовуєте Windows), а потім створіть новий проєкт Elixir:

mix new 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 do
[
{:crawly, "~> 0.16.0"},
{:floki, "~> 0.33.0"}
]
end
Потім установіть 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 do
use Crawly.Spider
@impl Crawly.Spider
def base_url(), do: "https://www.scrapingcourse.com/ecommerce/"
@impl Crawly.Spider
def init() do
[start_urls: ["https://www.scrapingcourse.com/ecommerce/"]]
end
@impl Crawly.Spider
def parse_item(response) do
{: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()
}
end)
%Crawly.ParsedItem{items: product_items}
end
end

Цей код визначає модуль ScrapingcourseSpider, який:

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

Крок 2: Запуск спайдера

Щоб запустити спайдер, виконайте таку команду:

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

Ваш вебскрапер має записувати до журналу кожен витягнутий елемент, надаючи цінні відомості про структуру даних цільового сайту.

Експорт зібраних даних у CSV

Щоб зберігати зібрані дані в CSV-файл, налаштуйте конвеєр так, щоб він містив CSVEncoder від Crawly:

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

Запустіть спайдера ще раз, і Crawly виведе CSV-файл із потрібними полями даних у вихідній папці.

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}
end

Ця конфігурація дає Crawly змогу переходити за кожним посиланням пагінації, гарантуючи, що буде зібрано всі товари.

Робота з контентом, відрендереним JavaScript

Elixir, як і багато інших мов, не може нативно виконувати JavaScript у межах HTTP-відповідей. Однак ви можете інтегрувати Splash (безголовий браузер) для обробки сторінок, згенерованих 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-Agentів та використанням проксі-серверів.

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, like 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 дають змогу коректно відновлюватися, коли під час вебскрапінгу виникають проблеми, забезпечуючи максимальне вилучення даних із мінімальними перервами.

Conclusion

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

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

Схожі записи