使用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实现PHP的print_r函数代码
Mar 14 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
浅谈Nodejs应用主文件index.js
Aug 28 NodeJs
nodejs简单实现操作arduino
Sep 25 NodeJs
nodejs redis 发布订阅机制封装实现方法及实例代码
Dec 15 NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 NodeJs
CentOS 安装NodeJS V8.0.0的方法
Jun 15 NodeJs
nodejs中Express与Koa2对比分析
Feb 06 NodeJs
Linux Centos7.2下安装nodejs&npm配置全局路径的教程
May 15 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 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数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
js如何改变文章的字体大小
2016/01/08 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
Python paramiko模块的使用示例
2018/04/11 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
flask-restful使用总结
2018/12/04 Python
Django配置文件代码说明
2019/12/04 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
怎样写好自我鉴定
2013/12/04 职场文书
空中乘务员岗位职责
2014/03/08 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书
Feign调用传输文件异常的解决
2021/06/24 Java/Android