nodejs爬虫,获取免费的高匿代理
发布于 1 年前 作者 pretty-foam 3273 次浏览 来自 分享
  • 获取国内高匿代理
  1. npm install
  2. node proxy 地址 有用可以来一颗star 0…0
10 回复

正好却代理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 包

回到顶部