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.cookie() 方法的使用(读取、写入、删除)
Dec 05 Javascript
在javascript中执行任意html代码的方法示例解读
Dec 25 Javascript
JQuery对表格进行操作的常用技巧总结
Apr 23 Javascript
JavaScript二维数组实现的省市联动菜单
May 08 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
Sep 12 Javascript
一个不错的仿携程自定义数据下拉选择select
Sep 01 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
Sep 01 Javascript
jquery对象访问是什么及使用方法介绍
May 03 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
Mar 15 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
Aug 01 jQuery
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
Sep 04 Javascript
微信小程序 轮播图实现原理及优化详解
Sep 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 5.0创建图形的巧妙方法
2010/10/12 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
PHP 正则表达式小结
2015/02/12 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
JS 自定义带默认值的函数
2011/07/21 Javascript
运算符&amp;&amp;的三个不同层次
2013/04/07 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
Bootstrap每天必学之栅格系统(布局)
2015/11/25 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
js实现无缝滚动图
2017/02/22 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
使用Vue CLI创建typescript项目的方法
2019/08/09 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
使用pip安装python库的多种方式
2019/07/31 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
上海奥佳笔试题面试题
2016/11/16 面试题
会计电算化专业应届大学生求职信
2013/10/22 职场文书
补充协议书范本
2014/04/23 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
详解Nginx 工作原理
2021/03/31 Servers