puppeteer爬虫

黄粱一梦2024-03-0819

什么是puppeteer

puppeteer中文网站

Puppeteer 是 Chrome开发团队2017年发布的一个 Node.js包,提供了一组用来操纵Chrome的API,通俗来说就是一个Headless Chrome浏览器,这Headless Chrome也可以配置成有UI的 。利用Puppeteer可以做到爬取页面数据,页面截屏或者生成PDF文件,前端自动化测试(模拟输入/点击/键盘行为)以及捕获站点的时间线,分析网站性能问题。

puppeteer和Cheerio的区别

Cheerio和Puppeteer是两个常用的JavaScript库,用于Web爬取和自动化,但它们具有不同的功能和用途。Cheerio是一个轻量级的库,用于解析和操作HTML和XML文档,而Puppeteer是一个更强大的库,用于控制无头Chrome或Chromium浏览器和自动化Web浏览任务。Cheerio用于Web爬取和数据提取,而Puppeteer用于Web自动化,测试和爬取。在Cheerio和Puppeteer之间进行选择取决于您的特定需求和要求。

什么是Cheerio

Cheerio是一个快速和轻量级的库,用于解析和控制HTML和XML文档。它提供类似于jQuery的语法,用于导航和控制DOM树。Cheerio基于jQuery的核心,并在Node.js上运行,但与jQuery不同的是。 Cheerio允许您从HTML和XML文档中提取数据,并使用简单直观的语法来控制内容。

使用puppeteer爬取图片

确定目标网站

emoji表情网站

安装puppeteer

npm i puppeteer

分析目标网站和需要提取的文件

需要提取的文件位置信息

Alt text

分析目标网站得知,图片进行了懒加载处理

解决方案:
- 1.使用puppeteer执行脚本加载scrollTo()方法,模拟滑动等待图片加载完成
- 2.分析dom节点,发现data-src属性上绑定的就是图片地址

选取方案2

编写代码

const puppeteer = require('puppeteer')
const fs = require('fs')
const request = require('request')
const path = require('path')
const http = require('http')
const targetUrl = 'https://www.emojiall.com/zh-hans/image-emoji-platform/skype/animation'
async function getEmojiImage(targetUrl){
    let browser = await puppeteer.launch() //  启动浏览器
    let page = await browser.newPage() // 打开一个新页面
    await page.setViewport({
        width: 1280,
        height: 800
    })
    try {
        console.log('等待网页加载')
        await page.goto(targetUrl) // 跳转到目标地址
        console.log('网页加载完成')
        // 给出加载时间
        await page.waitForSelector('.fontsize_1x');
        console.log('类名元素已经出现')
        let emojis = await page.evaluate(() => {
            let parentEle = document.querySelector('.emoji_image_box')
            let children = parentEle.querySelectorAll('.relative img')
            let urls = []
            for (let i =0 ;i <children.length; i++) {
                urls.push(children[i].getAttribute('data-src'))
            }
            return urls
        })
        // console.log('当前页面所有emoji元素链接',emojis)
        for (index in emojis) {
            console.log(emojis[index])
            let nameType = emojis[index].substring(emojis[index].lastIndexOf('/')+1,emojis[index].length)
            let host = 'https://www.emojiall.com'
            let imgSrc = host + emojis[index]
            writeImgae(imgSrc,nameType)
        }
    }catch (e) {
        console.log('抛出错误',e)
    }
    // 进行截图
    await page.screenshot({ path:path.join(__filename,'../../../images/screen.png')})
    await browser.close()
}

// getEmojiImage(targetUrl)



function writeImgae(imgSrc,nameType){
    let createWrite = fs.createWriteStream(path.join(__filename,'../../../images/skype/' + nameType),{autoClose:true})
    request(imgSrc).pipe(createWrite)
    createWrite.on('finish',() => {
        console.log('文件:' + nameType + '写入完成')
    })
}

exports.faceHandler = (req,res) => {
    res.send('<h1>faceHandler路由处理</h1>')
}

结果

文件已经静静躺在这里了

Alt text

Alt text

后追

方案1的思路让ai给的代码看一看吧

 await page.evaluate(() => {
      window.scrollBy(0, window.innerHeight);
    });

使用page.evaluate方法,在页面中执行window.scrollBy(0, window.innerHeight);,模拟页面滚动到底部进行加载···

完整方案一AI代码

const puppeteer = require('puppeteer');

async function handleLazyLoading() {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  try {
    // 导航到页面
    await page.goto('https://example.com');

    // 下滑页面以触发懒加载
    await page.evaluate(() => {
      window.scrollBy(0, window.innerHeight);
    });

    // 等待懒加载图片的选择器出现
    await page.waitForSelector('.lazy-image', { visible: true });

    // 检查懒加载图片是否加载完成
    const lazyImages = await page.$$eval('.lazy-image', (images) => {
      return images.map((image) => image.src);
    });

    console.log('Lazy loaded images:', lazyImages);

  } catch (error) {
    console.error('Error handling lazy loading:', error);
  } finally {
    // 关闭浏览器
    await browser.close();
  }
}

// 示例代码
handleLazyLoading().catch((error) => console.error(error));

总结

有一说一,一般爬虫提取数据只需要使用Cheerio就够用了而且还可以使用JQ语法来读取dom文档,用来爬取一般的静态网站就ok了,如果是动态的话,直接抓接口也未尝不可,如果再复杂一些的可以使用puppeteer来模拟用户的行为和上一篇的jsDom都可以进行插入脚本操作。
还是根据自己的使用熟练度和需求来选

Cheerio 因其速度、简洁和易用而广受设计师欢迎。它用于 Web 爬取和数据提取。Puppeteer 最适合Web自动化、测试和爬取,并可与需要 JavaScript 才能运行的动态网页结合使用。如果您想要爬取静态HTML和XML文件,那么选择 Cheerio 是个不错的选择。

分类:随笔

标签:后端爬虫随笔

上一篇jsDom使用以及简易滑动验证码跳过下一篇小米球ngrok内网穿透/映射

版权声明

本文系作者 @黄粱一梦 转载请注明出处,文中若有转载的以及参考文章地址也需注明。\(^o^)/~

Preview