Если вы ищете решение, использующее Puppeteer и Express.js для извлечения данных консультантов из каталога консультантов BetterHelp, вы обратились по адресу. В этой статье я проведу вас через создание приложения для парсинга веб-страниц, которое позволит вам самостоятельно запустить скрипт и получить результаты в течение нескольких часов. Мы будем использовать Puppeteer для парсинга веб-страниц и Express.js для создания простого сервера, запускающего процесс парсинга. Давайте начнем!

Предпосылки

Прежде чем мы начнем, убедитесь, что на вашем компьютере установлены Node.js и npm (диспетчер пакетов Node). Вы можете скачать их с официального сайта Node.js: https://nodejs.org

Шаг 1. Настройте проект

  1. Создайте новый каталог проекта для вашего веб-приложения.
  2. Откройте терминал или командную строку и перейдите в каталог проекта.
  3. Инициализируйте новый проект Node.js, выполнив следующую команду:
npm init -y

Это создаст файл package.json в каталоге вашего проекта.

Шаг 2: Установите зависимости

Нам нужно установить Puppeteer и Express.js в качестве зависимостей для нашего проекта. Выполните следующую команду, чтобы установить их:

npm install puppeteer express

Эта команда установит Puppeteer и Express.js и их зависимости в каталог проекта.

Шаг 3: Создайте сервер Express.js

  1. Создайте новый файл с именем server.js в каталоге вашего проекта.
  2. Откройте server.js в текстовом редакторе и добавьте следующий код:
const express = require('express');
const app = express();
const puppeteer = require('puppeteer');

const PORT = 3000; // Choose the desired port number

app.get('/', async (req, res) => {
  try {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    // Your scraping logic with Puppeteer goes here

    await browser.close();

    res.send('Scraping completed successfully!');
  } catch (error) {
    console.error('Scraping failed:', error);
    res.status(500).send('Scraping failed.');
  }
});

app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});

Шаг 4: Реализуйте логику парсинга с помощью Puppeteer

Внутри обработчика маршрута в server.js мы будем использовать Puppeteer для перехода к URL-адресу канала JSON и посещения страницы каждого консультанта для извлечения необходимой информации. Обновите код внутри блока try следующим образом:

const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.betterhelp.com/api/counselor_directory?show_all=1');

const data = await page.evaluate(() => {
  // Your scraping logic here
  // Extract the required information from the page and store it in a JavaScript object or array

  return scrapedData;
});

await browser.close();

Шаг 5: Извлеките необходимую информацию

Настройте логику очистки внутри функции page.evaluate(), чтобы извлечь нужную информацию. Используйте функции Puppeteer для навигации по странице и выбора элементов на основе селекторов CSS. Сохраните извлеченную информацию в объекте или массиве JavaScript, scrapedData.

Шаг 6: Запустите сервер

Сохраните изменения в server.js. Откройте терминал или командную строку, перейдите в каталог проекта и выполните следующую команду:

node server.js

Сервер начнет работать на http://localhost:3000 (или на указанном порту, если вы его изменили). Вы можете получить доступ к функции парсинга, посетив корневой URL-адрес (http://localhost:3000/).

Шаг 7: Подробная спецификация и генерация CSV

Чтобы сгенерировать файлы CSV в соответствии с вашими подробными спецификациями, вам необходимо обновить логику очистки внутри функции page.evaluate(), чтобы извлечь необходимую информацию и сохранить ее в объекте или массиве JavaScript.

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

const data = await page.evaluate(() => {
  const counselors = Array.from(document.querySelectorAll('.counselor-card'));

  const topInfo = counselors.map((counselor) => {
    const counselorName = counselor.querySelector('.counselor-card__name').innerText;
    const specialization = counselor.querySelector('.counselor-card__specialization').innerText;
    const location = counselor.querySelector('.counselor-card__location').innerText;
    const experience = counselor.querySelector('.counselor-card__experience').innerText;
    const bio = counselor.querySelector('.counselor-card__bio').innerText;

    return { counselorName, specialization, location, experience, bio };
  });

  return topInfo;
});

Чтобы извлечь информацию из части отзывов на странице, вы можете обновить логику очистки следующим образом:

const data = await page.evaluate(() => {
  const reviews = Array.from(document.querySelectorAll('.counselor-review'));

  const reviewsInfo = reviews.map((review) => {
    const reviewerName = review.querySelector('.counselor-review__name').innerText;
    const rating = review.querySelector('.counselor-review__rating').innerText;
    const content = review.querySelector('.counselor-review__content').innerText;

    return { reviewerName, rating, content };
  });

  return reviewsInfo;
});

Получив извлеченную информацию в переменной data, вы можете сгенерировать CSV-файлы с помощью такой библиотеки, как csv-writer. Установите его, выполнив следующую команду:

npm install csv-writer

Затем обновите обработчик маршрута в server.js, чтобы сгенерировать и сохранить файлы CSV:

const createCsvWriter = require('csv-writer').createObjectCsvWriter;

// ...

app.get('/', async (req, res) => {
  try {
    // ...

    const csvWriter = createCsvWriter({
      path: 'top_info.csv',
      header: [
        { id: 'counselorName', title: 'Counselor Name' },
        { id: 'specialization', title: 'Specialization' },
        { id: 'location', title: 'Location' },
        { id: 'experience', title: 'Experience' },
        { id: 'bio', title: 'Bio' },
      ],
    });

    await csvWriter.writeRecords(data);

    // Generate and save the second CSV file for reviews information

    res.send('Scraping completed successfully!');
  } catch (error) {
    // ...
  }
});

Шаг 8: Ограничение скорости очистки

Чтобы ограничить скорость очистки и избежать перегрузки сервера или нарушения каких-либо ограничений скорости, вы можете ввести задержку между каждым запросом. Один из способов добиться этого — использовать await с setTimeout() внутри цикла. Например, вы можете изменить цикл, который посещает URL-адрес каждого консультанта, следующим образом:

for (const counselor of counselors) {
  const counselorSlug = counselor.getAttribute('slug');
  const counselorURL = `https://www.betterhelp.com/${counselorSlug}`;

  // Visit the counselor's URL and extract information

  // Add a delay of 1 second before the next iteration
  await new Promise((resolve) => setTimeout(resolve, 1000));
}

Это приведет к задержке в 1 секунду между каждым запросом, что позволит снизить скорость парсинга.

Заключение

Следуя шагам, описанным в этой статье, вы можете создать приложение для парсинга веб-страниц, используя Puppeteer и Express.js, чтобы собирать данные консультантов из каталога консультантов BetterHelp. Вы сможете самостоятельно запускать скрипт, генерировать CSV-файлы, содержащие необходимую информацию, и контролировать скорость парсинга, вводя задержки между запросами. Не забывайте корректно обрабатывать ошибки и настраивать логику парсинга в соответствии с вашими конкретными требованиями. Удачного скрейпинга!