使用 puppeteer 下载 PDF 时出现 403 错误

问题描述 投票:0回答:1

我正在尝试使用 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 proxy puppeteer puppeteer-extra-plugin-stealth
1个回答
0
投票

单独使用

axios
node.js
比使用
puppeteer
更快更可靠(除非出于某种原因你绝对必须使用 puppeteer)。

此外,请使用

networkidle2
确保在下载之前页面已完全加载。

© www.soinside.com 2019 - 2024. All rights reserved.