nodejs爬虫,获取免费的高匿代理
发布于 7 年前 作者 pretty-foam 8317 次浏览 最后一次编辑是 6 年前 来自 分享

介绍

获取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

回到顶部

AltStyle によって変換されたページ (->オリジナル) /