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 相关文章推荐
为超链接加上disabled后的故事
Dec 10 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
Feb 07 Javascript
判断iframe里的页面是否加载完成
Jun 06 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
Nov 19 Javascript
JS设置cookie、读取cookie
Feb 24 Javascript
RequireJS 依赖关系的实例(推荐)
Jan 21 Javascript
JavaScript获取select中text值的方法
Feb 13 Javascript
vue源码入口文件分析(推荐)
Jan 30 Javascript
JavaScript变量声明var,let.const及区别浅析
Apr 23 Javascript
微信小程序用户信息encryptedData详解
Aug 24 Javascript
基于Proxy的小程序状态管理实现
Jun 14 Javascript
微信小程序图片左右摆动效果详解
Jul 13 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
mysql5写入和读出乱码解决
2006/11/25 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
php中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
js点击选择文本的方法
2015/02/09 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
google广告之另类js调用实现代码
2020/08/22 Javascript
前端性能优化建议
2020/09/17 Javascript
python测试驱动开发实例
2014/10/08 Python
让 python 命令行也可以自动补全
2014/11/30 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
python爬虫获取多页天涯帖子
2018/02/23 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
python字典排序的方法
2019/10/12 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
python中turtle库的简单使用教程
2020/11/11 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
主管职责范文
2013/11/09 职场文书
化工操作工岗位职责
2014/04/29 职场文书
新闻传播专业求职信
2014/07/22 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书