Как скрести веб-страницы с помощью Cheerio в Node.js
Here, I’ll show you how to scrape data from websites using Cheerio in Node.js. We’ll go step-by-step through the process: setting up your project, making HTTP requests, and extracting the necessary data. By the end of this guide, you’ll know how to collect and save data in a clean format, like JSON, making it easy to use for your projects. Ready to dive in? Let’s get started!
Что такое Cheerio?
Cheerio is a fast and lightweight JavaScript library built on top of htmlparser2. It allows you to work with HTML in a very similar way to jQuery, making it easy to select, manipulate, and extract data from HTML documents. Cheerio is designed for use in server-side environments like Node.js, which makes it a perfect choice for web scraping tasks.
Since Cheerio is built for Node.js, it’s not intended to render or simulate a browser, like Puppeteer or Playwright. Instead, it operates directly on the HTML markup of a page, allowing you to parse and interact with it efficiently.
Cheerio предлагает синтаксис, похожий на jQuery, который легко понять, что делает его отличным инструментом как для новичков, так и для опытных разработчиков. Не уверены, что выбрать: Cheerio или BeautifulSoup? Ознакомьтесь с нашей статьей о Cheerio против BeautifulSoup.
Skip Manual Scraping
Если вы хотите пропустить ручной веб-скрейпинг, я подготовил подробные списки лучшие сайты с датасетами и лучшие инструменты для скрапбукингаА теперь продолжим наше руководство!
Пререквизиты
Прежде чем начать, вам нужно настроить на компьютере несколько вещей:
- Node.js: Среда выполнения JavaScript, которая будет исполнять наш код для скрейпинга.
- npm (Node Package Manager): Это понадобится для установки библиотек, необходимых для проекта.
- Текстовый редактор кода: Use Visual Studio Code или Sublime Text для написания и запуска кода.
If you’re not sure whether you have Node.js and npm installed, you can check by opening your terminal (or command prompt) and typing:
node -v
npm -v
If these commands return version numbers, you’re good to go! Otherwise, download and install Node.js from nodejs.org.
Настройка проекта
Let’s begin by setting up a simple Node.js project where we will install Cheerio and Axios (a popular HTTP client for making requests). Follow these steps to set up your project:
Шаг 1: Создайте каталог проекта
Начните с создания папки для проекта. Откройте терминал и выполните следующую команду, чтобы создать новый каталог:
mkdir cheerio-web-scraping
cd cheerio-web-scraping
Это создаст новую папку с именем cheerio-web-scraping и перенесет вас в нее.
Step 2: Initialize a Node.js Project
Next, initialize a new Node.js project. This will create a package.json file to manage your project’s dependencies:
npm init -y
The -y flag automatically answers “yes” to all the prompts, creating the package.json file with default values.
Шаг 3: Установите зависимости
Теперь установим Cheerio и Axios. В терминале выполните:
npm install cheerio axios
- Cheerio Это библиотека, которую мы будем использовать для парсинга и обработки HTML.
- Axios Это HTTP-клиент, который упрощает отправку запросов на сайты и получение их HTML-кода.
Шаг 4: Создайте свой первый скрипт
Create a new file in the project folder named index.js. This will be the main file where you write your scraping code.
Теперь, когда мы настроили проект, пора писать скрипт для скрейпинга веб-страниц!
Сбор данных со страницы с помощью Cheerio
Let’s start by scraping a simple webpage. For this example, we’ll scrape an e-commerce website and collect product details like the image, name, and price. But before we begin scraping, let’s inspect the page’s structure.
Анализ страницы
В этом примере мы будем собирать товары из демо-интернет-магазина. Сначала откройте сайт, который хотите скрейпить, в браузере и используйте инструменты разработчика браузера (щелкните правой кнопкой мыши по странице и выберите “Inspect” в Chrome или Firefox), чтобы изучить структуру HTML.
Ищите паттерны, например имена классов или HTML-элементы, содержащие нужные вам данные. В данном случае предположим, что мы хотим собрать для каждого продукта следующие данные:
- URL изображения товара
- Название товара
- Цена товара
Создание скрейпера
With the page inspected and the structure identified, it’s time to write the scraping code. Open your index.js file and add the following code:
const axios = требуется('axios');
const cheerio = требуется('cheerio');
const fs = требуется('fs');
// URL of the website we want to scrape
const targetURL = 'https://www.example.com/products';
// Function to scrape product data
const getProducts = ($) => {
// Select all product items on the page
const products = $('.product-item');
const productData = [];
// Loop through each product item
products.each((index, elementпрокси {
const product = {};
// Extract the product image URL
product.img = $(element).find('img').attr('src');
// Extract the product name
product.name = $(element).find('.product-name').текст();
// Extract the product price
product.price = $(element).find('.product-price').текст();
// Push the product data into the array
productData.push(product);
});
// Save the scraped data to a JSON file
fs.writeFile('products.json', JSON.stringify(productData, null, 2), (Ошибкапрокси {
если (err) {
консоль.ошибка('Error writing data to file:', err);
возврат;
}
консоль.журнал('Data written to products.json');
});
};
// Fetch the HTML of the page using Axios
axios.получить(targetURL) .затем(ответ => {
const $ = cheerio.загрузка(response.data);
getProducts($); // Call the function to scrape the products
})
.поймать(ошибка => {
консоль.ошибка('Error fetching the page:', error);
});
Как работает этот код
Отправка HTTP-запроса:
- Мы используем Axios, чтобы отправить GET-запрос к веб-странице, которую хотим спарсить (targetURL).
- Данные ответа - это HTML-контент страницы.
Парсинг HTML с Cheerio:
We load the HTML response using Cheerio (cheerio.load(response.data)), which gives us a jQuery-like interface to interact with the HTML.
Extracting Data:
- Мы используем селекторы Cheerio ($(‘.product-item’), $(element).find(‘img’), и т. д.), чтобы находить на странице конкретные элементы.
- Для каждого товара мы извлекаем URL изображения, название товара и цену.
Сохранение данных:
The data is stored in an array (productData), and once all products are scraped, we write the data to a JSON file using fs.writeFile.
Запуск скрейпера
Чтобы запустить скрейпер, откройте терминал, перейдите в папку проекта и выполните:
node index.js
After the script completes, a file called products.json will be created in your project folder, containing the scraped data.
Обработка ошибок и крайних случаев
При скрейпинге важно обрабатывать возможные ошибки. Например, веб-страница, которую вы скрейпите, может не загрузиться, или структура HTML может измениться. Вот несколько способов справляться с такими проблемами:
Проверка HTTP-ошибок: Always handle HTTP errors (e.g., 404 or 500 errors) gracefully. Axios has a built-in .catch() method to handle errors.
Missing Data: Не у каждого продукта могут быть все элементы. Чтобы корректно обработать отсутствие данных, можно проверить, существует ли элемент, прежде чем обращаться к его значению:
product.img = $(element).find('img').attr('src') || 'default-image.jpg';
Ограничение частоты запросов и блокировки: Некоторые сайты могут блокировать ботов-скрейперов. Чтобы этого избежать, можно:
- Добавляйте задержки между запросами.
- Используйте сервисы с ротацией прокси.
- Respect the website’s robots.txt file, which indicates the site’s scraping policy.
Заключение
And there you have it! Now you know how to scrape web pages using Cheerio in Node.js. We covered everything from setting up your project and making HTTP requests to parsing the HTML and saving the data in a clean JSON file.
Веб-скрейпинг — невероятно полезный инструмент, но всегда помните о необходимости соблюдать условия использования сайта. Некоторые сайты не разрешают скрейпинг, а у других могут быть антибот-механизмы. Поэтому убедитесь, что ваш скрейпер готов к таким трудностям. С этими базовыми знаниями вы можете начать собирать нужные данные с любого сайта. Удачного скрейпинга и успехов в ваших проектах!

