【问题标题】:Puppeteer Crawler - Error: net::ERR_TUNNEL_CONNECTION_FAILEDPuppeteer Crawler - 错误:net::ERR_TUNNEL_CONNECTION_FAILED
【发布时间】:2023-04-02 06:19:01
【问题描述】:

目前我的 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,
    });

【问题讨论】:

    标签: javascript proxy web-crawler puppeteer


    【解决方案1】:

    page.authentication

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

    --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');
    })();
    

    【讨论】:

    • 这个答案有助于我意识到我遇到的问题。使用“username:password@hostname:8000”格式,确保您的密码中没有“@”符号。这就是我看到 ERR_TUNNEL_CONNECTION_FAILED 的原因
    猜你喜欢
    • 1970-01-01
    • 2022-07-22
    • 2023-01-30
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多