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 相关文章推荐
JSON JQUERY模板实现说明
Jul 03 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
Jun 16 Javascript
jquery实现九宫格大转盘抽奖
Nov 13 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
Jun 21 Javascript
Vue.js开发环境快速搭建教程
Mar 17 Javascript
深入理解ES6学习笔记之块级作用域绑定
Aug 19 Javascript
深入理解Vue 单向数据流的原理
Nov 09 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
Dec 22 Javascript
微信小程序开发注意指南和优化实践(小结)
Jun 21 Javascript
layui实现下拉框三级联动
Jul 26 Javascript
基于Vue 撸一个指令实现拖拽功能
Oct 09 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
Oct 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/06/25 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
jQuery autocomplete插件修改
2009/04/17 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
form表单action提交的js部分与html部分
2014/01/07 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
js运动事件函数详解
2016/10/21 Javascript
loading动画特效小结
2017/01/22 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
10分钟学会js处理json的常用方法
2020/12/06 Javascript
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
详解Python3中yield生成器的用法
2015/08/20 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
运动检测ViBe算法python实现代码
2018/01/09 Python
kafka-python批量发送数据的实例
2018/12/27 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
python中upper是做什么用的
2020/07/20 Python
python mock测试的示例
2020/10/19 Python
Django解决frame拒绝问题的方法
2020/12/18 Python
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
模具毕业生推荐信
2014/02/15 职场文书
小学班长竞选演讲稿
2014/04/24 职场文书
学校政风行风整改方案
2014/10/25 职场文书
银行竞聘报告范文
2014/11/06 职场文书
施工安全保证书
2015/05/09 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python