Гид по технологиям

Веб-скрапинг на Rust: парсинг HTML и извлечение данных

5 min read Разработка Обновлено 11 Dec 2025
Веб-скрапинг на Rust — парсинг и извлечение
Веб-скрапинг на Rust — парсинг и извлечение

Логотип Rust и иллюстрация стопки контейнеров с логотипом Rust

Что такое веб-скрапинг

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

Важно: перед началом убедитесь, что вы соблюдаете правила сайта (robots.txt) и юридические требования по использованию данных.

Почему Rust

Rust сочетает высокую производительность с безопасностью памяти и строгой обработкой ошибок. Это делает его хорошим выбором для долговременных скриптов и сервисов, работающих с большим объёмом запросов и парсинга.

Ключевые библиотеки:

  • reqwest — HTTP-клиент (в примерах используется blocking-режим для простоты).
  • scraper — парсер HTML, работающий через CSS-селекторы.
  • html5ever (при необходимости) — более низкоуровневый HTML-парсер.

Быстрый старт: проект и зависимости

Создайте новый проект и добавьте зависимости в файл Cargo.toml:

[dependencies]
reqwest = { version = "0.11", features = ["blocking"] }
scraper = "0.12.0"

Этот набор подходит для простых однопоточных задач. Для высоконагруженных решений рекомендуют асинхронный reqwest и пул потоков.

Получение страницы с reqwest

Простейший способ получить HTML — отправить GET-запрос и взять текст ответа:

fn retrieve_html() -> String {
    let response = reqwest::blocking::get("https://news.ycombinator.com").unwrap().text().unwrap();
    return response;
}

Пояснение: get отправляет запрос, text() возвращает тело ответа как строку. В реальном коде никогда не используйте unwrap() без обработки ошибок — используйте Result и логирование.

Парсинг HTML с помощью scraper

Модуль scraper предоставляет Html для разбора документа и Selector для поиска элементов по CSS-селекторам.

Пример: извлечь заголовки со страницы Hacker News:

use scraper::{Html, Selector};

fn main() {
    let response = reqwest::blocking::get("https://news.ycombinator.com/").unwrap().text().unwrap();

    // parse the HTML document
    let doc_body = Html::parse_document(&response);

    // select the elements with titleline class
    let title = Selector::parse(".titleline").unwrap();

    for title in doc_body.select(&title) {
        let titles = title.text().collect::>();
        println!("{}", titles[0])
    }
}

Пошагово:

  1. Разбираем документ через Html::parse_document.
  2. Создаём селектор через Selector::parse(".titleline").
  3. Перебираем найденные элементы и читаем текстовые узлы.

результат извлечения заголовков со страницы

Извлечение атрибутов (href, src и др.)

Чтобы получить значение атрибута, найдите нужный элемент и используйте value().attr("имя"):

use reqwest::blocking::get;
use scraper::{Html, Selector};

fn main() {
    let response = get("https://news.ycombinator.com").unwrap().text().unwrap();
    let html_doc = Html::parse_document(&response);
    let class_selector = Selector::parse(".titleline").unwrap();

    for element in html_doc.select(&class_selector) {
        let link_selector = Selector::parse("a").unwrap();

        for link in element.select(&link_selector) {
            if let Some(href) = link.value().attr("href") {
                println!("{}", href);
            }
        }
    }
}

Результат — список URL из тега .

результат извлечения URL-адресов со страницы

Практические приёмы: устойчивость и корректность

Пример установки заголовка User-Agent:

Когда это не сработает (противопоказания)

Альтернативные подходы

Ментальные модели и эвристики

Чек-листы по ролям

Разработчик:

DevOps/Инфраструктура:

Продукт/Аналитика:

Критерии приёмки

Тесты и приёмка

Тестовые случаи:

Безопасность и приватность

Важно: всегда проверяйте условия использования сайта и правовые ограничения на обработку данных.

Быстрый cheat-sheet селекторов

Резюме

Веб-скрапинг на Rust — это мощный инструмент для тех, кому нужна производительность и контроль над ресурсами. Для большинства задач достаточно комбинации reqwest + scraper. Для динамического контента применяйте headless-браузеры. Всегда учитывайте юридические и этические ограничения и проектируйте систему с наблюдаемостью и обработкой ошибок.

Короткое резюме:

Автор
Редакция

Похожие материалы

Ошибка Invalid plugin detected в Adobe Acrobat — как исправить
Техподдержка

Ошибка Invalid plugin detected в Adobe Acrobat — как исправить

Установка Akkoma на Raspberry Pi
Самохостинг

Установка Akkoma на Raspberry Pi

Исправление ошибки Xbox 0x80270254 — причины и решения
Техподдержка Xbox

Исправление ошибки Xbox 0x80270254 — причины и решения

Добавить личную заметку в профиль Zoom
Productivity

Добавить личную заметку в профиль Zoom

Исправить ошибку Netflix E100 — руководство
Стриминг

Исправить ошибку Netflix E100 — руководство

Сброс пульта Amazon Fire TV Stick
Руководство

Сброс пульта Amazon Fire TV Stick