node爬取小程序数据

1,436 阅读2分钟

掘金第一次写文章,记一次node爬取小程序数据~

首先声明,本例仅供学习参考

实现思路

使用node+koa2搭建服务,下载所需要的依赖(fs,koa-body,xlsx,superagent),下载fiddler抓包工具,具体使用和配置附上链接fiddler安装和配置

配置好之后打开fiddler,然后在电脑微信端打开小程序,就可以看到所有的http请求,host + url 就是要请求的数据接口地址,我是一个一个的点击去找的,通过对比右下角的数据就能知道哪个接口是我们所需要的,下图右侧的text view里面就是请求接口的参数,然后header里面一般会携带一些鉴权的信息,我们一次性获取数据,直接照搬就行了,下图是我测试抓取的数据包

通过拿到的接口地址和请求参数,在本地尝试请求,用superagent请求url,爬取第一页的数据

async function getppData(page) {
  const uri = `${host}/culturalrelics/MuseumInquire`
  const options = {
    city: '',
    name: '',
    page_size: 500,
    page: page,
  }
  return new Promise((resolve, reject) => {
    superagent
      .post(uri)
      .send(JSON.stringify(options))
      .set(header)
      .end((err, res) => {
        if (err) console.log(err)
        resolve(res.body)
      })
  })
}

拿到数据之后,接口会返回page(当前页),page_size(每页多少条),total_count总条数,那么就可以根据这些数据判断是否爬完所有数据

let _page = 1
let xlsxObj = [
  {
    name: '数据列表',
    data: [],
  },
]
async function writeXlsx() {
  let res = await getppData(_page)
  const total_count = res.data.total_count
  let list = res.data.list
  if (res && res.data && list.length > 0) {
    list.forEach((item) => {
      let _item = []
      for (const key in item) {
        _item.push(item[key])
      }
      xlsxObj[0].data.push(_item)
    })
    // 如果爬到的数据少于总数据,则继续爬
    if(Number(_page * res.data.page_size) < total_count){
      _page ++;
      writeXlsx()
    }else{
      // 爬完写入到excel
      let buf = xlsx.build(xlsxObj)
      fs.writeFile(__dirname + '/my.xlsx', buf, (err) => {
        if (err) console.log(err)
        console.log('写入成功')
      })
    }
  }
}
//启动服务时先执行一次
writeXlsx()

如果爬完所有数据,则把数据写入到excel!到此,爬虫服务就完成了