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 相关文章推荐
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
Jan 11 Javascript
js制作简易年历完整实例
Jan 28 Javascript
jQuery+Ajax实现无刷新分页
Oct 30 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
Dec 05 Javascript
深入探究AngularJS框架中Scope对象的超级教程
Jan 04 Javascript
jQuery实现简单倒计时功能的方法
Jul 04 Javascript
深入理解requestAnimationFrame的动画循环
Sep 20 Javascript
Vue获取DOM元素样式和样式更改示例
Mar 07 Javascript
vue多种弹框的弹出形式的示例代码
Sep 18 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
Feb 08 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
Jun 28 Javascript
Javascript如何实现双指控制图片功能
Feb 25 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
解析htaccess伪静态的规则
2013/06/18 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
php实现在多维数组中查找特定value的方法
2015/07/29 PHP
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
使用python绘制人人网好友关系图示例
2014/04/01 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
django的autoreload机制实现
2020/06/03 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
文明餐桌行动实施方案
2014/02/19 职场文书
节约用水倡议书
2014/04/16 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
英文版辞职信
2015/02/28 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
MySQL修炼之联结与集合浅析
2021/10/05 MySQL
Golang 并发编程 SingleFlight模式
2022/04/26 Golang