puppeteer实现文件下载

news2024/12/22 20:03:22

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java民宿管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

【机器学习】数据预处理 - 归一化和标准化

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 数据预处理 一、数据预处理API二、准备数据集三、归…

没有u盘,怎么将电脑上的便签文件拷贝到手机上?

在如今数字化的时代,便签软件已经成为我们工作和生活中很重要的一部分,在便签中我们会记录很多重要事项或者重要文件。有时候,我们可能会遇到这样的问题:当我们在电脑便签上保存了一些重要文件,想要将文件拷贝到手机上…

【Redis常见命令】 —— 关于Redis的一点儿知识

💧 【 R e d i s 常见命令】——关于 R e d i s 的一点儿知识 \color{#FF1493}{【Redis常见命令】 —— 关于Redis的一点儿知识} 【Redis常见命令】——关于Redis的一点儿知识💧 🌷 仰望天空,妳我亦是行人.✨ &#x1f…

Java框架学习(二)SSM体系:Spring、SpringMVC、MybatisPlus

文章目录 SpringIoC控制反转DI 依赖注入BeanBean基础配置namescope Bean实例化方式Bean的生命周期 依赖注入方式依赖自动装配 Mybatis-Plus配置BaseMapper通用Service常用注解TableNameTableId雪花算法 TableFieldTableLogic 条件构造器和常用接口QueryWrapperUpdateWrapper 插…

【数据库原理与实践】知识点归纳(下)

第6章 规范化理论 一、关系模式设计中存在的问题 关系、关系模式、关系数据库、关系数据库的模式 关系模式看作三元组&#xff1a;R < U,F >&#xff0c;当且仅当U上的一个关系r满足F时&#xff0c;r称为关系模式R < U,F >的一个关系 第一范式&#xff08;1NF&…

一步一步学OAK之七:通过OAK相机实现特征跟踪

目录 特征跟踪Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 定义FeatureTrackerDrawer类定义变量定义onTrackBar方法定义trackFeaturePath方法定义drawFeatures方法定义FeatureTrackerDrawer类的构造函数 Setup 5: 创建pipelineSetup 6: 创建节点创建相机…

Scrapy框架之下载中间件(详解)

目录 Scrapy中下载中间件 概念 方法 process_request(self, request, spider) 参数: process_response(self, request, response, spider) 参数 基本步骤 示例代码 注意 Scrapy 中 Downloader 设置UA 开发UserAgent下载中间件 代码 三方模块 配置模块到Settin…

Redis系列 | 分类树查询功能如何从2s优化到0.1s

大家好&#xff0c;今天我们继续来分享一个在项目开发过程中遇到的实际问题&#xff0c;这里也来梳理并总结一下我们是如何对它进行持续优化的&#xff0c;希望能对大家有所帮助。 分类树查询功能&#xff0c;在各个业务系统中可以说随处可见&#xff0c;特别是在一些电商系统中…

UGUI无线滑动列表

在游戏开发中&#xff0c;经常会遇到需要展示大量数据的情况&#xff0c;例如排行榜、背包等。为了优化显示效果和性能&#xff0c;一个常见的做法是使用无限滑动列表&#xff08;Infinite Scroll View&#xff09;。本文将详细解析如何实现无限滑动列表。 基本原理 无限滑动列…

市电电压双向越限报警保护器电路设计

该报警保护器能在市电电压高于或低于规定值时&#xff0c;进行声光报警&#xff0c;同时自动切断电器电源&#xff0c;保护用电器不被损坏。该装置体积小、功能全、制作简单、实用性强。 一、电路工作原理 电路原理如图 3 所示。 市电电压一路由C3降压&#xff0c;DW稳压&am…

驱动开发:应用DeviceIoContro模板精讲

在笔者上一篇文章《驱动开发&#xff1a;应用DeviceIoContro开发模板》简单为大家介绍了如何使用DeviceIoContro模板快速创建一个驱动开发通信案例&#xff0c;但是该案例过于简单也无法独立加载运行&#xff0c;本章将继续延申这个知识点&#xff0c;通过封装一套标准通用模板…

一、枚举类型——新特性(switch 中的箭头语法)

支持模式匹配 你可以认为模式匹配&#xff08;pattern matching&#xff09;是在 switch 关键字上进行了显著的功能扩充。 它是分成了多个模块、 历经了 Java 的多个版本持续实现的。这保证了每个模块在其他模块加入前都可以安全地运行。最后&#xff0c;所有的模块集中到一起…

LLM大模型应用开发的本地环境搭建

尽管 ChatGPT 仍然很受欢迎&#xff0c;但泄露的 Google 内部文件表明开源社区正在迎头赶上并取得重大突破。 我们现在能够在消费级 GPU 上运行大型 LLM 模型。 因此&#xff0c;如果你是一名开发人员&#xff0c;想要在本地环境中尝试这些 LLM 并用它构建一些应用程序&#x…

Kubernetes进阶实战2

Kubernetes具有以下几个重要特性 简言之&#xff0c;Kubernetes整合并抽象了底层的硬件和系统环境等基础设施&#xff0c;对外提供了一个统一的资源池供终端用户通过API进行调用。 Kubernetes具有以下几个重要特性。 &#xff08;1&#xff09;自动装箱 构建于容器之上&#x…

定时器T0流水灯

89C52RC芯片 12Mhz&#xff1a;FC18 11.0592Mhz &#xff1a;FC67 定时器T0初值计算 12Mhz 11.0592Mhz main.c #include<regx52.h> #include<intrins.h> //_crol_循环左移函数 #include "Timer0.h" #include "Key.h" /*定时器&#xff0c;…

玩转k8s:资源管理

1 资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务&#xff0c;所谓的部署服务&#xff0c;其实就是在kubernetes集群中运行…

【C++】哈希表的改造——unordered_map和unordered_set的模拟实现

文章目录 1. unordered系列的容器封装1.1 改造1:模版参数类型的改造1.1.1 HashNode改造1.1.2 HashTable改造 1.2 改造2:迭代器的增加与封装1.2.1 迭代器类的实现1.2.2 迭代器的封装 1.3 改造3:insert的改写封装1.4 析构函数的实现1.5 unordered_map&unordered_set的封装实现…

Range_image 可视化

范围图像与点云的区别 范围图像&#xff08;Range Image&#xff09;和点云&#xff08;Point Cloud&#xff09;是两种常见的表示和处理三维点数据的方式&#xff0c;它们之间有以下区别&#xff1a; 数据结构&#xff1a;点云是一组三维点的集合&#xff0c;每个点包含位置信…