Skip to content

使用 axios + cheerio + node-xlsx 爬取并导出到excel表格(网页爬虫)

具体实现过程请查看我的github 网页爬虫

核心代码实现部分

js
import { Injectable, Logger } from '@nestjs/common';
import axios from 'axios';
import * as cheerio from 'cheerio';
var fs = require('fs');
var path = require('path');
var config = require('./../config.js');
let counter = 0;  // 成功爬取的数据计数
var xlsx = require('node-xlsx');
let fileRoute = path.resolve(__dirname, config.rawDataFileName);
let fileName = path.resolve(__dirname, config.saveFileName);

@Injectable()
export class ProductService {
    private readonly logger = new Logger(ProductService.name);
    /**
     *
     * @returns
     * @memberof ProductService
     */
    async getProduct() {
      const url = `http://quotes.money.163.com/f10/zycwzb_600519.html`;
      const res = await axios.get(url, {});
      const titleList = [];
      const dataList = [];
      const $ = cheerio.load(res.data);
      const title = $('.col_l tbody tr').eq(10).text();
      const head = $(".col_r table tbody tr.dbrow").eq(0).find('th');
      const cont = $('.col_r table tbody tr').eq(11).find('td');
    
      head.each(function(){
        titleList.push($(this).text())
        console.log(titleList)
      })
      cont.each(function(){
        dataList.push($(this).text())
        console.log(dataList)
      })
      this.saveFile({title,titleList,dataList});
    }
    // 转存文本
 saveFile(data) {
  data = [
    {
        name : '个股行情',
        data : [
          ['报告日期', ...data.titleList],
          [ data.title, ...data.dataList]
        ]
    }
]
    const buffer = xlsx.build(data);
    console.log(buffer)
      fs.writeFile('./out.xlsx', buffer, 'binary',function(err){
        if(err){
            console.log(err);
        }
      })
    }
  }

启动

bash
npm run start:dev

打开localhost:3000刷新,会发现生成一个xlsx文件

功能

爬取 网易财经网页中,茅台酒的净利润(扣除非经常性损益后)(万元),并保存到 out.xlsx 表格中。

实现原理

  • axios 获取http://quotes.money.163.com/f10/zycwzb_600519.html 内容
  • 返回内容是服务端渲染,数据和 dom 结构混合在一起,使用 cheerio 获取数据报告表格的 dom 片段
  • 使用正则解析 dom 片段,过滤出有用数据
  • 使用 node-xlsx 将数据写入 xlsx 文件

  • nest 脚手架
  • axios 发送 ajax 请求
  • cheerio 类似 jquery,能够解析字符串形式的 dom

Released under the MIT License.