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 控制内容长度超出规定长度显示省略号
May 23 Javascript
JS中FRAME的操作问题实例分析
Oct 21 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
Mar 02 Javascript
jQuery自定义图片上传插件实例代码
Apr 04 jQuery
微信小程序 setData的使用方法详解
Apr 20 Javascript
当vue路由变化时,改变导航栏的样式方法
Aug 22 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
Dec 06 Javascript
详解Vue.directive 自定义指令
Mar 27 Javascript
vue以组件或者插件的形式实现throttle或者debounce
May 22 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
Dec 17 Javascript
基于JS实现视频上传显示进度条
May 12 Javascript
jQuery实现广告显示和隐藏动画
Jul 04 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
php获取某个目录大小的代码
2008/09/10 PHP
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
基于MooTools的很有创意的滚动条时钟动画
2010/11/14 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
[02:43]2018DOTA2亚洲邀请赛主赛事首日TOP5
2018/04/04 DOTA
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python中使用enumerate函数遍历元素实例
2014/06/16 Python
Python中的tuple元组详细介绍
2015/02/02 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
python之cv2与图像的载入、显示和保存实例
2018/12/05 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
tensorflow之变量初始化(tf.Variable)使用详解
2020/02/06 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
消夏晚会主持词
2015/06/30 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书