Перейти к основному содержанию
Axios - это основанный на промисах HTTP-клиент для Node.js и браузера. Интеграция прокси Catproxy проста и требует лишь передачи объекта конфигурации proxy вместе с запросом.

Базовая настройка

Чтобы направлять запросы через наш шлюз, необходимо указать host, port и auth в объекте proxy.
Вам потребуется установить axios в проект: npm install axios
basic_setup.js
const axios = require('axios');

// 1. Скопируйте их со страницы «Настройки прокси» вашего прокси
const proxyHost = "proxy.catproxy.net";
const proxyPort = 5555;
const proxyUser = "PROXY_USERNAME";
const proxyPass = "PROXY_PASSWORD";

// 2. Сконфигурируйте запрос Axios
const axiosConfig = {
  // 3. Создайте объект proxy
  proxy: {
    protocol: 'http',
    host: proxyHost,
    port: proxyPort,
    auth: {
      username: proxyUser,
      password: proxyPass
    }
  },
  timeout: 10000 // 10 секунд
};

// 4. Отправьте запрос!
async function checkIp() {
  try {
    const response = await axios.get("https://api.ipify.org?format=json", axiosConfig);
    console.log("Success! Your proxy IP is:", response.data.ip);
  } catch (error) {
    if (error.response) {
      console.error(`Error making request: Status ${error.response.status}`);
    } else {
      console.error(`Error making request: ${error.message}`);
    }
  }
}

checkIp();

Практический пример: Парсинг данных сабреддита через Reddit API

Распространенная задача - сбор структурированных данных из публичных API. Давайте используем Axios для парсинга данных из JSON API Reddit на примере релевантного сабреддита: /r/webscraping. Reddit, как и многие другие сайты, может показывать разный контент или рекламу в зависимости от географии. Мы проверим “горячие” посты из США и Великобритании (GB), чтобы продемонстрировать эту возможность. В этом примере показано, как создать повторно используемую функцию для динамического изменения страны прокси для каждого запроса.
reddit_scraper.js
const axios = require('axios');

// --- Your Base Credentials ---
const BASE_USERNAME = "PROXY_USERNAME";
const PASSWORD = "PROXY_PASSWORD";
const PROXY_HOST = "proxy.catproxy.net";
const PROXY_PORT = 5555;

// --- Target Information ---
const SUBREDDIT = "webscraping";
const TARGET_URL = `https://www.reddit.com/r/${SUBREDDIT}/hot.json`;
const REGIONS = ["us", "gb"]; // USA and Great Britain

// --- Reusable Scraper Function ---
async function scrapeSubreddit(region) {
  console.log(`--- Scraping /r/${SUBREDDIT} from ${region.toUpperCase()} ---`);

  // Dynamically construct the username for the target region
  const proxyUsername = `${BASE_USERNAME}-country-${region}`;

  const axiosConfig = {
    proxy: {
      protocol: 'http',
      host: PROXY_HOST,
      port: PROXY_PORT,
      auth: {
        username: proxyUsername,
        password: PASSWORD
      }
    },
    // Reddit API requires a custom User-Agent
    headers: {
        'User-Agent': 'Catproxy Docs Scraper/1.0'
    },
    timeout: 15000
  };

  try {
    const response = await axios.get(TARGET_URL, axiosConfig);

    // The actual posts are in response.data.data.children
    const posts = response.data.data.children;
    console.log(`Success! Found ${posts.length} posts.`);

    // Print the title of the first post
    if (posts.length > 0) {
        console.log(`Top post title: "${posts[0].data.title}"`);
    }

  } catch (error) {
    if (error.response) {
      // Handle errors from the target or the proxy
      console.error(`Request failed with status ${error.response.status}.`);
      // The X-Catproxy-Error header will be in error.response.headers
      if (error.response.headers['x-Catproxy-error']) {
          console.error(`--> Gateway Error: ${error.response.headers['x-Catproxy-error']}`);
      }
    } else {
      console.error(`An unexpected error occurred: ${error.message}`);
    }
  } finally {
      console.log("-" * (30 + SUBREDDIT.length + region.length));
  }
}

// --- Main Execution Logic ---
async function run() {
    for (const region of REGIONS) {
        await scrapeSubreddit(region);
        // Optional: add a small delay between requests to different regions
        await new Promise(resolve => setTimeout(resolve, 2000));
    }
}

run();

Ожидаемый результат

Запуск этого скрипта выдаст результат, аналогичный следующему:
Terminal
--- Scraping /r/webscraping from US ---
Success! Found 25 posts.
Top post title: "Looking for advice on scraping dynamic JS-heavy sites"
-----------------------------------------
--- Scraping /r/webscraping from GB ---
Success! Found 25 posts.
Top post title: "Looking for advice on scraping dynamic JS-heavy sites"
-----------------------------------------
(Примечание: контент Reddit может незначительно отличаться между США и GB, но это демонстрирует техническую возможность) Этот пример показывает, как создать гибкий парсер с помощью Axios и Catproxy, позволяя повторно использовать логику парсинга, динамически изменяя параметры прокси для каждого целевого запроса.