当前位置:   article > 正文

前端爬虫cheerio&&puppeteer

puppeteer + cheerio 实现爬虫

前言

最近在做一个小程序项目,需要爬取第三方数据,于是开始重捡起来爬虫,其实前端爬虫挺好实现的,但因为现在网页出现了SPA,于是开始疯狂踩坑,聊记此文,以慰诸君。

普通网站爬取数据--cheerio

挺简单的,一个工具包,几行代码就解决了

  1. const $ = require('cheerio')
  2. const requestPromise = require('request-promise')
  3. const url = 'https://juejin.im/books';
  4. requestPromise(url)
  5. .then((html) => {
  6. // 利用 cheerio 来分析网页内容,拿到所有小册子的描述
  7. const books = $('.info', html)
  8. let totalSold = 0
  9. let totalSale = 0
  10. let totalBooks = books.length
  11. // 遍历册子节点,分别统计它的购买人数,和销售额总和
  12. books.each(function () {
  13. const book = $(this)
  14. const price = $(book.find('.price-text')).text().replace('¥', '')
  15. const count = book.find('.message').last().find('span').text().split('人')[0]
  16. totalSale += Number(price) * Number(count)
  17. totalSold += Number(count)
  18. })
  19. // 最后打印出来
  20. console.log(
  21. `共 ${totalBooks} 本小册子`,
  22. `共 ${totalSold} 人次购买`,
  23. `约 ${Math.round(totalSale / 10000)} 万`
  24. )
  25. })
  26. 复制代码

但。。。但是,上面例子爬取掘金是不行的,因为掘金就是经典的SPA,服务器只返回一个空的挂载节点,毫无数据。于是引出无头浏览器puppeteer

SPA页面爬取--puppeteer

  1. const $ = require('cheerio');
  2. const puppeteer = require('puppeteer');
  3. const url = 'https://juejin.im/books';
  4. async function run(params) {
  5. //打开一个浏览器
  6. const browser = await puppeteer.launch();
  7. // 打开一个页面
  8. const page = await browser.newPage();
  9. await page.goto(url, {
  10. waitUntil: 'networkidle0'
  11. });
  12. const html = await page.content();
  13. const books = $('.info', html);
  14. let totalSold = 0
  15. let totalSale = 0
  16. let totalBooks = books.length
  17. // 遍历册子节点,分别统计它的购买人数,和销售额总和
  18. books.each(function () {
  19. const book = $(this)
  20. const price = $(book.find('.price-text')).text().replace('¥', '')
  21. const count = book.find('.message').last().find('span').text().split('人')[0]
  22. totalSale += Number(price) * Number(count)
  23. totalSold += Number(count)
  24. })
  25. // 最后打印出来
  26. console.log(
  27. `共 ${totalBooks} 本小册子`,
  28. `共 ${totalSold} 人次购买`,
  29. `约 ${Math.round(totalSale / 10000)} 万`
  30. )
  31. }
  32. run()
  33. 复制代码

爬取小册页面数据如下

转载于:https://juejin.im/post/5d020bf0e51d455d877e0d20

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/885939
推荐阅读
相关标签
  

闽ICP备14008679号