如何获取拉勾的职位数据进行统计!

数据展示地址:http://lg.otpath.com/

项目代码地址:https://github.com/WayneLiang/crawler-lagou

爬虫开始

环境要求

  • Node.js环境
  • Mongodb环境

主要模块

  • superagent 网络请求
  • superagent-proxy 代理IP转发
  • cheerio jQuery 核心实现
  • mongoose mongodb数据库使用
  • koa web框架
  • echarts 数据统计图表

一、抓取代理IP

防止请求过于频繁导致ip被网站屏蔽,请求都是使用代理IP进行。所以必须先获取对可用的代理IP,我选择http://www.xicidaili.com/nn/ 上的代理。然而获取回来的IP并不是每一个都可用,故需使用代理去请求http://ip.chinaz.com/getip.aspx ,若3秒内有响应即当作可用。具体代码如下:

var Models = require('../lib/core');
var $Ip = Models.$Ip;
var request = require('superagent');
var cheerio = require('cheerio');
require('superagent-proxy')(request);
(async function () {  
  for(var page = 1; page <= 10; page++){    
    //请求代理IP页面
    var res = await request.get('http://www.xicidaili.com/nn/' + page);    
    var $ = cheerio.load(res.text);    
    var tr = $('tr');    
    //从第二行开始获取IP和端口
    for(var line = 1 ; line < tr.length ; line++ ){      
      var td = $(tr[line]).children('td');      
      var proxy =  'http://' + td[1].children[0].data + ':' + td[2].children[0].data;     
      try {        
        //代理IP请求,设置超时为3000ms,返回正确即当可用
        var testip = await request.get('http://ip.chinaz.com/getip.aspx').proxy(proxy).timeout(3000);  
        if(testip.statusCode == 200 && testip.text.substring(0,4) == '{ip:' ){  
          //存入数据库
          await $Ip.addIp({proxy: proxy});        
        }
      }catch (error){      
      }    
    }  
  }
})();

二、抓取拉勾数据

async function crawlerPosition() {  
  var res = await request.get('http://www.lagou.com');  
  var $ = cheerio.load(res.text);  
  var length = $('#sidebar .menu_box').length;  
  var positions,position = {};  
  for(var num=0 ; num < length; num++){    
    position.name = $($('.menu_main h2')[num]).text().replace(/\n/g,'').replace(/ /g,'');    
    position.sub = [];    
    var menu_sub = ($($('.menu_sub')[num]).children('dl'));    
    for(var subnum=0 ; subnum < menu_sub.length; subnum++){      
      var subPosition = {};      
      subPosition.name = $(menu_sub[subnum]).children('dt').children('a').text();      
      subPosition.position = [];      
      positions = $(menu_sub[subnum]).children('dd').children('a');      
      for(var positionnum=0 ; positionnum < positions.length; positionnum++){       
        subPosition.position.push($(positions[positionnum]).text());      
      }      
      position.sub.push(subPosition);    
    }    
    await $Position.addPosition(position);  
  }  
  console.log('**************finish crawer position data***************');
}
async function crawlerJobTotal(city,position) {  
  var proxy = ips[ipNo++].proxy;  
  var positionResult,jobResult;  
  if(ipNo >= ips.length){    ipNo = 0;  }  
  try {    
    positionResult = await request.post('http://www.crawler.com/jobs/positionAjax.json?px=new&needAddtionalResult=false&city='+city) 
                                  .type('application/x-www-form-urlencoded')        
                                  .send({ kd: position.name, pn: 1,first:true })
                                  .proxy(proxy)
                                  .timeout(3000);  
  }catch(error){   
    console.log('request error, again');    
    return await crawlerJobTotal(city,position);  
  }  
  var totalCount;  
  if(positionResult.body && positionResult.body.success && (positionResult.body.content.length != 0)  &&(positionResult.body.content.positionResult!= 0)){    
    totalCount = positionResult.body.content.positionResult.totalCount;
    console.log(city,position.name,1,Date.now(),totalCount);    
    var item = {};    
    item.city = city;    
    item.position = position.name; 
    item.firstTag = position.firstTag;    
    item.secondTag = position.secondTag;    
    item.total = totalCount;    
    await $JobTotal.addJobTotal(item);  
  }else{    
    console.log('could not get positionResult,again',proxy);
    return await crawlerJobTotal(city,position);  
  }
}

三、数据展示

地区分布.png
薪资分布.png
工作经验与薪资.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容