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爬取图片
确定目标网站
安装puppeteer
npm i puppeteer
分析目标网站和需要提取的文件
需要提取的文件位置信息
分析目标网站得知,图片进行了懒加载处理
解决方案:
- 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>')
}
结果
文件已经静静躺在这里了
后追
方案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 是个不错的选择。
版权声明
本文系作者 @黄粱一梦 转载请注明出处,文中若有转载的以及参考文章地址也需注明。\(^o^)/~