使用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的模块写法入门(实例代码)
Mar 07 NodeJs
NodeJS学习笔记之Http模块
Jan 13 NodeJs
PHP和NodeJs开发的应用如何共用Session
Apr 16 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
Jan 29 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 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
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
Discuz 模板引擎的封装类代码
2008/07/18 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
javascript 在网页中的运用(asp.net)
2009/11/23 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
jQuery消息提示框插件Tipso
2015/05/04 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
2016/08/15 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
JS常见算法详解
2017/02/28 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
2018/07/25 jQuery
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
python中执行shell命令的几个方法小结
2014/09/18 Python
Python 登录网站详解及实例
2017/04/11 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
如何进行有效的自我评价
2013/09/27 职场文书
教育专业自荐书范文
2013/12/17 职场文书
学校安全检查制度
2014/01/27 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
安全责任书模板
2014/07/22 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书