nodejs爬虫,获取免费的高匿代理
介绍
获取HTTP高匿代理
使用说明
第一种方式
1. npm i getting-agent -g
2. gat start 10 (10:获取的代理IP数量)
第二种方式
1. npm i getting-agent
const gat = require('getting-agent');
(async ()=>{
const res = await gat(10,false) //10 获取代理IP数量 ,false 不保存本地文件,true 保存本地json文件
console.log(res)
})()
11 回复
正好却代理IP,我拿走了
正巧我之前也做了个类似的东西。。看了一下代码,跟你的原理差不多,但是后来我发现,利用返回200状态码并不能筛选出可用的代理。。你可以试一下把你筛选出的代理配置到浏览器里,中转的代理服务器把请求重定向有道首页,有的代理则根本不通。。。后来我想了个解决办法,我构造了一个返回数字1的URL,除了判断200状态码,还判断返回结果是不是1。。。
然后这是我做的小项目 http://httpproxy.docmobile.cn 提供筛选出的可用代理的API http://httpproxy.docmobile.cn/fetchanswer
@LuckyHH 确实200不能够判断重定向问题,需获网页详细内容加以验证,已修改
还没有爬过东西 收藏了。。。
参考 @pretty-foam @LuckyHH 两位的思路,我写了一个获取http高匿低延迟代理的爬虫,长这样:
const request = require('request');
const cheerio = require('cheerio');
const _ = require('lodash');
const Promise = require('bluebird');
const host = 'http://www.xicidaili.com';
const parseBody = (body) => {
const $ = cheerio.load(body);
const rows = $('#ip_list tbody tr');
const items = [];
rows.each((idx, row) => {
if (idx > 0) {
const item = {};
const $row = $(row);
$row.find('td').each((i, td) => {
const $td = $(td);
switch (i) {
case 1:
item.ip = $td.text();
break;
case 2:
item.port = $td.text();
break;
case 4:
item.type = $td.text();
break;
case 6: // 速度
item.speed = $td.children('div').attr('title');
break;
default:
break;
}
});
item.speed = parseFloat(item.speed.replace('秒', ''));
items.push(item);
}
});
const results = _.filter(items, (item) => {
return item.type === '高匿' && item.speed < 0.2;
});
return results;
};
const getPageData = (page = 1) => {
console.log(`正在获取第 ${page} 页的数据。。。`);
const opts = {
baseUrl: host,
uri: page > 1 ? `/wt/${page}` : '/wt/',
};
const pm = new Promise((resolve, reject) => {
request(opts, (err, res, body) => {
if (err) {
reject(err);
return;
}
const items = parseBody(body);
resolve(items);
});
});
return pm;
};
const checkProxy = (purl) => {
const pm = new Promise((resolve) => {
request({
url: 'http://xxx.xxx.xxx.xxx:3000', // 自己服务器的API,用于检测代理是否有效
proxy: purl,
timeout: 5 * 1000, // 过滤掉5秒内无响应的代理
}, (err, res, body) => {
if (err) {
resolve(false);
return;
}
try {
const b = JSON.parse(body);
if (res.statusCode === 200 && b.ok) {
resolve(true);
} else {
resolve(false);
}
} catch (error) {
resolve(false);
}
});
});
return pm;
};
const getGoodProxies = (page = 1) => {
const pm = new Promise(async (resolve) => {
const items = await getPageData(page);
const goodProxies = [];
console.log('正在挑选好的代理。。。');
const isGoods = await Promise.map(items, (item) => {
const purl = `http://${item.ip}:${item.port}`;
return checkProxy(purl);
});
isGoods.forEach((ok, idx) => {
if (ok) {
const item = items[idx];
goodProxies.push(`http://${item.ip}:${item.port}`);
}
});
resolve(goodProxies);
});
return pm;
};
const run = async () => {
const proxies = [];
let page = 1;
while(proxies.length < 100) {
const ps = await getGoodProxies(page);
proxies.push(...ps);
console.log(`当前代理总数: ${proxies.length}`);
page += 1;
}
console.log(proxies);
};
run();
可惜,满足我要求的代理很少,爬了100页才找到6个。。。
更新了,这次更靠谱
我早写了个…可以爬国内好多家代理网站的免费代理
你们爬的国内的免费代理确定能用吗?感觉爬一些国外的质量还凑合。。
来自✨ Node.js开源项目精选✨
代理数量比较少,这个能不能用还得看具体需求,对我够用
好东西,应该封一个 npm 包
。。。还能用,更了下0…0