Axios - это основанный на промисах HTTP-клиент для Node.js и браузера. Интеграция прокси Catproxy проста и требует лишь передачи объекта конфигурации proxy вместе с запросом.
Базовая настройка
Чтобы направлять запросы через наш шлюз, необходимо указать host, port и auth в объекте proxy.
Вам потребуется установить axios в проект: npm install axios
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), чтобы продемонстрировать эту возможность.
В этом примере показано, как создать повторно используемую функцию для динамического изменения страны прокси для каждого запроса.
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();
Ожидаемый результат
Запуск этого скрипта выдаст результат, аналогичный следующему:
--- 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, позволяя повторно использовать логику парсинга, динамически изменяя параметры прокси для каждого целевого запроса.