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

时间:2018-10-12 10:38:44

标签: javascript node.js proxy 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();
})();

5 个答案:

答案 0 :(得分:10)

您可以在here上找到有关代理的示例

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

答案 1 :(得分:8)

puppeteer-page-proxy是可能的。 它支持为整个页面设置代理,也可以根据需要为每个请求设置不同的代理。是的,它可以在无头和无头Chrome中使用。

首先安装它:

error: no matching function for call to ‘each(std::vector<std::vector<int> >&, main()::<lambda(int&)>)’

然后要求它:

#include <iostream>
#include <vector>
#include <functional>
using namespace std;

template <class VarType>
void each(vector<vector<VarType>> &ve, function<void (VarType &)> action) {
    for(vector<VarType> &v : ve) {
        for(VarType &p : v) {
            action(p);
        }
    }
}

int main() {
    vector<vector<int>> map(5);
    for(vector<int> &ve : map) {
        ve.resize(4);
    }

    each(map, [](int &val) {
        val = 1;
    });
}

使用起来很简单; 设置整个页面的代理:

npm i puppeteer-page-proxy

如果您要为每个请求使用不同的代理,则只需执行以下操作:

const useProxy = require('puppeteer-page-proxy');

然后,如果您要确保页面的IP已更改,可以进行查找;

await useProxy(page, 'http://127.0.0.1:8000');

它支持 http https socks4 socks5 代理,如果支持,则还支持身份验证需要:

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

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

答案 2 :(得分:0)

如果您要为每个页面使用不同的代理,请尝试this,使用https-proxy-agent或http-proxy-agent代理每个页面的请求

答案 3 :(得分:0)

请勿使用

"--proxy-server =${argv.proxy}"  

这是普通字符串,而不是模板文字
用`代替“

`--proxy-server =${argv.proxy}`

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

答案 4 :(得分:0)

您可以使用https://github.com/gajus/puppeteer-proxy为整个页面或仅针对特定请求设置代理,例如

import puppeteer from 'puppeteer';
import {
  createPageProxy,
} from 'puppeteer-proxy';

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  const pageProxy = createPageProxy({
    page,
    proxyUrl: 'http://127.0.0.1:3000',
  });

  await page.setRequestInterception(true);

  page.once('request', async (request) => {
    await pageProxy.proxyRequest(request);
  });

  await page.goto('https://example.com');
})();

要跳过代理,只需有条件地调用request.continue()

使用puppeteer-proxy Page可以有多个代理。