使用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中SSL服务的性能
Jul 15 NodeJs
nodejs开发环境配置与使用
Nov 17 NodeJs
NodeJS学习笔记之Connect中间件应用实例
Jan 27 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
3分钟快速搭建nodejs本地服务器方法运行测试html/js
Apr 01 NodeJs
配置nodejs环境的方法
May 13 NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
nodejs中实现修改用户路由功能
May 24 NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 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
DC动漫人物排行
2020/03/03 欧美动漫
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
PHP 编写大型网站问题集
2010/05/07 PHP
php 在文件指定行插入数据的代码
2010/05/08 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
解析thinkphp基本配置 convention.php
2013/06/18 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
PDO::errorCode讲解
2019/01/28 PHP
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
ext combobox动态加载数据库数据(附前后台)
2014/06/17 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
Python读写zip压缩文件的方法
2018/08/29 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
Python关于反射的实例代码分享
2020/02/20 Python
python 负数取模运算实例
2020/06/03 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
详解python程序中的多任务
2020/09/16 Python
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
数据员岗位职责
2013/11/19 职场文书
班组长的岗位职责
2013/12/09 职场文书
含预算的公司户外活动方案
2014/08/16 职场文书
工厂仓库管理员岗位职责
2015/04/09 职场文书
红色故事汇观后感
2015/06/18 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers