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 相关文章推荐
Whatever:hover 无需javascript让IE支持丰富伪类
Jun 29 Javascript
jQuery实现简易的天天爱消除小游戏
Oct 16 Javascript
详解JavaScript中的构造器Constructor模式
Jan 14 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
Oct 28 Javascript
React-Router如何进行页面权限管理的方法
Dec 06 Javascript
微信小程序中如何使用flyio封装网络请求
Jul 03 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
Sep 03 Javascript
javaScript中indexOf用法技巧
Nov 26 Javascript
小程序使用wxs解决wxml保留2位小数问题
Dec 13 Javascript
JavaScript监听触摸事件代码实例
Dec 30 Javascript
JavaScript前端开发时数值运算的小技巧
Jul 28 Javascript
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
Linux下PHP安装mcrypt扩展模块笔记
2014/09/10 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
[22:20]初生之犊-TI4第5名LGD战队纪录片
2014/08/13 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
python对html过滤处理的方法
2018/10/21 Python
python 高效去重复 支持GB级别大文件的示例代码
2018/11/08 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
基于python实现高速视频传输程序
2019/05/05 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
python实现在线翻译功能
2020/03/03 Python
Python super()方法原理详解
2020/03/31 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
门卫岗位职责
2013/11/15 职场文书
教师开学感言
2014/02/14 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
党支部承诺书范文
2014/03/28 职场文书
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript