Написал для
console.aws.amazon.com/lambda код , который собирает со страницы сайта f
ree-proxy-list.net бесплатные прокси и делает их проверку на валидность обращением на url
https://httpbin.org/ip
Добавил в код для проверки мой личный прокси , который заведомо рабочий! Это для проверки что код работает верно и выдаёт только работающие прокси.
Мой прокси:
168.196.238.***:9**0:s***J:w***X (скрыл приват инфу) с авторизацией по логину и паролю.
В коде проверки прокси добавлен таймаут в 5 сек.
Проблема в том что код собирает 300 проксей где-то за
5 секунд и еще где-то он их
140 секунд проверяет, что я считаю очень долго, хотя чек прокси идет асинхронно.
Как ускорить проверку прокси?
Код для amazon lambda:
const https = require('https');
const cheerio = require('cheerio');
const axios = require('axios');
const { HttpsProxyAgent } = require('https-proxy-agent');
exports.handler = async (event) => {
return new Promise((resolve, reject) => {
https.get('https://free-proxy-list.net/', (response) => {
let data = '';
response.on('data', (chunk) => { data += chunk; });
response.on('end', async () => {
const $ = cheerio.load(data);
let proxyList = [];
// Сначала заполняем список прокси из сайта
$('table.table-striped.table-bordered').find('tbody tr').each((i, element) => {
const ip = $(element).find('td').eq(0).text();
const port = $(element).find('td').eq(1).text();
proxyList.push(`${ip}:${port}`);
});
// Добавляем купленный рабочий прокси в список для проверки
proxyList.push('168.196.238.***:9**0');
// Функция для проверки прокси
async function checkProxy(proxy) {
try {
let agent;
if (proxy === '168.196.238.***:9**0') {
// Если это аутентифицированный прокси
const proxyAuth = Buffer.from('s***J:w***X').toString('base64');
agent = new HttpsProxyAgent({
host: proxy.split(':')[0],
port: proxy.split(':')[1],
protocol: 'https',
headers: {
'Proxy-Authorization': `Basic ${proxyAuth}`
}
});
} else {
// Для публичных прокси
agent = new HttpsProxyAgent(`http://${proxy}`);
}
await axios.get('https://httpbin.org/ip', { httpsAgent: agent, timeout: 5000 });
return proxy;
} catch (error) {
console.error(`Error with proxy ${proxy}:`, error.message);
return null;
}
}
const checkPromises = proxyList.map(checkProxy);
const results = await Promise.all(checkPromises);
const workingProxies = results.filter(proxy => proxy !== null);
resolve({
statusCode: 200,
rabo4ie_proxy: workingProxies,
neOt4ekanyeProxy: proxyList,
});
});
}).on('error', (e) => {
reject({
statusCode: 500,
body: 'Error: ' + e.message
});
});
});
};