Node.js 抓取代理 IP 并存储至 MongoDB 的完整实现

作者:服务小站

时间:2026-10-22

浏览:323

本文介绍如何使用 Node.js 编写脚本抓取代理 IP 网站数据,并利用 Cheerio 解析 HTML,通过 Mongoose 将结果存入 MongoDB。同时提供一个基于 Koa2 的简易 API 服务器,支持通过 HTTP 接口获取已存储的代理 IP 列表。

文章目录

Node.js 抓取代理 IP 实现概述

本文演示如何使用 Node.js 环境实现代理 IP 的抓取过程。

项目的主要执行文件为 index.js。

核心抓取代码与依赖配置


/*
* 支持:node.js v7.9.0
*/
const cheerio=require('cheerio');
const fetch =require('node-fetch');
const Promise=require('bluebird');
let mongoose=require('mongoose');

Promise.promisifyAll(mongoose);
let Schema=mongoose.Schema;
mongoose.connect('mongodb://localhost:27017/ipproxypool');
let IPpool=new Schema({
  ip:{type:String,unique:true}
})
let Ipproxy=mongoose.model('IP',IPpool);

function fetchUrl(url){
  fetch(url,{
    method:'get',
    headers:{
    }
  })
  .then(res=>res.text())
  .then(body=>{
    let $=cheerio.load(body);
    let length=$('#list table tbody').find('tr').length;
    for (let i=0;i<length;i++){
    let ipaddress= $('#list table tbody').find('tr').eq(i).find('td').eq(0).text() ;
    let port = $('#list table tbody').find('tr').eq(i).find('td').eq(1).text();
    console.log(`IP:${ipaddress}:${port}`);
    let ip=`${ipaddress}:${port}`
    let ippool=new Ipproxy({
      ip:ip
    })
    ippool.save();
    }
  })
}

var sleep = function (time) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve('ok');
    }, time);
  })
};
const pageNumber=10;
var start = async function(){
  for(let j=1;j<pageNumber;j++){
     console.log(`当前是第${j}次等待..`);
    fetchUrl(`http://www.kuaidaili.com/free/inha/${j}/`);
    await sleep(1500);
  }
}
start();

项目依赖配置包含在 package.json 文件中,列出了所需的第三方库。


{
 "name": "demo-4-ipproxypool",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
  "test": "echo \"Error: no test specified\" && exit 1"
 },
 "author": "false-l",
 "license": "",
 "devDependencies": {
  "babel-preset-es2015": "^6.24.1",
  "babel-preset-react": "^6.24.1",
  "babel-preset-stage-3": "^6.24.1"
 },
 "dependencies": {
  "babel-core": "^6.24.1",
  "bluebird": "^3.5.0",
  "cheerio": "^0.22.0",
  "koa": "^2.2.0",
  "koa-router": "^7.1.1",
  "mongoose": "^4.9.6",
  "node-fetch": "^1.6.3"
 }
}

运行环境要求本地已安装 MongoDB 数据库,用于持久化存储抓取到的 IP 地址。当前版本尚未包含 IP 有效性验证功能,编写此代码主要出于技术探索目的。

上述代码逻辑能够完成从代理 IP 网站抓取数据,并将获取到的 IP 地址保存至 MongoDB 数据库的操作。

此外,这里提供一个基于 Koa2 框架构建的简易 API 服务器实现,用于暴露获取代理 IP 的接口。

该部分代码对应 server 模块的实现。

Koa2 API 服务器实现


const Promise=require('bluebird');
let mongoose=require('mongoose');
const koa=require('koa');
const app=new koa();
var router = require('koa-router')();
Promise.promisifyAll(mongoose);
let Schema=mongoose.Schema;
mongoose.connect('mongodb://localhost:27017/ipproxypool');
let IPpool=new Schema({
  ip:{type:String,unique:true}
})
let Ipproxy=mongoose.model('IP',IPpool);

app.use(async (ctx, next) => {
 await next();
 var data=await Ipproxy.find({},function(err,ips){
  var ipmap=[];
   ips.forEach(function(ip){
     ipmap[ip._id]=ip;
     //console.log(ip)
   });
 })
 var map=data.map(ip=>ip.ip);
 ctx.response.type = 'text/json';
 ctx.response.body = map;
});
app.listen(3000);
console.log('server listen:3000')

代码中同时使用了 Promise 和 async/await 语法,主要是为了兼容作者对异步处理逻辑的熟悉程度,采用更习惯的写法进行实现。

具体使用步骤如下:

运行与使用方法

首先参考 package.json 中的依赖配置。

执行 npm install 命令安装所有支持的依赖包。

运行 node index.js 命令以启动代理 IP 抓取任务。

运行 node server.js 命令以启动简易的 IP 查询接口服务。

感谢阅读,希望本文内容能对大家有所帮助,欢迎支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章