CoderCastrov logo
CoderCastrov
Node.js

Как парсить товары на Amazon с использованием Node.js и Puppeteer

Как парсить товары на Amazon с использованием Node.js и Puppeteer
просмотров
5 мин чтение
#Node.js

Привет! Вы когда-нибудь хотели извлечь данные из обширной базы данных товаров Amazon для исследования рынка, мониторинга цен или анализа конкурентов? Не ищите дальше! В этом руководстве мы рассмотрим, как использовать Node.js и Puppeteer, популярную библиотеку для управления браузером Chrome или Chromium без графического интерфейса, чтобы спарсить некоторые случайные товары на Amazon.

Прежде чем продолжить, важно отметить, что Amazon может использовать различные техники для предотвращения или обнаружения парсинга, такие как капчи или блокировка IP-адресов. Поэтому важно использовать парсинг ответственно и этично, чтобы избежать блокировки :)

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


1. Создание проекта Node.js

В первую очередь вам необходимо установить Node.js на свой компьютер. Вы можете скачать его с официального веб-сайта: https://nodejs.org/en/download/

После установки Node.js откройте терминал или командную строку и перейдите в каталог, в котором вы хотите создать свой проект.

mkdir amazon-puppeteer && cd amazon-puppeteer

В вашем новом каталоге, для создания нового проекта Node.js выполните следующую команду:

npm init

Следуйте подсказкам, чтобы настроить ваш проект. Это создаст файл package.json в вашем проектном каталоге.

Вот и все! Ваш проект Node.js готов!

2. Установка Puppeteer

Сначала вам нужно установить Puppeteer, который является библиотекой Node.js для управления безголовым Chrome или Chromium. Эта библиотека позволит вам имитировать веб-браузер и взаимодействовать с веб-страницами программно.

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

npm install puppeteer

3. Напишите скрипт

Теперь начнем серьезную работу. Создайте новый файл в вашем проектном каталоге с именем scrape.js. В нем будет содержаться скрипт для парсинга товаров на Amazon. В этом новом файле импортируйте Puppeteer и создайте асинхронную функцию с именем scrapeProducts:

const puppeteer = require('puppeteer');

const scrapeProducts = async () => {
  // ваш код здесь
}

Внутри функции scrapeProducts запустите новый экземпляр Puppeteer и создайте новую страницу:

const browser = await puppeteer.launch();
const page = await browser.newPage();

Используйте метод page.goto для перехода на веб-сайт Amazon и поиска товара. Например, для поиска "JavaScript book" вы можете использовать следующий код:

await page.goto('https://www.amazon.com/');
await page.type('#twotabsearchtextbox', 'JavaScript book');
await page.click('#nav-search-submit-text');
await page.waitForNavigation();

Затем используйте метод page.evaluate для извлечения данных из результатов поиска. Например, для извлечения заголовка, цены и URL изображения товаров вы можете использовать следующий код:

const products = await page.evaluate(() => {
    let results = [];
    const items = document.querySelectorAll(".s-result-item .s-card-border");
    for (let i = items.length; i--; ) {
      const item = items[i];
      const title = item.querySelector("h2 > a > span");
      const price = item.querySelector(".a-price-whole");
      const cents = item.querySelector(".a-price-fraction");
      const image = item.querySelector("img");
      if (!title || !price || !image) continue;
      results = [...results, {
        title: title.innerText,
        price: parseFloat(`${parseInt(price.innerText)}.${parseInt(cents.innerText)}`),
        image: image.getAttribute("src")
      }]
    }
    return results;
  });

  console.log(products);

Наконец, закройте браузер:

await browser.close();

Весь скрипт должен выглядеть следующим образом:

const puppeteer = require("puppeteer");

const scrapeProducts = async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto("https://www.amazon.com/");
  await page.type("#twotabsearchtextbox", "JavaScript book");
  await page.click("#nav-search-submit-text");
  await page.waitForNavigation();
  const products = await page.evaluate(() => {
    let results = [];
    const items = document.querySelectorAll(".s-result-item .s-card-border");
    for (let i = items.length; i--; ) {
      const item = items[i];
      const title = item.querySelector("h2 > a > span");
      const price = item.querySelector(".a-price-whole");
      const cents = item.querySelector(".a-price-fraction");
      const image = item.querySelector("img");
      if (!title || !price || !image) continue;
      results = [...results, {
        title: title.innerText,
        price: parseFloat(`${parseInt(price.innerText)}.${parseInt(cents.innerText)}`),
        image: image.getAttribute("src")
      }]
    }
    return results;
  });
  console.log(products);
  await browser.close();
}

scrapeProducts();

Имейте в виду, что в нашем примере мы используем DOM для парсинга товаров. Часто можно использовать API вместо прямого парсинга DOM. Многие веб-сайты предлагают API (интерфейсы прикладного программирования), которые позволяют разработчикам получать доступ к данным более структурированным и организованным способом.

Использование API для доступа к данным может быть более надежным и эффективным, чем прямой парсинг DOM, поскольку оно предоставляет более стабильный и предсказуемый способ доступа к данным. API обычно предоставляют доступ к данным в машинно-читаемом формате, таком как JSON или XML, которые легко обрабатываются и манипулируются программным обеспечением.

И если по какой-то причине вы не можете вызвать API напрямую с помощью Axios или Fetch, например, всегда можно перехватить данные. Puppeteer предоставляет метод page.setRequestInterception, который позволяет перехватывать и изменять запросы, сделанные страницей. Когда вы настраиваете перехват запросов, Puppeteer вызывает функцию обратного вызова для каждого запроса, сделанного страницей, и вы можете изменить запрос или полностью заблокировать его. Это может быть полезно, например, если вы хотите заблокировать все изображения, чтобы сделать свой парсер более эффективным.

Ну вот! Мы сделали самую сложную часть! Теперь давайте запустим наш скрипт!

4. Запуск и парсинг :)

Запустите следующую команду, находясь внутри вашей директории, чтобы выполнить файл scrape.js:

node scrape.js

Выводом должен быть массив объектов, содержащих заголовок, цену и URL изображения продуктов, соответствующих поисковому запросу:

[
  {
    title: 'Структуры данных и алгоритмы на JavaScript: Применение классических подходов к вычислениям в вебе',
    price: 32.57,
    image: 'https://m.media-amazon.com/images/I/71wQtUgJMDL._AC_UL320_.jpg'
  },
...
]

Вот и все! Теперь вы знаете, как парсить продукты на Amazon с использованием Node.js и Puppeteer.


Не будьте слишком грубыми с парсингом

Есть несколько причин, почему парсинг веб-сайтов может быть рискованным занятием:


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

С этим в виду, приятного парсинга веба :)

Лео Г. - Medium

Читайте записи Лео Г. на Medium. Разработчик программного обеспечения | Технический писатель | Давайте свяжемся! | leogbrt@pm.me. Каждый день...

medium.com


Вы можете найти код выше в этом репозитории GitHub.

_Документация Puppeteer: _https://pptr.dev/

P.S. Эта статья написана в марте 2023 года. В зависимости от развития DOM Amazon, скрипт может не работать к моменту вашего прочтения. Если это так, пожалуйста, дайте мне знать.