Как использовать прокси-серверы в Node.js

4 min read

Скрейпинг веб-страниц как метод сбора данных часто затрудняется различными препятствиями, включая запреты на использование 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>&#10004;</td></tr>
                            <tr><td>Items per page </td><td>max 20</td></tr>
                            <tr><td>Requires JavaScript </td><td>&#10008;</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>&#10004;</td></tr>
                            <tr><td>Items per page </td><td>max 20</td></tr>
                            <tr><td>Requires JavaScript </td><td>&#10008;</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>&#10004;</td></tr>
                            <tr><td>Items per page </td><td>max 20</td></tr>
                            <tr><td>Requires JavaScript </td><td>&#10008;</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.