node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)


Posted in Javascript onApril 10, 2019

公司有过一个需求,需要拿一个网页的的表格数据,数据量达到30w左右;为了提高工作效率。

结合自身经验和网上资料。写了一套符合自己需求的nodejs爬虫工具。也许也会适合你的。

先上代码。在做讲解

'use strict';
// 引入模块
const superagent = require('superagent');
const cheerio = require('cheerio');
const Excel = require('exceljs');
var baseUrl = '';
var Cookies = 'PHPSESSID=1c948cafb361cb5dce87122846e649cd'; //伪装的cookie
let pageDatas = [];
let count = 1;
let limit = 3;
for (count; count < limit; count++) { 
  baseUrl = `http://bxjd.henoo.com/policy/policyList?page=${count}`;
  loadPage(baseUrl); 
}
function loadPage(baseUrl) { 
   getPageLoad(baseUrl);
} 
async function getPageLoad(baseUrl) {
  try {
    let body = await superagent.get(baseUrl)
      .set("Cookie", Cookies)
    var $ = cheerio.load(body.text);
    var trList = $("#tableList").children("tr");  
      for (var i = 0; i < trList.length; i++) { 
        let item = {};
        var tdArr = trList.eq(i).find("td");
        var id = tdArr.eq(0).text();
        item.sortId = id;
        var detailUrl = `http://bxjd.henoo.com/policy/view?id=${id}`;
        item.policyId = tdArr.eq(1).text();
        item.policyProductName = tdArr.eq(2).text();
        item.policyName = tdArr.eq(3).text();
        item.policyMoney = tdArr.eq(4).text();
        let detailBody = await superagent.get(detailUrl)
          .set("Cookie", Cookies);
        var $$ = cheerio.load(detailBody.text);
        var detailT = $$(".table-view");     
        //投保人证件号
        item.policyIdNum = detailT.find("tr").eq(11).find("td").eq(1).text();
        //投保人手机号
        item.policyPhone = detailT.find("tr").eq(10).find("td").eq(1).text();
        //被保人手机号
        item.bePoliciedPhone = detailT.find("tr").eq(16).find("td").eq(1).text();      
        //被保人姓名
        item.bePoliciedName = detailT.find("tr").eq(13).find("td").eq(1).text();
        console.log(item.bePoliciedName)
        //被保人证件号
        item.bePoliciedIdNum = detailT.find("tr").eq(17).find("td").eq(1).text();
        pageDatas = [...pageDatas,item];
      }
    if (pageDatas.length / 15 == (count - 1)) { 
      writeXLS(pageDatas)
    }
  } catch (error) {
  }
}
function writeXLS(pageDatas) {
  const workbook = new Excel.Workbook();
  const sheet = workbook.addWorksheet('My Sheet');
  const reColumns=[
    {header:'序号',key:'sortId'},
    {header:'投保单号',key:'policyId'},
    {header: '产品名称', key: 'policyProductName'},
    {header: '投保人姓名', key: 'policyName' },
    {header: '投保人手机号', key: 'policyPhone' },
    {header: '投保人证件号', key: 'policyIdNum'},
    {header: '被保人姓名', key: 'bePoliciedName' },
    {header: '被保人手机号', key: 'bePoliciedPhone' },
    {header: '被保人证件号', key: 'bePoliciedIdNum' },
    {header:'保费',key:'policyMoney'},
  ];
  sheet.columns = reColumns;
  for(let trData of pageDatas){
    sheet.addRow(trData);
  }
  const filename = './projects.xlsx';
  workbook.xlsx.writeFile(filename)
  .then(function() {
   console.log('ok');
  }).catch(function (error) { 
     console.error(error); 
  });
 }

代码使用方式

一、npm install 相关的依赖二、代码修改

1、修改为自己的baseUrl

2、如果不需要携带cookie时将set("Cookie", Cookies)代码去掉

3、修改自己的业务代码

三、运行 node index四、部分代码说明

所有代码不过90行不到,操作了表格数据获取和单条数据详情的获取

node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)

接口请求的框架使用superagent的原因是拼接伪装的cookie的操作比较简单。因为有的时候我们需要获取登录后的页面数据。

这个时候可能需要请求是携带登录cookie信息。返回后的body对象通过cheerio.load之后就能拿到一个类似jquery的文档对象。

后面就可以很方便的使用jquery的dom操作方式去拿到页面内自己想要的数据了。

node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)

数据写入到excel中。

五、结果

node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)

node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)

总结

Javascript 相关文章推荐
JS获取Table中td值的方法
Mar 19 Javascript
简介JavaScript中Boolean.toSource()方法的使用
Jun 05 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
Oct 15 Javascript
Bootstrap开发实战之第一次接触Bootstrap
Jun 02 Javascript
AngularJS中的Promise详细介绍及实例代码
Dec 13 Javascript
ES6新特性之Symbol类型用法分析
Mar 31 Javascript
记React connect的几种写法(小结)
Sep 18 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
Apr 10 jQuery
JavaScript:ES2019 的新特性(译)
Aug 08 Javascript
layui关闭层级、简单监听的实例
Sep 06 Javascript
layui table 获取分页 limit的方法
Sep 20 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
Jul 15 Javascript
详解关于html,css,js三者的加载顺序问题
Apr 10 #Javascript
angular2 NgModel模块的具体使用方法
Apr 10 #Javascript
bootstrap tooltips在 angularJS中的使用方法
Apr 10 #Javascript
javascript判断一个变量是数组还是对象
Apr 10 #Javascript
Angular CLI 使用教程指南参考小结
Apr 10 #Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
Apr 10 #Javascript
element-ui多文件上传的实现示例
Apr 10 #Javascript
You might like
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
jQuery之按钮组件的深入解析
2013/06/19 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
jQuery设置与获取HTML,文本和值的简单实例
2014/02/26 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
element-ui中el-upload多文件一次性上传的实现
2020/12/02 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
[09:59]DOTA2-DPC中国联赛2月7日Recap集锦
2021/03/11 DOTA
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
python解析含有重复key的json方法
2019/01/22 Python
Django的性能优化实现解析
2019/07/30 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
自荐信的基本格式
2014/02/22 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
人才市场接收函
2015/01/30 职场文书