Если вы ищете решение, использующее Puppeteer и Express.js для извлечения данных консультантов из каталога консультантов BetterHelp, вы обратились по адресу. В этой статье я проведу вас через создание приложения для парсинга веб-страниц, которое позволит вам самостоятельно запустить скрипт и получить результаты в течение нескольких часов. Мы будем использовать Puppeteer для парсинга веб-страниц и Express.js для создания простого сервера, запускающего процесс парсинга. Давайте начнем!
Предпосылки
Прежде чем мы начнем, убедитесь, что на вашем компьютере установлены Node.js и npm (диспетчер пакетов Node). Вы можете скачать их с официального сайта Node.js: https://nodejs.org
Шаг 1. Настройте проект
- Создайте новый каталог проекта для вашего веб-приложения.
- Откройте терминал или командную строку и перейдите в каталог проекта.
- Инициализируйте новый проект Node.js, выполнив следующую команду:
npm init -y
Это создаст файл package.json
в каталоге вашего проекта.
Шаг 2: Установите зависимости
Нам нужно установить Puppeteer и Express.js в качестве зависимостей для нашего проекта. Выполните следующую команду, чтобы установить их:
npm install puppeteer express
Эта команда установит Puppeteer и Express.js и их зависимости в каталог проекта.
Шаг 3: Создайте сервер Express.js
- Создайте новый файл с именем
server.js
в каталоге вашего проекта. - Откройте
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-файлы, содержащие необходимую информацию, и контролировать скорость парсинга, вводя задержки между запросами. Не забывайте корректно обрабатывать ошибки и настраивать логику парсинга в соответствии с вашими конкретными требованиями. Удачного скрейпинга!