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 相关文章推荐
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
Jul 26 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
Sep 10 Javascript
SyntaxHighlighter 3.0.83使用笔记
Jan 26 Javascript
总结jQuery插件开发中的一些要点
May 16 Javascript
angularjs 源码解析之scope
Aug 22 Javascript
jquery实现百叶窗效果
Jan 12 Javascript
微信小程序中子页面向父页面传值实例详解
Mar 20 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
Jul 11 Javascript
js判断节假日实例代码
Dec 27 Javascript
jQuery.parseJSON()函数详解
Feb 28 jQuery
JS实现canvas简单小画板功能
Jun 23 Javascript
jQuery实现简单飞机大战
Jul 05 jQuery
详解关于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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
js中的for如何实现foreach中的遍历
2014/05/31 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
Angular和百度地图的结合实例代码
2016/10/19 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
在Python的循环体中使用else语句的方法
2015/03/30 Python
python去掉行尾的换行符方法
2017/01/04 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
2017/11/02 Python
python使用MQTT给硬件传输图片的实现方法
2019/05/05 Python
Python2与Python3的区别详解
2020/02/09 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
Pycharm中如何关掉python console
2020/10/27 Python
python之随机数函数的实现示例
2020/12/30 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
施工单位工程部经理岗位职责
2015/04/09 职场文书
写好Python代码的几条重要技巧
2021/05/21 Python
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS
Python读写yaml文件
2022/03/20 Python