Скрейпинг веб-страниц как метод сбора данных часто затрудняется различными препятствиями, включая запреты на использование IP-адресов, геоблокировку и вопросы конфиденциальности. К счастью, прокси-серверы могут помочь вам справиться с этими проблемами. Они служат посредниками между вашим компьютером и Интернетом, обрабатывая запросы с использованием собственных IP-адресов. Эта функция не только помогает обойти ограничения и запреты, связанные с интеллектуальной собственностью, но и облегчает доступ к географически ограниченному контенту. Кроме того, прокси-серверы играют важную роль в сохранении анонимности при скрейпинге веб-страниц и защите вашей конфиденциальности.
Использование прокси-серверов также может повысить производительность и надежность ваших действий по скрейпингу веб-страниц. Распределяя запросы между несколькими серверами, они гарантируют, что ни один сервер не будет нести чрезмерную нагрузку, оптимизируя процесс.
Из этого урока вы узнаете, как использовать прокси-сервер в Node.js для проектов по скрейпингу веб-страниц.
Предварительные требования
Прежде чем приступить к этому уроку, рекомендуется ознакомиться с JavaScript и Node.js. Если Node.js еще не установлен на вашем компьютере, вам нужно установить его сейчас.
Вам также нужен подходящий текстовый редактор. Доступно несколько вариантов, например Sublime Text. В этом учебном пособии используется код Visual Studio (код VS). Он удобен в использовании и содержит множество функций, облегчающих написание кода.
Для начала создайте новый каталог с именем web-scraping-proxy
, а затем инициализируйте проект Node.js. Откройте терминал или оболочку и перейдите в новую директорию с помощью следующих команд:
cd web-scraping-proxy
npm init -y
Затем необходимо установить несколько пакетов Node.js для обработки HTTP-запросов и анализа HTML.
Убедитесь, что вы находитесь в каталоге проекта, а затем запустите следующее:
npm install axios playwright puppeteer http-proxy-agent
npx playwright install
Axios используется для выполнения HTTP-запросов для получения веб-контента. Playwright и Puppeteer автоматизируют взаимодействие с браузером, что необходимо для скрейпинга динамических веб-сайтов. Playwright поддерживает различные браузеры, а Puppeteer ориентирован на Chrome или Chromium. Библиотека http-proxy-agent
будет использована для создания прокси-агента для HTTP-запросов.
npx playwright install
требуется для установки необходимых драйверов, которые будет использовать библиотеку playwright
.
Выполнив эти шаги, вы готовы погрузиться в мир веб-скрейпинга с помощью Node.js.
Настройка локального прокси-сервера для скрейпинга веб-страниц
Важным первым шагом при скрейпинге веб-страниц является создание прокси-сервера, и для этого урока вы воспользуетесь инструментом с открытым исходным кодом mitmproxy.
Для начала перейдите на страницу загрузки mitmproxy и загрузите версию 10.1.6, адаптированную для вашей операционной системы. Если вам нужны рекомендации во время установки, руководство по установке mitmproxy — полезный ресурс.
После установки mitmproxy запустите его, введя в терминале следующую команду:
mitmproxy
Эта команда открывает окно в терминале, которое служит интерфейсом для mitmproxy:
Чтобы убедиться, что прокси-сервер настроен правильно, попробуйте запустить тест. Откройте новое окно терминала и выполните следующую команду:
curl --proxy http://localhost:8080 "http://wttr.in/Paris?0"
Эта команда загружает прогноз погоды в Париже. Результат должен выглядеть следующим образом:
Weather report: Paris
Overcast
.--. -2(-6) °C
.-( ). ↙ 11 km/h
(___.__)__) 10 km
0.0 mm
Вернувшись в окно mitmproxy, вы увидите, что запрос был обработан. Это означает, что ваш локальный прокси-сервер работает правильно:
Внедрение прокси-сервера в Node.js для скрейпинга веб-страниц
Теперь пора перейти к практическим аспектам скрейпинга веб-страниц с помощью Node.js. В этом разделе вы напишете скрипт, который обрабатывает веб-сайт, отправляя запросы через локальный прокси-сервер.
Скрейпинг веб-сайта методом Fetch
Создайте новый файл с именем fetchScraping.js
в корневом каталоге проекта. Этот файл будет содержать код для скрейпинга содержимого веб-сайта, в данном случае — https://toscrape.com/.
В файле fetchScraping.js
введите следующий код JavaScript. Этот скрипт использует метод fetch
для отправки запросов через ваш прокси-сервер:
const fetch = require("node-fetch");
const HttpProxyAgent = require("http-proxy-agent");
async function fetchData(url) {
try {
const proxyAgent = new HttpProxyAgent.HttpProxyAgent(
"http://localhost:8080"
);
const response = await fetch(url, { agent: proxyAgent });
const data = await response.text();
console.log(data); // Outputs the fetched data
} catch (error) {
console.error("Error fetching data:", error);
}
}
fetchData("http://toscrape.com/");
Этот фрагмент кода определяет асинхронную функцию fetchData
, которая принимает URL-адрес и отправляет запрос на этот URL-адрес с помощью fetch
при маршрутизации через локальный прокси-сервер. Затем он распечатывает данные ответа.
Чтобы выполнить скрипт скрейпинга веб-страниц, откройте терминал или оболочку и перейдите в корневую директорию проекта, где находится файл fetchScraping.js
. Запустите скрипт с помощью вот этой команды:
node fetchScraping.js
В терминале должно быть выведено следующее:
…output omitted…
<div class="row">
<div class="col-md-1"></div>
<div class="col-md-10">
<h2>Books</h2>
<p>A <a href="http://books.toscrape.com">fictional bookstore</a> that desperately wants to be scraped. It's a safe place for beginners learning web scraping and for developers validating their scraping technologies as well. Available at: <a href="http://books.toscrape.com">books.toscrape.com</a></p>
<div class="col-md-6">
<a href="http://books.toscrape.com"><img src="./img/books.png" class="img-thumbnail"></a>
</div>
<div class="col-md-6">
<table class="table table-hover">
<tr><th colspan="2">Details</th></tr>
<tr><td>Amount of items </td><td>1000</td></tr>
<tr><td>Pagination </td><td>✔</td></tr>
<tr><td>Items per page </td><td>max 20</td></tr>
<tr><td>Requires JavaScript </td><td>✘</td></tr>
</table>
</div>
</div>
</div>
…output omitted…
Эти выходные данные представляют собой HTML-содержимое веб-страницы http://toscrape.com
. Успешное отображение этих данных означает, что ваш скрипт скрейпинга веб-страниц, переданный через локальный прокси-сервер, работает правильно.
Теперь вернитесь в окно mitmproxy
, и вы увидите, что запрос зарегистрирован. Это означает, что ваш запрос прошел через локальный прокси-сервер:
Скрейпинг веб-сайта с помощью Playwright
По сравнению с Fetch
, Playwright представляет собой усовершенствованный инструмент, позволяющий более динамично взаимодействовать с веб-страницами. Чтобы использовать его, вам необходимо создать новый файл с именем playwrightScraping.js
в своем проекте. В этом файле введите следующий код JavaScript:
const { chromium } = require("playwright");
(async () => {
const browser = await chromium.launch({
proxy: {
server: "http://localhost:8080",
},
});
const page = await browser.newPage();
await page.goto("http://toscrape.com/");
// Extract and log the entire HTML content
const content = await page.content();
console.log(content);
await browser.close();
})();
Этот код использует Playwright для запуска экземпляра браузера Chromium, настроенного на использование локального прокси-сервера. Затем он открывает новую страницу в браузере, переходит на страницу http://toscrape.com
и ожидает загрузки страницы. После скрейпинга необходимых данных браузер закрывается.
Чтобы запустить этот скрипт, убедитесь, что вы находитесь в каталоге, содержащем playwrightScraping.js
. Откройте терминал или оболочку и выполните скрипт следующим образом:
node playwrightScraping.js
Когда вы запустите скрипт, Playwright запустит браузер Chromium, перейдет по указанному URL-адресу и выполнит все добавленные вами дополнительные команды скрейпинга. В этом процессе используется локальный прокси-сервер, что позволяет избежать раскрытия вашего IP-адреса и обойти потенциальные ограничения.
Ожидаемый результат должен быть аналогичен предыдущему:
…output omitted…
<div class="row">
<div class="col-md-1"></div>
<div class="col-md-10">
<h2>Books</h2>
<p>A <a href="http://books.toscrape.com">fictional bookstore</a> that desperately wants to be scraped. It's a safe place for beginners learning web scraping and for developers validating their scraping technologies as well. Available at: <a href="http://books.toscrape.com">books.toscrape.com</a></p>
<div class="col-md-6">
<a href="http://books.toscrape.com"><img src="./img/books.png" class="img-thumbnail"></a>
</div>
<div class="col-md-6">
<table class="table table-hover">
<tr><th colspan="2">Details</th></tr>
<tr><td>Amount of items </td><td>1000</td></tr>
<tr><td>Pagination </td><td>✔</td></tr>
<tr><td>Items per page </td><td>max 20</td></tr>
<tr><td>Requires JavaScript </td><td>✘</td></tr>
</table>
</div>
</div>
</div>
…output omitted…
Как и раньше, ваш запрос должен быть зарегистрирован в окне mitmproxy
.
Срейпинг веб-сайта с помощью Puppeteer
Теперь выполните скрейпинг веб-сайта с помощью Puppeteer. Puppeteer — это мощный инструмент, обеспечивающий высокий уровень контроля над браузером Chrome или Chromium без строки заголовка. Этот метод особенно полезен для скрейпинга динамических веб-сайтов, требующих рендеринга JavaScript.
Для начала создайте новый файл в своем проекте с именем puppeteerScraping.js
. Этот файл будет содержать код Puppeteer для поиска запросов на веб-сайте с помощью прокси-сервера.
Откройте только что созданный файл puppeteerScraping.js
и вставьте следующий код JavaScript:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
args: ['--proxy-server=http://localhost:8080']
});
const page = await browser.newPage();
await page.goto('http://toscrape.com/');
const content = await page.content();
console.log(content); // Outputs the page HTML
await browser.close();
})();
В этом коде вы инициализируете Puppeteer для запуска браузера без строки заголовка, указывая, что он должен использовать ваш локальный прокси-сервер. Браузер открывает новую страницу, переходит на страницу http://toscrape.com
, а затем извлекает HTML-содержимое страницы. После записи содержимого в консоль сеанс браузера закрывается.
Чтобы выполнить скрипт, перейдите в папку, содержащую puppeteerScraping.js
, в терминале или оболочке. Запустите скрипт с помощью следующей команды:
node puppeteerScraping.js
После запуска скрипта Puppeteer открывает URL-адрес http://toscrape.com/
с помощью прокси-сервера. Вы должны увидеть HTML-содержимое страницы, напечатанное в вашем терминале. Это означает, что ваш скрипт Puppeteer правильно выполняет скрейпинг веб-страницы через локальный прокси-сервер.
Ожидаемый результат должен быть аналогичен предыдущим, и вы должны увидеть, что ваш запрос зарегистрирован в окне mitmproxy
:
…output omitted…
<div class="row">
<div class="col-md-1"></div>
<div class="col-md-10">
<h2>Books</h2>
<p>A <a href="http://books.toscrape.com">fictional bookstore</a> that desperately wants to be scraped. It's a safe place for beginners learning web scraping and for developers validating their scraping technologies as well. Available at: <a href="http://books.toscrape.com">books.toscrape.com</a></p>
<div class="col-md-6">
<a href="http://books.toscrape.com"><img src="./img/books.png" class="img-thumbnail"></a>
</div>
<div class="col-md-6">
<table class="table table-hover">
<tr><th colspan="2">Details</th></tr>
<tr><td>Amount of items </td><td>1000</td></tr>
<tr><td>Pagination </td><td>✔</td></tr>
<tr><td>Items per page </td><td>max 20</td></tr>
<tr><td>Requires JavaScript </td><td>✘</td></tr>
</table>
</div>
</div>
</div>
…output omitted…
Лучшая альтернатива — прокси-сервер Bright Data
Если вы хотите улучшить свои возможности скрейпинга веб-страниц, подумайте над использованием Bright Data. Прокси-сервер Bright Data — это передовое решение для управления вашими веб-запросами.
Bright Data предлагает различные прокси-серверы, такие как резидентные прокси-серверы, прокси-серверы интернет-провайдеров, центров обработки данных и мобильных операторов, которые позволяют получить доступ к любому веб-сайту из разных мест мира. Это позволяет эмулировать различные пользовательские агенты и сохранять анонимность.
Bright Data также предлагает ротацию прокси-серверов, которая повышает эффективность и анонимность ваших действий по скрейпингу веб-страниц за счет автоматического переключения между разными прокси-серверами для предотвращения блокировки вашего IP-адреса.
Кроме того, вы можете использовать Scraping Browser («Браузер для скрейпинга») от Bright Data, который представляет собой автоматизированный браузер со встроенными возможностями разблокировки, например, капчи, файлов cookie и создание цифрового отпечатка браузере. Вы также можете использовать Web Unlocker («Веб-разблокировщик») от Bright Data, который оснащен алгоритмами машинного обучения для обхода любых блокировок целевых веб-сайтов и позволяет собирать данные без блокировки.
Внедрение прокси-сервера Bright Data в проект Node.js
Чтобы интегрировать прокси-сервер Bright Data в свой проект Node.js, вам необходимо подписаться на бесплатную пробную версию. После активации аккаунта войдите в систему, перейдите в раздел «Инфраструктура прокси-серверов и скрейпинга» и добавьте новый прокси-сервер, выбрав «Резидентные прокси-серверы»:
Сохраните настройки по умолчанию и завершите создание резидентного прокси-сервера:
После создания запишите учетные данные прокси-сервера, включая хост, порт, имя пользователя и пароль. Они понадобятся вам на следующем этапе:
В своем проекте создайте файл scrapingWithBrightData.js
и добавьте следующий фрагмент кода, заменив текст заполнителя учетными данными прокси-сервера Bright Data:
const axios = require('axios');
async function fetchDataWithBrightData(url) {
const proxyOptions = {
proxy: {
host: 'YOUR_BRIGHTDATA_PROXY_HOST',
port: YOUR_BRIGHTDATA_PROXY_PORT,
auth: {
username: 'YOUR_BRIGHTDATA_USERNAME',
password: 'YOUR_BRIGHTDATA_PASSWORD'
}
}
};
try {
const response = await axios.get(url, proxyOptions);
console.log(response.data); // Outputs the fetched data
} catch (error) {
console.error('Error:', error);
}
}
fetchDataWithBrightData('http://lumtest.com/myip.json');
Этот скрипт настраивает axios
для маршрутизации HTTP-запросов через прокси-сервер Bright Data. Он извлекает данные из указанного URL-адреса, используя следующую конфигурацию прокси-сервера. В этом примере вы сосредоточите внимание на http://lumtest.com/myip.json
, чтобы увидеть различные источники прокси-серверов в зависимости от вашей конфигурации Bright Data.
Чтобы выполнить скрипт, перейдите в папку, содержащую scrapingWithBrightData.js
, в терминале или оболочке. Затем запустите скрипт с помощью следующей команды:
node scrapingWithBrightData.js
После выполнения команды на консоль должно быть выведено местоположение вашего IP-адреса, которое, как правило, связано с прокси-сервером Bright Data.
Ожидаемый результат аналогичен следующему:
{
ip: '108.53.191.230',
country: 'US',
asn: { asnum: 701, org_name: 'UUNET' },
geo: {
city: 'Jersey City',
region: 'NJ',
region_name: 'New Jersey',
postal_code: '07302',
latitude: 40.7182,
longitude: -74.0476,
tz: 'America/New_York',
lum_city: 'jerseycity',
lum_region: 'nj'
}
}
Теперь, если вы снова запустите скрипт с узлом scrapingWithBrightData.js
, вы заметите, что прокси-сервер Bright Data использует другой IP-адрес. Это подтверждает, что Bright Data использует разные адреса и IP-адреса при каждом запуске скрипта скрейпинга, что позволяет обойти любые блокировки или запреты на IP-адреса целевых веб-сайтов.
Результат будет выглядеть следующим образом:
{
ip: '93.85.111.202',
country: 'BY',
asn: {
asnum: 6697,
org_name: 'Republican Unitary Telecommunication Enterprise Beltelecom'
},
geo: {
city: 'Orsha',
region: 'VI',
region_name: 'Vitebsk',
postal_code: '211030',
latitude: 54.5081,
longitude: 30.4172,
tz: 'Europe/Minsk',
lum_city: 'orsha',
lum_region: 'vi'
}
}
Простой интерфейс и настройки Bright Data позволяют любому, даже новичку, эффективно использовать мощные функции управления прокси-серверами.
Заключение
Из этой статьи вы узнали, как использовать прокси-серверы с Node.js. Без надлежащих решений для управления прокси-серверами, таких как Bright Data, вы можете столкнуться с различными проблемами, например, блокировкой IP-адресов и ограничением доступа к целевым веб-сайтам, что может помешать вашему скрейпингу. Вы также узнали, насколько легко использовать прокси-серверы Bright Data для улучшения скрейпинга веб-страниц. Эти серверы обеспечивают не только надежность и эффективность процесса сбора данных, но и универсальность, необходимую для различных сценариев скрейпинга.
Применяя эти навыки на практике, помните о важности соблюдения условий веб-сайта и законов о конфиденциальности данных. Очень важно ответственно подходить к скрейпингу, соблюдая правила, установленные на веб-сайтах. Благодаря приобретенным знаниям, в частности, о возможностях, предоставляемых прокси-серверами Bright Data, вы хорошо подготовлены к успешному и этичному скрейпингу веб-страниц. Удачного скрейпинга!
Кредитная карта не требуется
Весь код этого руководства доступен в этом репозитории GitHub.