puppeteer实现文件下载

puppeteer实现文件下载

puppeteer版本:

"puppeteer": "^20.7.3",

脚本需要的其他依赖

const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');

本脚本测试数据网站:https://unsplash.com/photos/GcBuJkuiCpU
在这里插入图片描述
1、设置文件存放地址

 const downloadPath = "C:\\Users\\Administrator\\Desktop\\图片下载\\";
        const client = await page.target().createCDPSession();
        await client.send('Page.setDownloadBehavior', {
            behavior: 'allow',
            downloadPath: downloadPath
        });

2、点击下载按钮(我这里测试使用的是免费图片网站)

await page.goto("https://unsplash.com/photos/GcBuJkuiCpU", {timeout: 60000})
        const downloadBtn = await page.waitForSelector("#app > div > div:nth-child(3) > div > div:nth-child(1) > div.KeJv5.voTTC > header > div.EdCFo > div > div > a")
        console.log("downloadBtn:", downloadBtn)
        await downloadBtn.click()

如果不需要把下载的文件上传的话,到这一步就算完成了

3、获取文件名(监听所有的请求,如果文件名固定则不需要这个)


// 监听所有的请求
        page.on('response', async (response) => {
            const request = response.request();
            const url = request.url();
            const status = response.status();
            const headers = response.headers();
            // 在这里可以根据需要进行进一步处理
            if (url.startsWith("https://images.unsplash.com")) {
                console.log("找到符合预期的url")
                console.log('url = ', url)
                if (status === 200) {
                    const contentDisposition = headers['content-disposition'];
                    const fileNameMatch = contentDisposition && contentDisposition.match(/filename=["']?([^'"\s]+)["']?/i);
                    const fileName = fileNameMatch && fileNameMatch[1];
                    if (fileName) {
                        console.log('文件名:', fileName);
                        // 判断文件是否下载完成
                        const filePath = downloadPath + fileName;
                        let isFinish = false;
                        const now = Date.now();
                        while (!isFinish) {
                            await waitOneSecond();
                            // 如果有文件,且后缀满足我们的要求
                            if (fs.existsSync(filePath)) {
                                console.log('文件下载完成')
                                isFinish = true;
                                await closePage(page);

                            } else {
                                console.log('文件下载进行中')
                            }
                            // 如果文件超过10min还没下载成功,就抛出错误
                            if (!isFinish && Date.now() - now >= 10 * 60 * 1000) {
                                throw new Error('download file timeout');
                            }
                        }
                        // 记录一下耗时
                        console.log(`time spend: time=${Date.now() - now}`);
                    } else {
                        // await closePage(page);
                        console.log('无法获取文件名');
                    }
                } else {
                    console.log('请求出错:', status);
                }
            }

        });

4、测试
日志如下:

url =  https://images.unsplash.com/photo-1495573925654-ebcb91667e78?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&dl=craig-whitehead-GcBuJkuiCpU-unsplash.jpg
文件名: craig-whitehead-GcBuJkuiCpU-unsplash.jpg
文件下载完成

桌面上目录里面也有了
在这里插入图片描述

5、文件上传


function fileUpload(filePath) {
    if (fs.existsSync(filePath)) {
        console.log('文件下载完成');
        const file = fs.createReadStream(filePath);

        const formData = new FormData();
        formData.append('file', file);

        // 发起文件上传请求
        axios.post('http://localhost:9091/crawleNPTO/upload', formData, {
            headers: {
                ...formData.getHeaders(),
            },
        })
            .then((response) => {
                console.log('文件上传成功');
                // 进一步处理上传成功的响应
            })
            .catch((error) => {
                console.error('文件上传失败:', error);
                // 处理上传失败的情况
            });

    } else {
        console.log('文件不存在');
    }
}

文件下载完成之后,在上传这个文件

// 如果有文件,且后缀满足我们的要求
 const filePath = downloadPath + fileName;
                            if (fs.existsSync(filePath)) {
                                console.log('文件下载完成')
                                isFinish = true;
                                await closePage(page);
                                fileUpload(filePath)
                            } else {
                                console.log('文件下载进行中')
                            }

后端代码:

    @PostMapping("upload")
    public void upload(MultipartFile file) {
        System.out.println(file);
        if (file != null) {
            System.out.println(file.getOriginalFilename());
            System.out.println(file.getSize());
        }
    }

后端注意:MultipartFile默认文件最大为1MB,下面配置文件最大为100MB

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

测试日志:

org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@173fcdc1
craig-whitehead-GcBuJkuiCpU-unsplash.jpg
5104533
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Puppeteer 是一个由 Google 开发的 Node.js 库,用于控制无头 Chrome 或 Chrome 浏览器,实现自动化操作和网页截图等功能。 Puppeteer 具有强大的功能和丰富的 API,可以对网页进行各种操作,包括导航、表单填充、点击、滚动等。通过控制 Chrome 浏览器,可以轻松实现自动化测试、爬虫、UI 测试等任务。 Puppeteer 的中文文档提供了全面且详细的使用说明和示例,方便开发者理解和使用该库。文档内容包括安装教程、基本使用方法、API 方法的介绍、示例代码等。 在使用 Puppeteer 进行自动化操作时,首先需要安装 Puppeteer 的 npm 包。安装完成后,可以使用 Puppeteer 的启动方法来启动一个 Chrome 浏览器实例,然后使用该实例进行各种操作。文档中介绍了如何启动浏览器、打开指定网页、获取网页内容、填充表单、截图等操作的具体步骤和示例代码。 Puppeteer 的文档还提供了丰富的 API 方法介绍,开发者可以根据需求选择合适的方法来实现所需功能。文档中每个 API 方法都有详细的说明和参数介绍,方便开发者理解和使用。 除了基本的使用方法和 API 方法介绍,文档还包括了一些高级功能的介绍和示例,比如模拟用户操作、处理文件上传、使用代理服务器等。 总之,Puppeteer 中文文档提供了全面的介绍和说明,方便开发者学习和使用该库。无论是初学者还是有经验的开发者,都能从文档中找到所需的信息和示例代码,快速上手使用 Puppeteer 实现各种自动化操作和爬虫任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值