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 实现父窗口引用弹出窗口的值的脚本
Aug 07 Javascript
event.keyCode键码值表 附只能输入特定的字符串代码
May 15 Javascript
慎用 somefunction.prototype 分析
Jun 02 Javascript
jQuery渐变发光导航菜单的实例代码
Mar 27 Javascript
Javascript实现网络监测的方法
Jul 31 Javascript
jquery实现标题字体变换的滑动门菜单效果
Sep 07 Javascript
JS使用post提交的两种方式
Dec 03 Javascript
基于AngularJS+HTML+Groovy实现登录功能
Feb 17 Javascript
总结在前端排序中遇到的问题
Jul 19 Javascript
Swiper实现轮播图效果
Jul 03 Javascript
vue component组件使用方法详解
Jul 14 Javascript
angularjs1.X 重构controller 的方法小结
Aug 15 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 动态添加记录
2009/03/10 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
js类式继承与原型式继承详解
2016/04/07 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
详解在Angular项目中添加插件ng-bootstrap
2017/07/04 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
2019/09/16 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
Python 列表(List)操作方法详解
2014/03/11 Python
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
详解Python中for循环是如何工作的
2017/06/30 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
python实现KNN近邻算法
2020/12/30 Python
幼儿教师寄语集锦
2014/04/03 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
小石潭记导游词
2015/02/03 职场文书
出国留学导师推荐信
2015/03/26 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis