代码之家  ›  专栏  ›  技术社区  ›  Blair Anderson

具有Crawlera代理的木偶演员

  •  2
  • Blair Anderson  · 技术社区  · 7 年前

    我无法通过具有身份验证的代理发出傀儡请求。

    已尝试两种代理url身份验证: --proxy-server=u:p@proxy.crawlera.com:8010

    还有木偶演员 page.authenticate(u,p)

    仍在获取 ERR_NO_SUPPORTED_PROXIES

    我的代码:

    require('dotenv').config();
    const puppeteer = require('puppeteer');
    
    (async () => {
      const browser = await puppeteer.launch({
        ignoreHTTPSErrors: true,
        args: ['--proxy-server=proxy.crawlera.com:8010']
      });
    
      const page = await browser.newPage();
      await page.setExtraHTTPHeaders({
        'Proxy-Authorization':
          'Basic ' +
          Buffer.from(`${process.env.CRAWLERA_APIKEY}:`).toString('base64')
      });
    
      page.on('console', (...args) => console.log('PAGE LOG:', ...args));
      const path = `https://www.andersonassociates.net/`;
      await page.setViewport({ width: 1680, height: 895 });
    
      try {
        console.log('before-goto', path);
        var start = +new Date();
        var resp = await page.goto(path, {
          timeout: 0,
          waitUntil: 'domcontentloaded'
        });
    
        console.log('after-goto', path);
        var end = +new Date();
        console.log('start-end-diff', (end - start) / 1000);
    
        if (!resp.ok) {
          browser.close();
          return { status: resp.status, error: `ASIN NOT OK. ${resp.status}` };
        }
        console.log('goto', path);
      } catch (error) {
        console.log('page.goto ERROR', error.stack.split('\n'));
        browser.close();
        return { error: error.toString(), stack: error.stack.split('\n') };
      }
    
      try {
        await page.screenshot({ path: `tmp/anderson.png`, fullPage: true });
        console.log('screenshot');
        browser.close();
      } catch (e) {
        browser.close();
        console.log('screenshot error', e.stack.split('\n'));
      }
    })();
    

    使现代化

    4 回复  |  直到 6 年前
        1
  •  5
  •   Agung Darmanto    6 年前

    我也使用Crawlera作为我的代理服务,已经使用了代理链& page.authenticate 方法,但没有运气,我想这是因为Crawlera提供了一个空密码,我使用 page.setExtraHTTPHeaders :

    const browser = await puppeteer.launch({
        ignoreHTTPSErrors: true, // To allow https url
        args: ['--proxy-server=proxy.crawlera.com:8010']
    });
    const page = await browser.newPage();
    await page.setExtraHTTPHeaders({
        'Proxy-Authorization': 'Basic ' + Buffer.from('<APIKEY>:').toString('base64'),
    });
    

    希望这有帮助。

        2
  •  3
  •   drobnikj    6 年前

    您可以使用 proxy-chain it的npm包。

    例子:

    const puppeteer = require('puppeteer');
    const proxyChain = require('proxy-chain');
    
    (async() => {
        const oldProxyUrl = 'http://u:p@proxy.crawlera.com:8010';
        const newProxyUrl = await proxyChain.anonymizeProxy(oldProxyUrl);
    
        // Prints something like "http://127.0.0.1:45678"
        console.log(newProxyUrl);
    
        const browser = await puppeteer.launch({
            args: [`--proxy-server=${newProxyUrl}`],
        });
    
    })();
    

    您可以在 blogpost .

        3
  •  0
  •   Ramiro Ramirez    6 年前

    你能提供你正在做什么的代码示例吗?

    记住那一页。身份验证要求将对象传递给函数。在进行其他操作之前,必须先设置凭据。

    您可以尝试以下方式:

    await page.authenticate({username, password});
    await page.goto(myURL, {waitUntil: 'networkidle0'});
    
        4
  •  0
  •   visnja_bre    4 年前

    Here 我读到了关于如何使用Puppeter将Crawlera设置为代理提供者的内容。

    该博客文章指出:

    注:建议使用木偶师1.17和捆绑铬76.0.3803.0。可与Puppeter 1.18+一起使用的最新Chromium快照是r669921(在更高版本中,发送Crawlera凭据所需的代理授权标头被阻止)。

    因此,为了使用Docker部署解决方案 to setup for pupeteer 我需要下载一个特定版本的Chromium,而Puppeter并不保证它能正常工作。

    解决方案是使用 proxy-chain anonymizeProxy 方法和集合 ignoreHTTPSErrors: true 启动浏览器时