Веб-скраппинг на TypeScript

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

В этом руководстве я познакомлю вас с основами веб-скрапинга с помощью TypeScript. Мы разберем все: от настройки проекта до более сложных задач веб-скрейпинга, например работы с несколькими страницами. К концу вы сможете легко и уверенно создавать собственные скрипты веб-скрейпинга на TypeScript. Поехали!

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

TypeScript предлагает несколько преимуществ по сравнению с обычным JavaScript, особенно для крупных проектов. Вот некоторые ключевые причины, по которым TypeScript отлично подходит для веб-скрапинга:

  • Strong Typing: Строгая типизация TypeScript помогает избежать многих ошибок, которые часто возникают в JavaScript. Это особенно важно для крупных проектов веб-скрейпинга, где обрабатывается большой объем данных.
  • Code Readability: TypeScript предоставляет аннотации типов, благодаря которым код становится более читаемым и простым в поддержке. Это может сэкономить вам время при отладке или возврате к проекту.
  • Совместимость с библиотеками JavaScript: TypeScript полностью совместим с JavaScript, так что вы по-прежнему можете использовать популярные JavaScript-библиотеки, такие как Axios и Cheerio для веб-скрапинга.

Хотя Python традиционно является самым популярным языком для веб-скрапинга, типобезопасность TypeScript и его интеграция с библиотеками JavaScript делают его отличным выбором для разработчиков, знакомых с этим языком.

Пререквизиты

Перед началом убедитесь, что на вашем компьютере уже настроено несколько вещей:

Node.js: Ensure that Node.js is installed on your computer. You can download the latest version from the Node.js official website.

TypeScript: Вам нужно глобально установить TypeScript в системе. Сделать это можно, выполнив в терминале следующую команду:

npm install -g typescript

Text Editor/IDE: Используйте любую IDE с поддержкой TypeScript, например Visual Studio Code.

Когда все будет настроено, можно приступать к написанию скрапера!

Настройка проекта

Создайте папку проекта: Сначала создайте новую папку для проекта. Откройте терминал и выполните:

mkdir web-scraper-typescript
cd web-scraper-typescript

Инициализируйте проект: Run the following command to set up a new Node.js project:

npm init -y

This command will generate a package.json file.

Initialize TypeScript: Затем инициализируйте TypeScript в проекте, выполнив:

npx tsc - init

This will create a tsconfig.json file that contains configuration options for TypeScript.

Install Dependencies: Для веб-скрапинга мы будем использовать два ключевых пакета: Axios для отправки HTTP-запросов и Cheerio для парсинга HTML. Установите их следующими командами:

npm install axios cheerio
npm install - save-dev @types/node @types/cheerio

The @types/ packages provide TypeScript definitions for Node.js and Cheerio, enabling code completion and type checking.

Написание первого скрапера

Теперь, когда окружение настроено, пора написать ваш первый веб-скрапер. В этом примере мы соберём информацию о товарах из интернет-магазина. Вот шаги:

Шаг 1: Отправьте HTTP GET-запрос

Первый шаг — получить HTML-содержимое страницы, с которой вы хотите собрать данные. Мы будем использовать Axios для отправки HTTP GET-запроса.

импорт axios с сайта "axios";
async функция scrapeSite() {
const ответ = ожидайте axios.получить("https://www.example.com");
const html = response.data;
консоль.журнал(html);
}
scrapeSite();

В этом коде:

  • axios.get() используется для выполнения GET-запроса.
  • response.data содержит HTML-разметку страницы.

Шаг 2: Разбор HTML-контента

Когда HTML получен, его нужно разобрать, чтобы извлечь данные. Здесь на помощь приходит Cheerio. Cheerio - быстрый, лёгкий HTML-парсер, который повторяет синтаксис jQuery.

импорт axios с сайта "axios";
импорт { load } с сайта "cheerio";
async функция scrapeSite() {
const ответ = ожидайте axios.получить("https://www.example.com");
const html = response.data;
const $ = загрузка(html);
// Extract data using Cheerio
const title = $("h1").текст();
консоль.журнал(title);
}
scrapeSite();

В этом коде:

  • load(html) инициализирует Cheerio с HTML-контентом.
  • $(“h1”).text() выбирает первый найденный элемент

    элемент и извлекает его текст.

Шаг 3: Извлечение данных из конкретных элементов

Теперь, когда мы знаем, как парсить HTML, давайте извлечем конкретные сведения о товарах, такие как название, цена и URL каждого товара. Предположим, что каждый товар находится внутри

