使用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学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
NodeJS学习笔记之Connect中间件模块(二)
Jan 27 NodeJs
Nodejs express框架一个工程中同时使用ejs模版和jade模版
Dec 28 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
NodeJS自定义模块写法(详解)
Jun 27 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 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
一个ftp类(ini.php)
2006/10/09 PHP
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
2019/04/10 PHP
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
python 整数越界问题详解
2019/06/27 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
护理专业的自荐信
2013/10/22 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
运动会致辞稿50字
2014/02/04 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
实现中国梦思想汇报2014
2014/09/13 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
2016年会开场白台词
2015/06/01 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
MySQL触发器的使用
2021/05/24 MySQL