Selenium — популярный фреймворк для автоматизации веб-браузеров с открытым исходным кодом, который в основном используется для автоматизации тестирования браузеров. Кроме того, его можно также использовать для решения проблем динамического веб-скрапинга.
Selenium имеет 3 основных компонента:
Что такое Browserless?
Nstbrowserless — это облачный сервис headlesschrome, который выполняет веб-операции и запускает автоматизационные скрипты без необходимости графического интерфейса. Он особенно полезен для автоматизации задач, таких как веб-скрапинг и другие автоматизированные процессы.
Хорош ли Browserless для веб-скрапинга?
Да, абсолютно! Nstbrowserless может выполнять сложный веб-скрапинг и любые другие автоматизационные задачи в облаке. Он освободит ресурсы локального сервиса и хранения на ваших устройствах. Nstbrowserless работает с анти-детект браузером и функцией headlesschrome. Теперь не нужно волноваться о том, что вас обнаружат и блокируют веб-сайты.
Комбинирование Browserless и Selenium улучшает автоматизацию веба, позволяя Selenium выполнять тестовые скрипты в облачной среде headlesschrome, предоставляемой Browserless. Такая настройка эффективна для масштабных задач, таких как веб-скрапинг, так как она устраняет необходимость в физическом браузере, при этом обрабатывая динамическое содержимое и пользовательские взаимодействия.
У вас есть замечательные идеи и сомнения по поводу веб-скрапинга и Browserless?
Посмотрите, что еще разработчики обсуждают на Discord и Telegram!
Используя Node.js в Selenium, разработчики могут управлять headlesschrome для выполнения различных операций, таких как веб-скрапинг, автоматизированное тестирование, создание скриншотов и т.д.
Эта комбинация использует эффективные, не блокирующие функции Node.js и возможности браузера headlesschrome для достижения эффективной автоматизации и обработки данных.
Введите следующую команду в терминале:
npm install selenium-webdriver
Если терминал сообщает об ошибке, проверьте, установлен ли у вас Node.js:
node --version
Нет среды Node.js? Установите последнюю версию среды Node.js сначала.
Selenium известен своими мощными возможностями автоматизации браузера. Он поддерживает большинство основных браузеров, включая Chrome, Firefox, Edge, Opera, Safari и Internet Explorer.
Так как Chrome является самым популярным и мощным из них, вы будете использовать его в этом учебнике.
import { Builder, Browser } from 'selenium-webdriver';
async function run() {
const driver = new Builder()
.forBrowser(Browser.CHROME)
.build();
await await driver.get('https://www.yahoo.com/');
}
Вы также можете добавить любую персонализацию, которую хотите. Давайте сделаем наши скрипты headlesschrome:
import { Builder, Browser } from 'selenium-webdriver';
import chrome from 'selenium-webdriver/chrome';
const options = new chrome.Options();
options.addArguments('--remote-allow-origins=*');
options.addArguments('--headless');
async function run() {
const driver = new Builder()
.setChromeOptions(option)
.forBrowser(Browser.CHROME)
.build();
await await driver.get('https://www.yahoo.com/');
}
Теперь вы можете посетить любой веб-сайт!
Как только вы получите полный HTML веб-страницы, вы можете перейти к извлечению требуемых данных. В этом случае давайте распарсим заголовки и содержимое всех новостей на странице.
Для выполнения этой задачи вам нужно:
DevTools — это незаменимый инструмент в веб-скрапинге. Он помогает вам исследовать текущий загруженный HTML, CSS и JavaScript. Вы также можете получить информацию о сетевых запросах, сделанных на страницу, и их времени загрузки.
CSS-селекторы и XPath-выражения — самые надежные стратегии выбора узлов. Вы можете использовать любой из них для нахождения элементов, но в этом учебнике, для простоты, мы будем использовать CSS-селекторы.
Используем DevTools для нахождения правильного CSS-селектора. Откройте целевую веб-страницу в вашем браузере и щелкните правой кнопкой мыши на элемент продукта > Инспектировать, чтобы открыть DevTools.

