如何在人偶和无头Chrome中使用代理?

Iri*_*ina 7 javascript proxy node.js puppeteer

请告诉我如何正确地使用带有伪造者和无头Chrome的代理。我的选择不起作用。

const puppeteer = require('puppeteer');
(async () => {
  const argv = require('minimist')(process.argv.slice(2));

  const browser = await puppeteer.launch({args: ["--proxy-server =${argv.proxy}","--no-sandbox", "--disable-setuid-sandbox"]});
  const page = await browser.newPage();

  await page.setJavaScriptEnabled(false);
  await page.setUserAgent(argv.agent);
  await page.setDefaultNavigationTimeout(20000);
  try{
  await page.goto(argv.page);

  const bodyHTML = await page.evaluate(() => new XMLSerializer().serializeToString(document))
  body = bodyHTML.replace(/\r|\n/g, '');
  console.log(body);
}catch(e){
        console.log(e);
}
  await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)

Chu*_*ran 19

您可以在此处找到有关代理的示例

'use strict';

const puppeteer = require('puppeteer');

(async() => {
  const browser = await puppeteer.launch({
    // Launch chromium using a proxy server on port 9876.
    // More on proxying:
    //    https://www.chromium.org/developers/design-documents/network-settings
    args: [ '--proxy-server=127.0.0.1:9876' ]
  });
  const page = await browser.newPage();
  await page.goto('https://google.com');
  await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)

  • 感谢它的工作。需要问我应该如何在 args 中传递多个代理服务器并将其与多个 if 条件一起使用?如果你能建议 (3认同)

Cua*_*rix 12

puppeteer-page-proxy是可能的。它支持为整个页面设置代理,或者如果您愿意,它可以为每个请求设置不同的代理。是的,它适用于无头和有头的 Chrome。

首先安装它:

npm i puppeteer-page-proxy
Run Code Online (Sandbox Code Playgroud)

然后要求它:

npm i puppeteer-page-proxy
Run Code Online (Sandbox Code Playgroud)

使用它很容易; 为整个页面设置代理:

const useProxy = require('puppeteer-page-proxy');
Run Code Online (Sandbox Code Playgroud)

如果您想为每个请求使用不同的代理,那么您可以简单地执行以下操作:

await useProxy(page, 'http://127.0.0.1:8000');
Run Code Online (Sandbox Code Playgroud)

然后如果你想确定你的页面的IP有没有变,你可以查一下;

await page.setRequestInterception(true);
page.on('request', req => {
    useProxy(req, 'socks5://127.0.0.1:9000');
});
Run Code Online (Sandbox Code Playgroud)

它支持httphttpssocks4socks5代理,如果需要,它还支持身份验证:

const data = await useProxy.lookup(page);
console.log(data.ip);
Run Code Online (Sandbox Code Playgroud)

存储库:https : //github.com/Cuadrix/puppeteer-page-proxy

  • 注意:这个库使用nodejs-got来下载页面,因此它绕过了chrome下载器,它会发出额外的请求来获取页面。它不适用于许多用例。 (2认同)

小智 11

不使用

"--proxy-server =${argv.proxy}"  
Run Code Online (Sandbox Code Playgroud)

这是一个普通的字符串而不是模板文字,
使用 ` 而不是 "

`--proxy-server =${argv.proxy}`
Run Code Online (Sandbox Code Playgroud)

否则argv.proxy不会被替换
在你将它传递给启动函数之前检查这个字符串以确保它是正确的,你可能想要在该浏览器中访问http://api.ipify.org/以确保代理正常工作

  • 这应该是该问题的正确答案 (4认同)

小智 7

我看到上面推荐的https://github.com/Cuadrix/puppeteer-page-proxyhttps://github.com/gajus/puppeteer-proxy,我想强调的是,这两个包在技术上并没有使用 Chrome 实例来执行实际的网络请求,这是他们正在做的事情:

  1. 当用户代码发起 Puppeteer 的网络请求时,例如调用page.goto(),代理包会拦截此传出的 HTTP 请求并暂停它
  2. 代理包将请求传递给另一个网络库(Got)
  3. Got执行实际的网络请求,通过指定的代理
  4. 现在Got需要将所有网络响应数据传回Puppeteer!这意味着代理包现在需要管理许多有趣的事情,例如将 cookie 标头从原始 HTTP set-cookie 格式复制到 puppeteer 格式

虽然这在很多情况下可能是一种可行的方法,但您需要了解这会更改您的 HTTP 请求 TLS 指纹,因此您的 HTTP 请求可能会被某些网站阻止,特别是那些使用 Cloudflare 机器人检测的网站(因为该网站现在看到您的请求源自 Node.js,而不是 Chrome)。

在 Puppeteer 中设置代理的替代方法。

如果您想对所有网站使用一个代理,Chrome 的启动参数会很好。如果您仍然想让一个 Chrome 实例使用多个代理,但又不想使用上面提到的 2 个包,该怎么办?

createIncognitoBrowserContextPuppeteer 功能可用于救援:

// Create a new incognito browser context
const context = await browser.createIncognitoBrowserContext({ proxy: 'http://localhost:2022' });
// Create a new page inside context.
const page = await context.newPage();

// authenticate in proxy using basic browser auth
await page.authenticate({username:user, password:password});
// ... do stuff with page ...
await page.goto('https://example.com');
// Dispose context once it's no longer needed.
await context.close();
Run Code Online (Sandbox Code Playgroud)

代理链包

如果您的代理需要身份验证,并且您不喜欢该调用,则可以使用proxy-chain npm packagepage.authenticate设置代理。

proxy-chain 在您的本地主机上启动中间代理,这允许做一些不错的事情。了解有关代理链包实现的技术细节的更多信息:https://pixeljets.com/blog/how-to-set-proxy-in-puppeteer