node.js 抓取代理ip实例代码


Posted in Javascript onApril 30, 2017

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接口的简易服务器实现

server

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,是因为对异步语法还不是很熟,怎么会怎么写了。

使用方式:

 根据package.json

npm install   // 安装支持

node index.js  //获取代理 ip

node server.js  //运行简易ip接口

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
javascript实现类似超链接的效果
Dec 26 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
Feb 28 Javascript
angularjs创建弹出框实现拖动效果
Aug 25 Javascript
jQuery Pagination分页插件使用方法详解
Feb 28 Javascript
关于预加载InstantClick的问题解决方法
Sep 12 Javascript
关于Angularjs中跨域设置白名单问题
Apr 17 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
Aug 30 Javascript
Vue.js组件实现选项卡以及切换特效
Jul 24 Javascript
JavaScript 截取字符串代码实例
Sep 05 Javascript
layer.open组件获取弹出层页面变量、函数的实例
Sep 25 Javascript
javascript用defineProperty实现简单的双向绑定方法
Apr 03 Javascript
JS Canvas接口和动画效果大全
Apr 29 Javascript
socket.io学习教程之深入学习篇(三)
Apr 29 #Javascript
socket.io学习教程之基本应用(二)
Apr 29 #Javascript
socket.io学习教程之基础介绍(一)
Apr 29 #Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
Apr 29 #Javascript
Vue.js在使用中的一些注意知识点
Apr 29 #Javascript
jQuery实现按比例缩放图片的方法
Apr 29 #jQuery
Vue开发中整合axios的文件整理
Apr 29 #Javascript
You might like
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
PHP CURL使用详解
2019/03/21 PHP
javascript 词法作用域和闭包分析说明
2010/08/12 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
js实现单张图片平移切换效果
2017/10/11 Javascript
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
JavaScript 替换所有匹配内容及正则替换方法
2020/02/12 Javascript
vue自定义组件实现双向绑定
2021/01/13 Vue.js
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
python定时器使用示例分享
2014/02/16 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
python实例化对象的具体方法
2020/06/17 Python
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
申请任职学生会干部自荐书范文
2014/02/13 职场文书
中职毕业生自我鉴定
2014/09/13 职场文书
工伤私了协议书范本
2014/11/24 职场文书
五年级下册复习计划
2015/01/19 职场文书
网络管理员岗位职责
2015/02/12 职场文书
研究生个人学年总结
2015/02/14 职场文书
美丽人生观后感
2015/06/03 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
靠谱准确的求职信
2019/04/02 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android