Вы видите, что структура каждого заголовка новости состоит из тега h3 и тега a, и мы можем использовать селектор h3[data-test-locator="stream-item-title"] для их нахождения.
Мы используем тот же метод, чтобы найти селектор p[data-test-locator="stream-item-summary"] для содержимого новостей.
Определите CSS-селектор, используя вышеуказанную информацию, и найдите продукт, используя методы findElements() и findElement().
Кроме того, используйте метод getText(), чтобы извлечь внутренний текст HTML-узла, и, наконец, сохраните извлеченные название и цену в массив.
const titlesArray = [];
const contentArray = [];
const newsTitles = await driver.findElements(By.css('h3[data-test-locator="stream-item-title"]'));
const newsContents = await driver.findElements(By.css('p[data-test-locator="stream-item-summary"]'));
for (let title of newsTitles) {
titlesArray.push(await title.getText());
}
for (let content of newsContents) {
contentArray.push(await content.getText());
}
Мы получили данные веб-скрапинга! Теперь нам нужно экспортировать их в CSV-файл.
Импортируйте встроенный модуль fs Node.js, который предоставляет функции для работы с файловой системой:
import fs from 'node';
Затем инициализируйте строковую переменную с названием newsData, содержащую строку заголовка с именами столбцов ("title, content\n").
let newsData = 'title,content\n';
Далее, пройдите по двум массивам (titlesArray и contentsArray), содержащим заголовки новостей и их содержимое. Для каждого элемента в массиве добавляйте строку после newsData, разделяя заголовок и содержимое запятой.
for (let i = 0; i < titlesArray.length; i++) {
newsData += `${titlesArray[i]},${contentsArray[i]}\n`;
}
Используйте функцию fs.writeFile() для записи строки newsData в файл с именем yahooNews.csv. Эта функция принимает три параметра: имя файла, данные для записи и функцию обратного вызова для обработки ошибок, возникших в процессе записи.
fs.writeFile("yahooNews.csv", newsData, err => {
if (err) {
console.error("Ошибка:", err);
} else {
console.log("Успешно!");
}
});
Запуская наш код, мы получим результат, подобный этому:

