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客户端将指定区域导出到Word、Excel的代码
Oct 22 Javascript
javascript attachEvent和addEventListener使用方法
Mar 19 Javascript
jquery select选中的一个小问题
Oct 11 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
Aug 12 Javascript
javascript插件开发的一些感想和心得
Feb 28 Javascript
从零学习node.js之利用express搭建简易论坛(七)
Feb 25 Javascript
angularjs项目的页面跳转如何实现(5种方法)
May 25 Javascript
基于EasyUI的基础之上实现树形功能菜单
Jun 28 Javascript
vue轮播图插件vue-concise-slider的使用
Mar 13 Javascript
Angularjs中date过滤器失效的问题及解决方法
Jul 06 Javascript
countUp.js实现数字动态变化效果
Oct 17 Javascript
JS实现烟花爆炸效果
Mar 10 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
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
2011/06/24 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
2015/12/22 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
vue实现评论列表功能
2019/10/25 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
javascript实现时钟动画
2020/12/03 Javascript
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python 网络爬虫初级实现代码
2016/02/27 Python
DataFrame中去除指定列为空的行方法
2018/04/08 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
python 实现简单的FTP程序
2019/12/27 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
linux面试题参考答案(11)
2016/11/26 面试题
销售心得体会
2014/01/02 职场文书
购房意向书范本
2014/04/01 职场文书
项目经理任命书范本
2014/06/05 职场文书
关于读书的活动方案
2014/08/14 职场文书
竞选学委演讲稿
2014/09/13 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
会计稽核岗位职责
2015/04/13 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
golang中实现给gif、png、jpeg图片添加文字水印
2021/04/26 Golang
分析MySQL优化 index merge 后引起的死锁
2022/04/19 MySQL