javascript - Puppeteer Crawler - 错误:net::ERR_TUNNEL_CONNECTION_FAILED

标签 javascript proxy web-crawler puppeteer

目前,我的 Puppeteer 在 Heroku 上通过代理运行。在本地,代理中继工作得很好。但是,我收到错误错误:net::ERR_TUNNEL_CONNECTION_FAILED。我已在 Heroku 配置变量中设置了所有 .env 信息,以便它们全部可用。

知道如何修复此错误并解决问题吗?

我目前有

 const browser = await puppeteer.launch({
      args: [
      "--proxy-server=https=myproxy:myproxyport",
      "--no-sandbox",
      '--disable-gpu',
      "--disable-setuid-sandbox",
      ],
      timeout: 0,
      headless: true,
    });

最佳答案

页面.身份验证

代理服务器参数的正确格式是,

--proxy-server=HOSTNAME:PORT

如果是 HTTPS 代理,您可以在进行导航之前使用 page.authenticate 传递用户名和密码,

page.authenticate({username:'user', password:'password'});

完整的代码如下所示,

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
        headless:false,
        ignoreHTTPSErrors:true,
        args: ['--no-sandbox','--proxy-server=HOSTNAME:PORT']
  });
  const page = await browser.newPage();

  // Authenticate Here 
  await page.authenticate({username:user, password:password});
  await page.goto('https://www.example.com/');
})();

代理链

如果使用上述方法无法进行身份验证,您可能需要在其他地方处理身份验证。

有多个包可以做到这一点,其中一个是proxy-chain,有了这个,您可以使用一个代理,并将其用作新的代理服务器。

proxyChain.anonymizeProxy(proxyUrl)将采用一个带有用户名和密码的代理,创建一个可以在脚本中使用的新代理。

const puppeteer = require('puppeteer');
const proxyChain = require('proxy-chain');

(async() => {
    const oldProxyUrl = 'http://username:password@hostname:8000';
    const newProxyUrl = await proxyChain.anonymizeProxy(oldProxyUrl);

    // Prints something like "http://127.0.0.1:12345"
    console.log(newProxyUrl);

    const browser = await puppeteer.launch({
        args: [`--proxy-server=${newProxyUrl}`],
    });

    // Do your magic here...
    const page = await browser.newPage();
    await page.goto('https://www.example.com');
})();

关于javascript - Puppeteer Crawler - 错误:net::ERR_TUNNEL_CONNECTION_FAILED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54654725/

相关文章:

javascript - jquery .fadeOut() 不是函数错误

java - 如何在 Java 中使用 Proximo 作为 SOCKS 代理?

php - 在代理后面使用 Predis 连接到 Redis

elasticsearch - 使用StormCrawler(和Elasticsearch)将字段添加到已爬网内容

javascript - 如何检索加载需要使用 PhantomJS 或其他工具单击鼠标的 ajax 数据

python - 重定向后的 Scrapy 回调

javascript - 一段时间后运行 Javascript 函数

javascript - redux中状态对象的结构

javascript - d3.js 点击事件显示/隐藏 html 元素

java - HtmlUnit 使用来自 JVM 属性的代理