如何在Zombie.js中保存PDF下载文件及链接?技术咨询
嘿,我来帮你搞定这个问题!你遇到的控制台乱码,其实是因为Zombie.js把PDF的二进制内容当成文本输出了——毕竟它主要是用来处理网页的,默认不会自动处理二进制下载。下面给你两种可行的方案,和PHP里的处理思路类似,要么先拿到PDF链接再下载,要么直接拦截点击后的响应保存文件:
方案一:直接提取PDF链接再下载
如果PDF的下载链接是直接写在锚点元素的href属性里的,不用点击就能拿到,那这种方法最简单高效:
const Browser = require('zombie'); const fs = require('fs'); const https = require('https'); // 网站是http的话就用require('http') // 初始化Zombie浏览器 const browser = new Browser(); browser.visit('你的目标页面URL') .then(() => { // 用CSS选择器定位PDF锚点,比如找所有href以.pdf结尾的a标签 const pdfAnchor = browser.query('a[href$=".pdf"]'); if (!pdfAnchor) { throw new Error('页面中未找到PDF下载链接'); } // 把相对URL转换成绝对URL(避免下载失败) const pdfAbsoluteUrl = browser.url.resolve(pdfAnchor.href); console.log('获取到的PDF链接:', pdfAbsoluteUrl); // 开始下载并保存PDF文件 const fileStream = fs.createWriteStream('downloaded.pdf'); https.get(pdfAbsoluteUrl, (response) => { response.pipe(fileStream); fileStream.on('finish', () => { fileStream.close(); console.log('PDF文件已成功保存到本地'); }); }).on('error', (err) => { // 下载失败时删除未完成的文件 fs.unlinkSync('downloaded.pdf'); console.error('PDF下载出错:', err.message); }); }) .catch(err => console.error('页面访问或链接提取出错:', err));
方案二:拦截点击后的响应直接保存
如果PDF链接是动态生成的(比如点击按钮后才通过接口返回下载地址),那可以监听Zombie.js的响应事件,捕获PDF的二进制内容并保存:
const Browser = require('zombie'); const fs = require('fs'); const browser = new Browser(); // 监听所有响应,判断是否是PDF请求 browser.on('response', (response) => { // 通过Content-Type或者URL后缀判断是否为PDF const isPdfResponse = response.headers['content-type'] === 'application/pdf' || response.url.endsWith('.pdf'); if (isPdfResponse) { const fileStream = fs.createWriteStream('downloaded.pdf'); // 将响应的二进制内容写入文件 response.pipe(fileStream); response.on('end', () => { console.log('通过点击链接成功保存PDF'); console.log('PDF的实际下载链接:', response.url); }); // 阻止Zombie.js默认处理响应,避免控制台输出乱码 response.stop(); } }); browser.visit('你的目标页面URL') .then(() => { // 点击PDF下载链接,替换成你页面中对应的选择器 return browser.clickLink('a[href$=".pdf"]'); }) .catch(err => console.error('操作出错:', err));
额外注意事项
- 确保你的CSS选择器能准确命中PDF锚点,比如可以根据
id、class或者文本内容定位,不一定非要用后缀匹配; - 如果目标网站需要登录验证,Zombie.js会自动保持会话Cookie,所以只要你先完成登录流程,后续下载请求会自动带上验证信息;
- 若下载大文件,建议加上进度监听或者错误重试逻辑,提升稳定性。
内容的提问来源于stack exchange,提问作者umair.ashfr
相关产品推荐
相关产品推荐