Поздравляю, вы научились использовать Selenium и headlesschrome: NodeJS для скрапинга.
Использование режима headlesschrome в Browserless может автоматически избегать обнаружения веб-сайта и блокировок в максимальной степени. Однако, комбинируя следующие стратегии, вы можете достичь более эффективного скрапинга и бесперебойной работы.
Ниже приведен пример кода, который использует Selenium и Node.js для имитации реального поведения пользователя. Код показывает, как установить User-Agent, имитировать операции мыши, обрабатывать динамическое содержимое, имитировать ввод с клавиатуры и управлять поведением браузера.
Перед использованием убедитесь, что у вас установлены selenium-webdriver и chromedriver.
const { Builder, By, Key, until } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const path = require('path');
// Запуск браузера
(async function example() {
// Настройка опций Chrome
let chromeOptions = new chrome.Options();
chromeOptions.addArguments('headless'); // Использовать режим headless
chromeOptions.addArguments('window-size=1280,800'); // Установить размер окна браузера
// Создание экземпляра WebDriver
let driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(chromeOptions)
.build();
try {
// Установка User-Agent и других заголовков запросов
await driver.executeCdpCmd('Network.setUserAgentOverride', {
userAgent: 'Ваш кастомный User-Agent',
});
// Переход на целевую страницу
await driver.get('https://example.com');
// Имитация движения мыши и кликов
let element = await driver.findElement(By.css('selector-for-clickable-element'));
await driver.actions().move({ origin: element }).click().perform();
// Случайное время ожидания
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
await sleep(Math.random() * 5000 + 2000); // Случайное ожидание от 2 до 7 секунд
// Обработка динамического контента и ожидание загрузки определенного элемента
await driver.wait(until.elementLocated(By.css('#dynamic-content')), 10000);
// Имитация ввода с клавиатуры
let searchInput = await driver.findElement(By.css('#search-input'));
await searchInput.sendKeys('Node.js', Key.RETURN);
// Случайная прокрутка
await driver.executeScript('window.scrollBy(0, window.innerHeight);');
} finally {
// Закрытие браузера
await driver.quit();
}
})();
Использование прокси-сервера для скрытия вашего реального IP-адреса может эффективно избегать блокировки IP. Вы можете выбрать прокси для смены IP-адреса для каждого запроса, чтобы снизить риск блокировки.
Контролируйте частоту скрапинга, чтобы избежать отправки большого количества запросов за короткий период времени, что может снизить вероятность активации механизмов против скрапинга. Установите подходящий временной интервал для отправки запросов, чтобы имитировать нормальное поведение пользователя.
Если веб-сайт использует CAPTCHA для защиты, вы можете использовать сторонний сервис распознавания CAPTCHA для автоматического решения этих задач или настроить Selenium для обработки CAPTCHA.
Некоторые веб-сайты используют отпечатки браузера для идентификации автоматизированных инструментов. Настройка различных отпечатков браузера или использование анти-детект браузера с встроенной функцией смены отпечатков может помочь обойти обнаружение веб-сайта.
Использование Browserless вместе с Selenium для обработки динамически загружаемого контента (например, запросов AJAX) может гарантировать, что все динамически отображаемые данные на веб-странице будут захвачены, а не только статическое содержимое.
Selenium предоставляет множество методов для нахождения элементов на странице, включая:
<input> или <button>, подходит для обширных поисков..class-name, подходит для быстрого нахождения элементов с определенными именами классов.#element-id, особенно эффективен для быстрого и точного нахождения конкретных элементов.div > p.class-name.//div[@id='example'].В Selenium WebDriver мы можем находить элементы на веб-странице с помощью метода find_element. Вам просто нужно добавить конкретные требования при его использовании. Например:
find_element_by_id: Найти элемент по его уникальному ID.find_element_by_class_name: Найти элемент по его имени CSS-класса.find_element_by_link_text: Найти элемент гиперссылки по тексту ссылки.В определенных ситуациях, таких как медленное сетевое соединение или браузер, ваш скрипт может неудачно завершаться или показывать непоследовательные результаты.
Вместо ожидания фиксированного интервала, выберите интеллектуальное ожидание, например, ожидание появления конкретного узла на странице. Это гарантирует, что веб-элементы правильно загружены перед взаимодействием с ними, снижая вероятность ошибок, таких как элемент не найден и элемент не взаимодействует.
Следующий фрагмент кода реализует стратегию ожидания. Метод until.elementsLocated определяет условие ожидания, гарантируя, что WebDriver будет ждать, пока указанный элемент не будет найден или пока не истечет максимальное время ожидания в 5000 миллисекунд (5 секунд).
const { Builder, By, until } = require('selenium-webdriver');
const yourElements = await driver.wait(until.elementsLocated(By.css('.your-css-selector')), 5000);
В Node.js вы можете делать скриншоты, просто вызывая функцию. Однако, есть некоторые соображения, чтобы гарантировать правильность захвата скриншотов:
import fs from 'node';
import { Builder, Browser } from 'selenium-webdriver';
async function screenshot() {
const driver = new Builder()
.forBrowser(Browser.CHROME)
.build();
await driver.get('https://www.yahoo.com/');
const pictureData = await driver.takeScreenshot();
fs.writeFileSync('screenshot.png', pictureData, 'base64');
}
screenshot();
Существует ли более простой способ выполнения всех специализированных задач? Конечно, есть! Nstbrowser предоставляет совершенно бесплатные услуги RPA. Просто настроив нужный рабочий процесс, вы легко сможете выполнить все требования скрапинга.
Получить данные элемента
Ожидание запроса
Скриншот
Одна из выдающихся функций использования инструмента автоматизации браузера, такого как Selenium, — это возможность использовать собственный JavaScript-движок браузера. Это означает, что вы можете внедрять и выполнять пользовательский JavaScript-код в контексте веб-страницы, с которой вы взаимодействуете.
const javascript = 'window.scrollBy(100, 100)';
await driver.executeScript(javascript);
В этом учебном пособии по Selenium Node.js вы узнали, как использовать headlesschrome с Selenium для настройки проекта WebDriver на Node.js, скрапинга данных с динамических веб-сайтов, взаимодействия с динамическим содержимым и решения общих проблем веб-скрапинга.
Теперь отличное время для создания собственного процесса веб-скрапинга! С помощью RPA Nstbrowser все сложное будет упрощено.