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 相关文章推荐
引入autocomplete组件时JS报未结束字符串常量错误
Mar 19 Javascript
使用jQuery实现星级评分代码分享
Dec 09 Javascript
JS实现当前页居中分页效果的方法
Jun 18 Javascript
解决node.js安装包失败的几种方法
Sep 02 Javascript
微信小程序 ecshop地址三级联动实现实例代码
Feb 28 Javascript
详解微信小程序 相对定位和绝对定位
May 11 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
Jun 30 Javascript
Angular在模板驱动表单中自定义校验器的方法
Aug 09 Javascript
vue router下的html5 history在iis服务器上的设置方法
Oct 18 Javascript
解析Angular 2+ 样式绑定方式
Jan 15 Javascript
深入理解Promise.all
Aug 08 Javascript
小程序云开发如何实现图片上传及发表文字
May 17 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文件夹与文件目录操作函数介绍
2013/09/09 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
ppk谈JavaScript style属性
2008/10/10 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
解析vue中的$mount
2017/12/21 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
Python的lambda匿名函数的简单介绍
2013/04/25 Python
python 远程统计文件代码分享
2015/05/14 Python
Python实现购物车购物小程序
2018/04/18 Python
详解python持久化文件读写
2019/04/06 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
物流司机岗位职责
2013/12/28 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
医院保洁服务方案
2014/06/11 职场文书
土建施工员岗位职责
2015/04/11 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
感恩父母主题班会
2015/08/12 职场文书
Python turtle编写简单的球类小游戏
2022/03/31 Python
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL