使用nodejs爬取前程无忧前端技能排行


Posted in NodeJs onMay 06, 2017

最近准备换工作,需要更新一下技能树。为做到有的放矢,想对招聘方的要求做个统计。正好之前了解过nodejs,所以做了个爬虫搜索数据。

具体步骤:

1.  先用fiddler分析请求需要的header和body。

2.  再用superagent构建上述数据发送客户端请求。

3.  最后对返回的数据使用cheerio整理。

折腾了几个晚上,只搞出了个架子,剩余工作等有时间再继续开发。

/*使用fiddler抓包,需要配置lan代理,且设置如下参数*/
process.env.https_proxy = "http://127.0.0.1:8888";
process.env.http_proxy = "http://127.0.0.1:8888";
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
/*使用到的模块*/
var request = require('superagent');  //发送客户端请求
require('superagent-proxy')(request);  //使用代理发送请求
var cheerio = require('cheerio');    //以jq类似的方法操作返回的字符,不需要用正则
require('superagent-charset')(request);//node不支持gbk,gb2312,this will add request.Request.prototype.charset.
var async = require('async');      //异步流控制模块
var fs = require('fs');
/*相关参数,通过fiddler抓包后复制过来*/
var ws = fs.createWriteStream('res.html',{flags:'w+'}); //a+追加的读写模式,w+覆盖
var loginUrl = "https://login.51job.com/login.php";
var searchUrl = "http://search.51job.com/jobsearch/search_result.php";
var queryStrings = "fromJs=1&jobarea=020000&keyword=%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91&keywordtype=2&lang=c&stype=2&postchannel=0000&fromType=1&confirmdate=9";
var loginForms = {
  lang: 'c',
  action: 'save',
  from_domain: 'i',
  loginname: '***',  //自己的用户名和密码
  password: '***',
  verifycode: '',
  isread: 'on'
};
var searchForms = {
  lang: 'c',
  stype: '2',
  postchannel: '0000',
  fromType: '1',
  line: '',
  confirmdate: '9',
  from: '',
  keywordtype: '2',
  keyword: '%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91',
  jobarea: '020000',
  industrytype: '',
  funtype: ''
};
var searchFormsString='lang=c&stype=2&postchannel=0000&fromType=1&line=&confirmdate=9&from=&keywordtype=2&keyword=%C7%B0%B6%CB%BF%AA%B7%A2&jobarea=020000&industrytype=&funtype=';
var proxy0 = process.env.https_proxy;
var proxy = process.env.http_proxy;
const agent = request.agent();     //agent()方法产生的实例会保存cookie供后续使用
request.post(loginUrl).proxy(proxy0).send(loginForms).end(function (err,res0) {
  agent.post(searchUrl)
    .proxy(proxy)          //proxy()方法需紧跟在method方法之后调用,否则fiddler抓不到数据包
    .type('application/x-www-form-urlencoded')
    .query(queryStrings)  
//使用字符串格式
    .send(searchFormsString)
    .charset('gbk')        //通过charset可知编码字符格式,不设置会有乱码
    .end(function (err, res) {
      /* 以下是处理返回数据的逻辑代码*/
      var $ = cheerio.load(res.text);  //res.text是返回的报文主体
      async.each($('.el.title').nextAll('.el'), function(v, callback) {
        //将多余的内容删除,保留岗位、公司链接
        $(v).prepend($(v).find('.t1 a'));
        $(v).find('.t1').remove();
        ws.write($.html(v), 'utf8');
      }, function(err) {
        console.log(err);
      });
      console.log('successful');
    })
});
//jquery内置document元素为root,cheerio需要通过load方法传入,然后用选择器查找指定元素,再执行相应操作。
// $.html(el);静态方法,返回el元素的outerHtml
//TODO
// 1.当前只请求到一页数据,还需构建所有页数的请求列表
// 2.向每条数据的岗位链接发送请求,获取技能关键字,存入文件中
// 3.node中io操作是异步的,且没有锁的概念,如何并发地向同一个文件正确地写入数据

结果显示如下:

使用nodejs爬取前程无忧前端技能排行

以上所述是小编给大家介绍的使用nodejs爬前程无忧前端技能排行,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

NodeJs 相关文章推荐
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
nodeJS实现路由功能实例代码
Jun 08 NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
Nodejs中crypto模块的安全知识讲解
Jan 03 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 NodeJs
nodejs使用async模块同步执行的方法
Mar 02 NodeJs
Nodejs 数组的队列以及forEach的应用详解
Feb 25 NodeJs
win系统下nodejs环境安装配置
May 04 #NodeJs
Nodejs--post的公式详解
Apr 29 #NodeJs
NodeJs的fs读写删除移动监听
Apr 28 #NodeJs
NodeJs安装npm包一直失败的解决方法
Apr 28 #NodeJs
NodeJs模拟登陆正方教务
Apr 28 #NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 #NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 #NodeJs
You might like
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
PHP插入排序实现代码
2013/04/04 PHP
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
利用javascript中的call实现继承
2007/01/22 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
移动端日期插件Mobiscroll.js使用详解
2016/12/19 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
详解小程序BackgroundAudioManager踩坑之旅
2019/12/08 Javascript
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python Tkinter基础控件用法
2014/09/03 Python
Python实现字典的key和values的交换
2015/08/04 Python
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
Python算术运算符实例详解
2017/05/31 Python
Python continue继续循环用法总结
2018/06/10 Python
Python实现的建造者模式示例
2018/08/06 Python
使用python3实现操作串口详解
2019/01/01 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
英国皇家邮政海外旗舰店:Royal Mail
2018/02/21 全球购物
爱我中华演讲稿
2014/05/20 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书