使用Puppeteer爬取图片

使用Puppeteer爬取图片

  1. 使用的包
const puppeteer = require('puppeteer');
const request = require("request");
const fs = require('fs');
  1. 操作浏览器
var scrape = async () => {
    // 初始化无头浏览器
    const browser = await puppeteer.launch({
        headless: false,
        defaultViewport: {
            width: 1200,
            height: 1000
        }
    });
    // 新建页面
    const page = await browser.newPage();
    //搜索关键字
    let word = '壁纸'
    // 跳转到指定页面
    await page.goto('https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111110&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=' + word);
    await page.evaluate(function () {
    	//该页面使用懒加载,滑动屏幕让图片加载
        window.scrollTo(0,1000)
        setTimeout(()=>{window.scrollTo(0,2000)},1000)
    })
    await page.waitForTimeout(3000)
    // 获取节点
    const data = await page.evaluate( ()=> {
    	//拿到图片节点
        let dom = document.querySelectorAll('#imgid img')
        let arr = []
        for(let i=0;i<dom.length-1;i++){
            //去除base64格式
            if(!dom[i].src.includes('base64'))
            arr.push(dom[i].src) 
        }
        //返回图片链接
        return arr
    })
    //关闭浏览器
    browser.close()
    return data
}
  1. 保存图片
scrape().then((value) => {
    for(let i = 1; i < value.length-1; i++) {
        let imgUrl = value[i];
        let filename = `${new Date().getTime()}imgage${i}.png`;
        //在C盘下创建文件夹
        fs.mkdir('C:/temp',(e)=>{
            if(!e || (e&&e).code === 'EEXIST'){
                if(imgUrl)
                //保存在这个目录下
                request(imgUrl).pipe(fs.createWriteStream("C:/temp/" + filename));
                else
                console.log('地址为空')
            }
            else{
                console.log('err')
            }
        })
    }
});
<think>好的,用户想用Puppeteer爬取网页内容,需要示例代码和方法。首先我得回忆一下Puppeteer的基本用法。记得Puppeteer是控制Headless Chrome的,可以处理动态渲染的页面。用户可能需要从安装开始,然后一步步写代码。 首先,安装部分,应该用npm安装Puppeteer,可能用户已经知道,但还是要提一下。然后,创建一个基本的爬虫脚本,比如打开浏览器,导航到页面,提取数据。然后关闭浏览器。 然后,示例代码的结构。记得需要引入puppeteer模块,定义异步函数,启动浏览器,打开页面,用page.evaluate执行脚本获取数据。可能还需要处理等待元素加载的情况,比如用waitForSelector。 用户可能还需要处理分页或者点击按钮的情况,比如翻页抓取。这时候需要模拟点击操作,用page.click,然后等待导航完成。这时候可能需要循环处理每个页面。 另外,数据存储部分,可能需要将结果保存到文件里,比如用fs模块写入JSON文件。这部分也要在示例中展示出来。 还要注意错误处理,比如try-catch块,确保浏览器正确关闭,避免资源泄漏。同时,考虑性能,比如headless模式,或者是否需要截图、生成PDF等。 可能用户的问题中引用了几个参考链接,里面的代码示例可能有帮助。需要检查引用内容,确保代码符合最新版本的Puppeteer语法,比如async/await的使用。 最后,用户可能想知道实际应用中的注意事项,比如反爬虫机制,设置请求头,延迟请求,或者使用代理。这些可以作为优化建议部分,帮助用户更有效地爬取数据。 总结一下,步骤应该是安装、基本用法、示例代码(包括静态和动态内容)、分页处理、数据存储、优化建议。然后根据这些结构组织回答,确保代码正确,用中文解释清楚每个步骤的作用。</think>### Puppeteer 网页爬取方法及示例 #### **1. 安装Puppeteer** ```bash npm install puppeteer ``` 安装时会自动下载Chromium浏览器内核[^2]。 --- #### **2. 基础爬取示例** 以下代码演示如何打开网页并提取标题和段落内容: ```javascript const puppeteer = require('puppeteer'); async function scrape() { const browser = await puppeteer.launch(); const page = await browser.newPage(); // 导航至目标页面并等待内容加载 await page.goto('https://example.com', { waitUntil: 'networkidle2' }); // 提取页面数据 const data = await page.evaluate(() => { const title = document.querySelector('h1').innerText; const paragraphs = Array.from(document.querySelectorAll('p')).map(p => p.innerText); return { title, paragraphs }; }); await browser.close(); return data; } scrape().then(result => console.log(result)); ``` --- #### **3. 动态内容处理** 针对需要交互的页面(如点击按钮、滚动加载): ```javascript // 模拟点击"加载更多"按钮 await page.waitForSelector('.load-more'); await page.click('.load-more'); await page.waitForTimeout(2000); // 等待内容加载 ``` --- #### **4. 分页爬取** ```javascript // 循环处理分页 for (let pageNum = 1; pageNum <= 5; pageNum++) { await page.goto(`https://example.com?page=${pageNum}`); // 提取每页数据... } ``` --- #### **5. 数据存储** 将结果保存为JSON文件: ```javascript const fs = require('fs'); scrape().then(data => { fs.writeFileSync('output.json', JSON.stringify(data, null, 2)); }); ``` --- #### **6. 优化建议** 1. **反爬规避** - 设置随机延迟:`await page.waitForTimeout(Math.random() * 3000)` - 修改User-Agent:`page.setUserAgent('自定义UA')` 2. **性能提升** - 无头模式:`puppeteer.launch({ headless: true })` - 禁用图片加载:`page.setRequestInterception(true)` + 过滤图片请求[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值