我正在尝试使用 puppeteer 将 pdf 下载到我的 tmp 文件夹,但最终出现 403 错误。目标链接可以在浏览器上很好地打开,无需身份验证或验证码或任何其他内容。我不确定我在这里做错了什么。
const downloadPDFViaProxy = async (url: string, outputPath: string) => {
console.log('Using Proxy');
const proxyChain = require('proxy-chain');
const oldProxyUrl = 'http://username:password@hostname:8000';
const newProxyUrl = await proxyChain.anonymizeProxy(oldProxyUrl);
// console.log(newProxyUrl);
const browser = await puppeteer.launch({
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-infobars',
'--window-position=0,0',
'--ignore-certifcate-errors',
'--ignore-certifcate-errors-spki-list',
],
headless: true,
// executablePath: '/opt/homebrew/bin/chromium',
ignoreHTTPSErrors: true,
});
var userAgent = require('user-agents');
const page = await browser.newPage();
await page.setUserAgent(userAgent.random().toString());
await page.setRequestInterception(true);
console.log('reached here');
// const browser = await puppeteer.launch({
// args: [
// '--no-sandbox',
// '--disable-setuid-sandbox',
// '--proxy-server=http://66.29.154.105:3128', // Specify your proxy server here
// ],
// });
// const page = await browser.newPage();
try {
await page.screenshot({ path: 'screenshot_new1.png' });
await page.goto(url, {
waitUntil: 'networkidle2',
timeout: 60000, // 60 seconds
});
await page.screenshot({ path: 'screenshot_new2.png', fullPage: true });
const pdfUrl = await page.evaluate(() => document.location.href);
// Use Puppeteer built-in download mechanism instead of fetch
const response = await page.goto(pdfUrl);
if (!response || !response.ok()) {
throw new Error(`Failed to download PDF. Status: ${response.status()}`);
}
// Save PDF to file system
const pdfBuffer = await response.buffer();
fs.writeFileSync(outputPath, pdfBuffer);
console.log(`PDF downloaded successfully to: ${outputPath}`);
} catch (error) {
console.error(`Error: ${error.message}`);
} finally {
await browser.close();
}
};
到目前为止我已经尝试了多种方法。使用代理随机化用户代理,给予超时什么的。但似乎都不起作用。使用我发布的代码,它给了我一个超时错误。我的下载文件有 5-6 MB。任何帮助将不胜感激。
单独使用
axios
和 node.js
比使用 puppeteer
更快更可靠(除非出于某种原因你绝对必须使用 puppeteer)。
此外,请使用
networkidle2
确保在下载之前页面已完全加载。