使用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实现遍历文件夹并统计文件大小
May 28 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
详解nodejs 文本操作模块-fs模块(四)
Dec 22 NodeJs
nodejs基础应用
Feb 03 NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 NodeJs
nodeJS进程管理器pm2的使用
Jan 09 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 NodeJs
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
Dec 14 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一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
php中对2个数组相加的函数
2011/06/24 PHP
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
Display SQL Server Login Mode
2007/06/21 Javascript
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
Package.js  现代化的JavaScript项目make工具
2012/05/23 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
js鼠标经过tab选项卡时实现切换延迟
2017/03/24 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
python魔法方法-自定义序列详解
2016/07/21 Python
python读取中文txt文本的方法
2018/04/12 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
Python jieba库用法及实例解析
2019/11/04 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
应届生.NET方向面试题
2015/05/23 面试题
C#公司笔试题
2014/03/28 面试题
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
校园自助餐厅的创业计划书
2013/12/26 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
舌尖上的中国观后感
2015/06/02 职场文书
php+laravel 扫码二维码签到功能
2021/05/15 PHP
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python