с классом product. Мы можем извлечь информацию так:
импорт axios с сайта "axios";
импорт { load } с сайта "cheerio";
async функция scrapeSite() {
const ответ = ожидайте axios.получить("https://www.example.com/products");
const html = response.data;
const $ = загрузка(html);
$("div.product").each((i, productпрокси {
const name = $(product).find("h2").текст();
const price = $(product).find(".price").текст();
const url = $(product).find("a").attr("href");
консоль.журнал(`Product Name: ${name}`);
консоль.журнал(`Price: ${price}`);
консоль.журнал(`URL: ${url}`);
});
}
scrapeSite();

Вот:

  • $(“div.product”).each() перебирает все элементы товаров на странице.
  • find() используется для поиска конкретных дочерних элементов, таких как название товара, цена и URL.

Шаг 4: Сохранение данных в массиве

Если вы хотите сохранить собранные данные для дальнейшей обработки (например, для экспорта в CSV-файл), вы можете помещать их в массив. Давайте создадим тип Product и сохраним извлечённые данные в массиве:

импорт axios с сайта "axios";
импорт { load } с сайта "cheerio";
type Product = {
name: string;
price: string;
url: string;
};
async функция scrapeSite() {
const ответ = ожидайте axios.получить("https://www.example.com/products");
const html = response.data;
const $ = загрузка(html);
const продукция: Product[] = [];
$("div.product").each((i, productпрокси {
const name = $(product).find("h2").текст();
const price = $(product).find(".price").текст();
const url = $(product).find("a").attr("href");
const productData: Product = {
name: name,
price: цена,
url: url
};
products.push(productData);
});
консоль.журнал(products);
}
scrapeSite();

Шаг 5: Сохранение данных в CSV

Для сохранения собранных данных в CSV-файл можно использовать библиотеки вроде fast-csv. Сначала установите пакет fast-csv:

npm install fast-csv

Затем измените ваш скрапер, чтобы сохранять данные в CSV-файл:

импорт axios с сайта "axios";
импорт { load } с сайта "cheerio";
импорт { writeToPath } с сайта "@fast-csv/format";
type Product = {
name: string;
price: string;
url: string;
};
async функция scrapeSite() {
const ответ = ожидайте axios.получить("https://www.example.com/products");
const html = response.data;
const $ = загрузка(html);
const продукция: Product[] = [];
$("div.product").each((i, productпрокси {
const name = $(product).find("h2").текст();
const price = $(product).find(".price").текст();
const url = $(product).find("a").attr("href");
const productData: Product = {
name: name,
price: цена,
url: url
};
products.push(productData);
});
writeToPath("products.csv", products, { заголовки: true })
.на("error", (ошибкапрокси консоль.ошибка(error));
}
scrapeSite();

This script will save the scraped data to a file called products.csv.

Шаг 6: Скрапинг нескольких страниц (пагинация)

На многих сайтах товары разбиты на несколько страниц. Чтобы собрать данные с нескольких страниц, нужно переходить по ссылкам пагинации. Это можно сделать, проверив наличие ссылки на следующую страницу «Next» и собрав данные с неё.

Вот как можно собирать данные с нескольких страниц:

импорт axios с сайта "axios";
импорт { load } с сайта "cheerio";
async функция scrapeSite() {
пусть currentPage = 1;
const продукция: Product[] = [];
в то время как (currentPage <= 5) {
const ответ = ожидайте axios.получить(`https://www.example.com/products?page=${currentPage}`);
const html = response.data;
const $ = загрузка(html);
$("div.product").each((i, productпрокси {
const name = $(product).find("h2").текст();
const price = $(product).find(".price").текст();
const url = $(product).find("a").attr("href");
const productData: Product = {
name: name,
price: цена,
url: url
};
products.push(productData);
});
currentPage  ;
}
writeToPath("products.csv", products, { заголовки: true })
.на("error", (ошибкапрокси консоль.ошибка(error));
}
scrapeSite();

В этом примере мы используем цикл while, чтобы собрать данные с пяти страниц товаров.

Advanced Techniques

Работа с динамическими страницами с помощью Puppeteer

Если содержимое страницы динамически загружается через JavaScript, Cheerio может оказаться недостаточно. В таких случаях можно использовать Puppeteer, headless-браузер, чтобы собирать данные. Puppeteer умеет рендерить JavaScript и давать доступ к итоговому содержимому.

Install Puppeteer:

npm install puppeteer

Затем вы можете написать скрипт для сбора данных со страниц, отрисовываемых динамически.

Как избегать обнаружения и блокировок

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

  • Rotate User Agents: Используйте другие строки user-agent чтобы ваши запросы выглядели так, будто они приходят из разных браузеров.
  • Proxy Rotation: Используйте прокси, чтобы скрыть свой IP-адрес. Посмотрите мой список лучшие ротирующиеся прокси.
  • Throttling Requests: Ограничьте частоту запросов, чтобы не сработали механизмы rate limiting.

Заключение

TypeScript — мощный инструмент для веб-скрапинга, который даёт преимущества строгой типизации, простой интеграции с библиотеками JavaScript и масштабируемости для крупных проектов. Следуя этому пошаговому туториалу, вы узнали, как настроить окружение, написать базовые скраперы, собрать данные с нескольких страниц и сохранить их в CSV-файл.

Теперь, когда основы рассмотрены, вы можете перейти к более продвинутым техникам, например к работе с динамическими страницами с помощью Puppeteer и к обходу обнаружения с использованием прокси. Мощные возможности TypeScript сделают ваши проекты по веб-скрапингу более надёжными и простыми в сопровождении. Удачного скрапинга!

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