При веб-скреппинге часто приходится обходить механизмы защиты от ботов, загружать динамический контент с помощью таких инструментов автоматизации браузера, как Puppeteer, использовать ротацию прокси-серверов, чтобы избежать блокировки IP-адресов, и решать задачи CAPTCHA. Даже при использовании этих стратегий масштабирование и поддержание стабильных сессий остается сложной задачей.
В этой статье рассказывается о том, как перейти от традиционного скраппинга на основе прокси-серверов к Bright Data Scraping Browser. Узнайте, как автоматизировать управление прокси и масштабирование, чтобы снизить затраты на разработку и обслуживание. Будет проведено сравнение обоих методов с учетом конфигурации, производительности, масштабируемости и сложности.
Примечание: Примеры в этой статье приведены в образовательных целях. Перед сбором данных обязательно ознакомьтесь с условиями предоставления услуг на целевом сайте и соблюдайте соответствующие законы и правила.
Пререквизиты
Прежде чем приступить к изучению этого руководства, убедитесь, что у вас есть следующие необходимые условия:
- Node.js
- Код Visual Studio
- Бесплатная учетная запись Bright Data, чтобы вы могли использовать их браузер для скрапинга
Начните с создания новой папки проекта Node.js, в которой будет храниться ваш код.
Затем откройте терминал или оболочку и создайте новый каталог с помощью следующих команд:
mkdir scraping-tutorialrncd scraping-tutorial
Инициализируйте новый проект Node.js:
npm init -y
Флаг -y
автоматически отвечает "да"
на все вопросы, создавая файл package.json
с настройками по умолчанию.
Веб-скраппинг на основе прокси-сервера
В типичном подходе, основанном на использовании прокси, вы используете инструмент автоматизации браузера, например Puppeteer, для взаимодействия с целевым доменом, загрузки динамического содержимого и извлечения данных. При этом вы используете прокси-серверы, чтобы избежать запрета IP-адресов и сохранить анонимность.
Давайте быстро создадим с помощью Puppeteer скрипт для сбора данных с сайта электронной коммерции, используя прокси.
Создание сценария веб-скрапинга с помощью Puppeteer
Начните с установки Puppeteer:
npm install puppeteer
Затем создайте файл proxy-scraper.js
(вы можете назвать его как угодно) в папке scraping-tutorial
и добавьте в него следующий код:
const puppeteer = require("puppeteer");
(async () => {
// Launch a headless browser
const browser = await puppeteer.launch({
headless: true,
});
const page = await browser.newPage();
const baseUrl = "https://books.toscrape.com/catalogue/page-";
const books = [];
for (let i = 1; i {
let books = [];
document.querySelectorAll(".product_pod").forEach((item) => {
let title = item.querySelector("h3 a")?.getAttribute("title") || "";
let price = item.querySelector(".price_color")?.innerText || "";
books.push({ title, price });
});
return books;
});
books.push(...pageBooks); // Append books from this page to the main list
}
console.log(books); // Print the collected data
await browser.close();
})();
Этот скрипт использует Puppeteer для поиска названий и цен книг с первых пяти страниц сайта Books to Scrape. Он запускает безголовый браузер, открывает новую страницу и переходит по каждой странице каталога.
Для каждой страницы скрипт использует селекторы DOM в page.evaluate()
для извлечения названий книг и цен, сохраняя данные в массив. Когда все страницы обработаны, данные выводятся в консоль, а браузер закрывается. Этот подход позволяет эффективно извлекать данные из страничного веб-сайта.
Протестируйте и запустите код с помощью следующей команды:
node proxy-scraper.js
Ваш вывод должен выглядеть следующим образом:
Navigating to: https://books.toscrape.com/catalogue/page-1.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-2.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-3.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-4.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-5.htmlrn[rn { title: 'A Light in the Attic', price: '£51.77' },rn { title: 'Tipping the Velvet', price: '£53.74' },rn { title: 'Soumission', price: '£50.10' },rn { title: 'Sharp Objects', price: '£47.82' },rn { title: 'Sapiens: A Brief History of Humankind', price: '£54.23' },rn { title: 'The Requiem Red', price: '£22.65' },rn…output omitted…rn {rn title: 'In the Country We Love: My Family Divided',rn price: '£22.00'rn }rn]
Настройка прокси-серверов
Прокси-серверы обычно используются в конфигурациях скраппинга, чтобы разделить запросы и сделать их неотслеживаемыми. Общий подход заключается в поддержании пула прокси-серверов и их динамической ротации.
Поместите прокси в массив или храните их в отдельном файле, если хотите:
const proxies = [
"proxy1.example.com:port",
"proxy2.example.com:port"
// Add more proxies here
];
Использование логики вращения прокси
Давайте дополним код логикой, которая будет перебирать массив прокси при каждом запуске браузера. Обновите файл proxy-scraper.js
и добавьте в него следующий код:
const puppeteer = require("puppeteer");
const proxies = [
"proxy1.example.com:port",
"proxy2.example.com:port"
// Add more proxies here
];
(async () => {
// Choose a random proxy
const randomProxy =
proxies[Math.floor(Math.random() * proxies.length)];
// Launch Puppeteer with proxy
const browser = await puppeteer.launch({
headless: true,
args: [
`--proxy-server=http=${randomProxy}`,
"--no-sandbox",
"--disable-setuid-sandbox",
"--ignore-certificate-errors",
],
});
const page = await browser.newPage();
const baseUrl = "https://books.toscrape.com/catalogue/page-";
const books = [];
for (let i = 1; i {
let books = [];
document.querySelectorAll(".product_pod").forEach((item) => {
let title = item.querySelector("h3 a")?.getAttribute("title") || "";
let price = item.querySelector(".price_color")?.innerText || "";
books.push({ title, price });
});
return books;
});
books.push(...pageBooks); // Append books from this page to the main list
}
console.log(`Using proxy: ${randomProxy}`);
console.log(books); // Print the collected data
await browser.close();
})();
Примечание: Вместо того чтобы выполнять вращение прокси вручную, вы можете использовать библиотеку типа luminati-proxy, чтобы автоматизировать этот процесс.
В этом коде случайный прокси выбирается из списка прокси
и применяется к Puppeteer с помощью опции --proxy-server=${randomProxy}
. Чтобы избежать обнаружения, также назначается случайная строка пользовательского агента. Затем логика скраппинга повторяется, и записывается прокси, используемый для скраппинга данных о продукте.
При повторном выполнении кода вы должны увидеть вывод, как и раньше, но с добавлением прокси, который был использован:
Navigating to: https://books.toscrape.com/catalogue/page-1.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-2.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-3.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-4.htmlrnNavigating to: https://books.toscrape.com/catalogue/page-5.htmlrnUsing proxy: 115.147.63.59:8081rn…output omitted…
Проблемы при использовании скрапинга на основе прокси-сервера
Хотя подход на основе прокси может подойти для многих случаев использования, вы можете столкнуться с некоторыми из следующих проблем:
- Частые блокировки: прокси могут быть заблокированы, если сайт имеет строгую защиту от ботов.
- Накладные расходы на производительность: ротация прокси-серверов и повторные запросы замедляют работу конвейера сбора данных.
- Сложная масштабируемость: управление и ротация большого пула прокси-серверов для обеспечения оптимальной производительности и доступности – сложная задача. Это требует балансировки нагрузки, предотвращения чрезмерного использования прокси, периодов охлаждения и обработки отказов в режиме реального времени. Сложность возрастает при увеличении числа запросов, поскольку система должна избегать обнаружения, постоянно отслеживая и заменяя IP-адреса, занесенные в черный список или не справляющиеся со своей работой.
- Обслуживание браузера: Обслуживание браузера может быть как технически сложным, так и ресурсоемким. Вам необходимо постоянно обновлять и обрабатывать отпечатки браузера (куки, заголовки и другие идентифицирующие атрибуты), чтобы имитировать реальное поведение пользователя и обходить современные средства защиты от ботов.
- Накладные расходы облачных браузеров: облачные браузеры создают дополнительные операционные накладные расходы за счет повышенных требований к ресурсам и сложного управления инфраструктурой, что приводит к увеличению операционных расходов. Масштабирование экземпляров браузера для обеспечения стабильной производительности еще больше усложняет процесс.
DynamicScraping с помощью браузера Bright Data Scraping Browser
Чтобы справиться с этими проблемами, можно использовать единое API-решение, например Bright Data Scraping Browser. Это упрощает работу, избавляет от необходимости ручной ротации прокси и сложных настроек браузера, а также часто приводит к более успешному извлечению данных.
Настройка учетной записи Bright Data
Чтобы начать, войдите в свою учетную запись Bright Data, перейдите в раздел Proxies & Scraping, прокрутите вниз до Scraping Browser и нажмите Get Started:
Сохраните конфигурацию по умолчанию и нажмите кнопку Добавить, чтобы создать новый экземпляр Scraping Browser:
После того как вы создали экземпляр Scraping Browser, запишите URL-адрес Puppeteer, так как он вам скоро понадобится:
Настройте код для использования браузера для сбора данных Bright Data Scraping Browser
Теперь давайте настроим код так, чтобы вместо использования вращающихся прокси вы подключались непосредственно к конечной точке Bright Data Scraping Browser.
Создайте новый файл brightdata-scraper.js
и добавьте в него следующий код:
const puppeteer = require("puppeteer");
(async () => {
// Choose a random proxy
const SBR_WS_ENDPOINT = "YOUR_BRIGHT_DATA_WS_ENDPOINT"
// Launch Puppeteer with proxy
const browser = await puppeteer.connect({
browserWSEndpoint: SBR_WS_ENDPOINT,
});
const page = await browser.newPage();
const baseUrl = "https://books.toscrape.com/catalogue/page-";
const books = [];
for (let i = 1; i {
let books = [];
document.querySelectorAll(".product_pod").forEach((item) => {
let title = item.querySelector("h3 a")?.getAttribute("title") || "";
let price = item.querySelector(".price_color")?.innerText || "";
books.push({ title, price });
});
return books;
});
books.push(...pageBooks); // Append books from this page to the main list
}
console.log(books); // Print the collected data
await browser.close();
})();
Убедитесь, что вы заменили YOUR_BRIGHT_DATA_WS_ENDPOINT
на URL, который вы получили в предыдущем шаге.
Этот код похож на предыдущий, но вместо того, чтобы иметь список прокси и жонглировать между различными прокси, вы подключаетесь непосредственно к конечной точке Bright Data.
Выполните следующий код:
node brightdata-scraper.js
Ваши результаты должны быть такими же, как и раньше, но теперь вам не нужно вручную вращать прокси-серверы или настраивать агенты пользователя. Браузер Bright Data Scraping Browser справится со всем – от ротации прокси до обхода CAPTCHA – обеспечивая бесперебойную работу по сбору данных.
Превратите код в конечную точку Express
Если вы хотите интегрировать Bright Data Scraping Browser в более крупное приложение, рассмотрите возможность его использования в качестве конечной точки Express.
Начните с установки Express:
npm install express
Создайте файл server.js
и добавьте в него следующий код:
const express = require("express");
const puppeteer = require("puppeteer");
const app = express();
const PORT = 3000;
// Needed to parse JSON bodies:
app.use(express.json());
// Your Bright Data Scraping Browser WebSocket endpoint
const SBR_WS_ENDPOINT =
"wss://brd-customer-hl_264b448a-zone-scraping_browser2:[email protected]:9222";
/**
POST /scraper
Body example:
{
"baseUrl": "https://books.toscrape.com/catalogue/page-"
}
*/
app.post("/scrape", async (req, res) => {
const { baseUrl } = req.body;
if (!baseUrl) {
return res.status(400).json({
success: false,
error: 'Missing "baseUrl" in request body.',
});
}
try {
// Connect to the existing Bright Data (Luminati) Scraping Browser
const browser = await puppeteer.connect({
browserWSEndpoint: SBR_WS_ENDPOINT,
});
const page = await browser.newPage();
const books = [];
// Example scraping 5 pages of the base URL
for (let i = 1; i {
const data = [];
document.querySelectorAll(".product_pod").forEach((item) => {
const title = item.querySelector("h3 a")?.getAttribute("title") || "";
const price = item.querySelector(".price_color")?.innerText || "";
data.push({ title, price });
});
return data;
});
books.push(...pageBooks);
}
// Close the browser connection
await browser.close();
// Return JSON with the scraped data
return res.json({
success: true,
books,
});
} catch (error) {
console.error("Scraping error:", error);
return res.status(500).json({
success: false,
error: error.message,
});
}
});
// Start the Express server
app.listen(PORT, () => {
console.log(`Server is listening on http://localhost:${PORT}`);
});
В этом коде вы инициализируете приложение Express, принимаете полезную нагрузку в формате JSON и определяете маршрут POST /scrape
. Клиенты отправляют тело JSON, содержащее baseUrl
, которое затем перенаправляется на конечную точку Bright Data Scraping Browser с целевым URL.
Запустите новый сервер Express:
node server.js
Чтобы проверить конечную точку, вы можете использовать такой инструмент, как Postman (или любой другой REST-клиент по вашему выбору), или использовать curl из терминала или оболочки, как показано ниже:
curl -X POST http://localhost/scrape
n-H 'Content-Type: application/json'
n-d '{u0022baseUrlu0022: u0022https://books.toscrape.com/catalogue/page-u0022}'rn
Ваш вывод должен выглядеть следующим образом:
{
"success": true,
"books": [
{
"title": "A Light in the Attic",
"price": "£51.77"
},
{
"title": "Tipping the Velvet",
"price": "£53.74"
},
{
"title": "Soumission",
"price": "£50.10"
},
{
"title": "Sharp Objects",
"price": "£47.82"
},
{
"title": "Sapiens: A Brief History of Humankind",
"price": "£54.23"
},
{
"title": "The Requiem Red",
"price": "£22.65"
},
{
"title": "The Dirty Little Secrets of Getting Your Dream Job",
"price": "£33.34"
},
{
"title": "The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull",
"price": "£17.93"
},
... output omitted...
{
"title": "Judo: Seven Steps to Black Belt (an Introductory Guide for Beginners)",
"price": "£53.90"
},
{
"title": "Join",
"price": "£35.67"
},
{
"title": "In the Country We Love: My Family Divided",
"price": "£22.00"
}
]
}
Ниже приведена диаграмма, показывающая разницу между ручной настройкой (вращающийся прокси) и подходом Bright Data Scraping Browser:
Управление вращающимися вручную прокси-серверами требует постоянного внимания и настройки, что приводит к частым блокировкам и ограниченной масштабируемости.
Использование браузера Bright Data Scraping Browser упрощает процесс, избавляя вас от необходимости управлять прокси-серверами или заголовками, а также обеспечивает более быстрое время отклика благодаря оптимизированной инфраструктуре. Встроенные стратегии защиты от ботов повышают процент успеха, снижая вероятность блокировки или пометки.
Весь код для этого руководства доступен в этом репозитории GitHub.
Рассчитайте рентабельность инвестиций
Переход от ручной настройки скрапинга на основе прокси-сервера к Bright Data Scraping Browser может значительно сократить время и затраты на разработку.
Традиционная установка
Для ежедневного соскабливания новостных сайтов требуется следующее:
- Первоначальная разработка: ~50 часов ($5,000 USD при $100 USD/час)
- Текущее обслуживание: ~10 часов в месяц ($1,000 USD) на обновление кода, инфраструктуры, масштабирование и управление прокси.
- Стоимость прокси/IP: ~$250 USD/месяц (зависит от потребностей в IP)
Общая предполагаемая ежемесячная стоимость: ~$1,250 USD
Настройка браузера Bright Data Scraping
- Время разработки: 5-10 часов ($1,000 USD)
- Обслуживание: ~2-4 часа/месяц ($200 USD)
- Не требуетсяуправление прокси-сервером или инфраструктурой
- Стоимость услуг Bright Data:
- Использование трафика: $8,40 USD/GB(например, 30GB/месяц = $252 USD)
Общая предполагаемая ежемесячная стоимость: ~ $450 USD
Автоматизация управления прокси-серверами и масштабирование Bright Data Scraping Browser снижают как первоначальные затраты на разработку, так и текущее обслуживание, делая крупномасштабную работу по сбору данных более эффективной и экономически выгодной.
Заключение
Переход от традиционной конфигурации веб-скрапинга на основе прокси к Bright Data Scraping Browser избавляет от необходимости ротации прокси и ручной борьбы с ботами.
Помимо извлечения HTML, Bright Data предлагает дополнительные инструменты для упрощения извлечения данных:
- Веб-скраперы помогут привести в порядок извлечение данных
- API Web Unlocker для поиска более сложных сайтов
- Наборы данных, позволяющие получить доступ к предварительно собранным структурированным данным
Эти решения могут упростить процесс скраппинга, снизить рабочую нагрузку и улучшить масштабируемость.
Кредитная карта не требуется