博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前端爬虫cheerio&&puppeteer
阅读量:6825 次
发布时间:2019-06-26

本文共 2081 字,大约阅读时间需要 6 分钟。

前言

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

普通网站爬取数据--cheerio

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

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

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

SPA页面爬取--puppeteer

const $ = require('cheerio');const puppeteer = require('puppeteer');const url = 'https://juejin.im/books';async function run(params) {    //打开一个浏览器    const browser = await puppeteer.launch();    // 打开一个页面    const page = await browser.newPage();    await page.goto(url, {        waitUntil: 'networkidle0'    });    const html = await page.content();    const books = $('.info', html);    let totalSold = 0    let totalSale = 0    let totalBooks = books.length    // 遍历册子节点,分别统计它的购买人数,和销售额总和    books.each(function () {        const book = $(this)        const price = $(book.find('.price-text')).text().replace('¥', '')        const count = book.find('.message').last().find('span').text().split('人')[0]        totalSale += Number(price) * Number(count)        totalSold += Number(count)    })    // 最后打印出来    console.log(        `共 ${totalBooks} 本小册子`,        `共 ${totalSold} 人次购买`,        `约 ${Math.round(totalSale / 10000)} 万`    )}run()复制代码

爬取小册页面数据如下

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

你可能感兴趣的文章
spring源码读书笔记
查看>>
HDOJ-1015 Safecracker 【DFS】
查看>>
读书笔记-->Java经典编程300例--明日科技--清华大学出版社(第一版)
查看>>
如何在存储过程中自动添加分区
查看>>
[并查集] POJ 1611 The Suspects
查看>>
C#设计模式总结
查看>>
团队开发------第一次冲刺第4天
查看>>
R对term进行层次聚类完整实例(tm包)
查看>>
20151124001 关闭C#主窗体弹出是否关闭对话框
查看>>
Excel中添加下拉框
查看>>
12-01JavaScript事件(Events)
查看>>
12-19Windows窗体应用程序之记事本(2)
查看>>
python连接数据库使用SQLAlchemy
查看>>
HAproxy和TIME WAIT的一次问题排查
查看>>
高效运维--数据库坐而论道活动
查看>>
pytorch怎么抽取中间的特征或者梯度
查看>>
visual studio用"查找替换"来删掉源代码中所有//方式的纯注释和空行
查看>>
Groovy
查看>>
滑动窗口的最大值
查看>>
[转]BT常用渗透命令
查看>>