В этом руководстве по прокси-серверу node-fetch
будут рассмотрены следующие вопросы:
- Почему нельзя использовать прокси в родном Fetch API Node.js
- Использование HTTP, HTTPS или SOCKS-прокси с
node-fetch
- Работа с аутентификацией и ротацией прокси-серверов
Почему нельзя использовать прокси-серверы в родном Fetch API Node.js
В Node.js 18 наконец-то появилась реализация Fetch API, интерфейса для получения локальных и удаленных ресурсов. В частности, Fetch API предоставляет простую в использовании функцию fetch(), которая работает как клиент для выполнения HTTP-запросов. Более подробную информацию можно найти в нашем руководстве по Node.js Fetch API.
К сожалению, текущая реализация Fetch API в Node.js не поддерживает прокси. На момент написания статьи работа над этой функцией ведется, но она не успела появиться в Node.js 20. Поддержка прокси в Fetch API может появиться в следующих обновлениях. Однако на данный момент для использования прокси в Node.js необходим внешний HTTP-клиент.
Здесь вы узнаете, как установить прокси в node-fetch
, одной из самых популярных библиотек HTTP-клиентов на основе Fetch-API для Node.js.
Использование прокси-сервера с помощью node-fetch
В этом разделе о прокси node-fetch
мы рассмотрим, как настроить прокси HTTP/HTTPS/SOCKS.
Пререквизиты
Во-первых, необходимо добавить пакет node-fetch npm в зависимости вашего проекта Node.js с помощью:
npm install node-fetch
Обратите внимание, что node-fetch – это модуль, предназначенный только для ESM. Это означает, что для него требуется параметр "type": "module"
в файле package.json
. Если вы являетесь пользователем CommonJS, ознакомьтесь с рекомендациями на официальной странице GitHub.
Следует иметь в виду, что node-fetch поддерживает прокси через http.Agent
, но не предлагает нативного способа их установки. Решить эту проблему поможет проект Proxy Agents, который предоставляет реализации http.Agent для использования прокси в различных протоколах. В частности, различные npm-библиотеки, предлагаемые проектом, классифицируются по протоколам:
- HTTP и HTTPS:
https-proxy-agent
- SOCKS, SOCKS5, and SOCKS4: socks-proxy-agent
- PAC-*: pac-proxy-agent
Отлично! Вы готовы к установке прокси в node-fetch!
Прокси HTTP/HTTPs
Сначала установите библиотеку https-proxy-agent npm с помощью:
npm install https-proxy-agent
Этот пакет позволяет подключиться к HTTP- или HTTPS-прокси-серверу для получения HTTPS-адреса.
Импортируйте реализацию прокси-агента из библиотеки:
import { HttpsProxyAgent } from "https-proxy-agent"
Примечание: Если вместо этого требуется посещать HTTP URL, то следует использовать http-proxy-agent, а затем импортировать из него HttpProxyAgent.
Затем получите URL-адрес вашего HTTP/HTTPS-прокси и сохраните его в переменной:
const proxyURL = "<PROXY_PROTOCOL>://<PROXY_HOST>:<PROXY_PORT>"
Замените
Это пример корректного URL-адреса HTTP/HTTPS-прокси:
const proxyURL = "http://38.112.54.21:3128"
Установите HTTP/HTTPS-прокси в node-fetch, как показано ниже:
const proxyAgent = new HttpsProxyAgent(proxyURL)
const response = await fetch(targetURL, {
agent: proxyAgent
})
HttpsProxyAgent() инициализирует экземпляр http.Agent для выполнения HTTPS-запросов через указанный прокси-сервер. Передайте этот объект в опцию agent, чтобы убедить node-fetch
использовать HTTP/HTTPS-прокси по своему усмотрению.
Прокси SOCKS
Добавьте библиотеку socks-proxy-agent npm в зависимости вашего проекта с помощью:
npm install socks-proxy-agent
Эта библиотека позволяет подключаться к SOCKS-прокси-серверу для получения HTTP- или HTTPS-адреса.
Далее импортируйте из пакета реализацию прокси-агента SOCKS:
import { SocksProxyAgent } from "socks-proxy-agent"
Инициализируйте переменную, содержащую URL вашего SOCKS-прокси:
const proxyURL = "<PROXY_PROTOCOL>://<PROXY_HOST>:<PROXY_PORT>"
Замените
Это пример корректного URL-адреса SOCKS-прокси:
const proxyURL = "socks://47.123.45.15:8632"
Затем можно настроить SOCKS-прокси в node-fetch следующим образом:
const proxyAgent = new SocksProxyAgent(proxyURL)
const response = await fetch(targetURL, {
agent: proxyAgent
})
SocksProxyAgent() инициализирует экземпляр http.Agent для выполнения HTTP/HTTPS-запросов через указанный SOCKS-прокси-сервер. Опять же, для установки прокси достаточно передать этот объект в опцию агента.
Законченный пример
Проверим, что описанные выше подходы к прокси-серверу для выборки узлов работают. Если у вас нет URL прокси-сервера, вы можете получить HTTP/HTTPS прокси-сервер на Free Proxy List. Посмотрите на этот:
IP Address: 75.89.101.62; Port: 80
Это означает, что URL этого прокси-сервера – http://75.89.101.62:80.
Поскольку извлекаемый прокси является HTTP/HTTPS-прокси, необходимо использовать HttpsProxyAgent. Приведенный ниже пример можно легко адаптировать для работы с SOCKS-прокси. Чтобы убедиться в правильности настройки прокси, обратимся к конечной точке /ip из проекта HTTPBin. Этот публичный API возвращает IP входящего запроса. Другими словами, он должен возвращать IP прокси-сервера.
Здесь приведен полный фрагмент Node.js:
import fetch from "node-fetch"
import { HttpsProxyAgent } from "https-proxy-agent"
async function testProxy() {
// define the HTTP/HTTPS proxy agent
const proxyURL = "http://75.89.101.62:80"
const proxyAgent = new HttpsProxyAgent(proxyURL)
// perform the desired request through the proxy
const response = await fetch("https://httpbin.io/ip", {
agent: proxyAgent
})
// print the result
const responseData = await response.json()
console.log(responseData)
}
testProxy()
Запустите скрипт, и он должен вывести сообщение:
{ origin: '75.89.101.62' }
Это тот же IP, что и у прокси-сервера, а значит, прокси работает, как и ожидалось, и ваш IP в безопасности! Обратите внимание, что бесплатные прокси настолько недолговечны, что выбранный прокси может уже не работать к тому времени, когда вы будете читать эту статью.
Использование бесплатных прокси вполне допустимо в учебных целях, но в реальных условиях полагаться на них нельзя. Бесплатные прокси ненадежны, медленны, подвержены ошибкам, жадны до данных и недолговечны. Избегайте их!
Решение? Премиум-прокси от Bright Data, лучшего провайдера на рынке. Подпишитесь и попробуйте наши надежные прокси бесплатно.
Прокси node-fetch: Дополнительные возможности
Теперь, когда вы знаете основы интеграции узла и прокси-выборки, пришло время перейти к более сложным техникам.
Аутентификация через прокси
Премиум-прокси защищены аутентификацией. Вот как выглядит URL аутентифицированного прокси:
[<PROTOCOL>://]<USERNAME>:<PASSWORD>@<HOST>[:<PORT>]
Подключение к аутентифицированному прокси без указания имени пользователя и пароля приведет к ошибке 407 Proxy Authentication Required.
Предположим, что это информация, необходимая для подключения к аутентифицированному прокси:
- Протокол: HTTP
- Host: 165.227.0.192
- Post: 8361
- Имя пользователя: admin
- Пароль: eX4w88MEe63YLqGkz
Пакеты Proxy Agents предлагают два способа работы с аутентификацией:
- Укажите учетные данные непосредственно в URL-адресе прокси:
var proxyAgent = new HttpsProxyAgent("https://admin:[email protected]:8361")
- Задайте параметры имени пользователя и пароля из URL:
const proxyOpts = new URL("http://165.227.0.192:8361")
proxyOpts.username = "admin"
proxyOpts.password = "eX4w88MEe63YLqGkz"
const proxyAgent = new HttpsProxyAgent(proxyOpts)
Эти подходы работают и с SocksProxyAgent.
Вращающиеся прокси в node-fetch
Если вы будете использовать один и тот же прокси-сервер раз за разом, то целевой сайт в итоге заблокирует его IP. Чтобы избежать этого, необходимо убедиться, что каждый запрос выполняется с другого прокси-сервера. Это можно сделать следующим образом:
- Определите список с URL всех ваших прокси
- Случайным образом выберите URL прокси
- Установите URL прокси в node-fetch
Такое решение подразумевает наличие доступа к пулу надежных прокси-серверов. Приобретение доступа к таким серверам может стоить немалых денег. Кроме того, реализация такой логики в коде является шаблонной и трудоемкой.
Именно поэтому Bright Data предлагает ротационные прокси, которые автоматически меняют IP-адреса для вас! Эта услуга предоставляет доступ к прокси, которые предоставляют новый IP при каждом подключении к ним. Эти прокси-серверы доступны в 195 странах, имеют высочайшее время безотказной работы и гарантируют 99,9% успеха. Попробуйте ротационные прокси Bright Data уже сегодня!
Заключение
В этом руководстве по прокси в node-fetch вы узнали, почему нельзя использовать прокси в реализации Node.js Fetch API, и как это сделать с помощью библиотеки. Теперь вы знаете, как настроить HTTP/HTTPS/SOCKS-прокси в node-fetch. Для этого потребуется всего пара настроек и несколько строк кода!
Как мы выяснили здесь, использовать node-fetch с прокси-сервисами от бесплатных провайдеров нельзя. Таким образом, основное техническое решение, которое необходимо принять, – это выбор прокси-провайдера. Экономьте время и силы и выбирайте лучшее на рынке – Bright Data.
Bright Data контролирует лучшие прокси-серверы в мире, обслуживая компании из списка Fortune 500 и 20 000+ клиентов. Всемирная сеть прокси включает в себя:
- Серверные прокси – 770 000+ серверных IPs.
- Резидентные прокси – 72+ млн. резидентных IP-адресов в более чем 195 странах.
- ISP прокси – 700 000+ IP-адресов провайдеров
- Мобильные прокси – 7+ млн. мобильных IP-адресов
В целом это одна из самых крупных и надежных прокси-сетей на рынке, ориентированных на скраппинг. Обратитесь к одному из наших торговых представителей и узнайте, какой из продуктов Bright Data лучше всего подходит для ваших целей.