【问题标题】:Node JS Puppeteer throws error at url with proxyNode JS Puppeteer 使用代理在 url 处抛出错误
【发布时间】:2021-08-02 11:30:54
【问题描述】:

我正在制作一个自动化脚本,用于使用 puppeteer 在线填写表格,并且为了不将 ip 列入黑名单,我决定为每个请求使用代理,这是给我错误的部分

            console.log(`profile ${ii} started`)
            let proxy = await proxy_rotation(proxy_data, ii);
            console.log("using proxy: ", proxy);
            
            let exec_path = path.resolve(path.dirname(process.execPath) + "/node_modules/puppeteer/.local-chromium/win64-869685/chrome-win/chrome.exe")
            const browser = await puppeteer.launch({ 
                executablePath: exec_path,
                args: ['--disable-web-security']
            });
            const page = await browser.newPage();
            console.log("1");
            await page.setRequestInterception(true);
            await useProxy(page, proxy);
            console.log("2");
            await page.goto(data[ii][0]); //this is where the error gets thrown
        

下面的这部分在使用代理时无法运行,没有它,运行平稳

            console.log("3");
            await page.type("#name", data[ii][1]);
            await page.type("#yourEmail", data[ii][2]);
            await page.type("#phone", data[ii][3]);
            await page.type("#street", data[ii][4]);
            await page.type("#city", data[ii][5]);
            await page.type("#psc", data[ii][6]);
            await page.select('select#state', data[ii][7]);
            await page.select('select#prefered_size_sel', data[ii][8]);
            await page.$eval('input[name="agreed_personal_info_tiny_contact_form"]', check => check.checked = true);
            await page.evaluate(() => {
                document.querySelector('input[name="agreed_personal_info_tiny_contact_form"]').click();
            });

我只是在控制台记录了一些数字,以调试脚本卡住的位置。我还测试了我尝试使用代理测试器和手动访问的代理和网站,并且访问它没有问题

但是当我运行我的脚本时,我得到了这个 我明白它几乎说它无法访问该网址,但应该没有理由这样做。使用代理时是否需要更改访问 url 的方式?或者在浏览器中添加一些额外的参数?我可以以某种方式获得更具体的错误消息吗?感谢您的任何建议

这也是引发错误的 puppeteer 函数

async function navigate(client, url, referrer, frameId) {
            try {
                const response = await client.send('Page.navigate', {
                    url,
                    referrer,
                    frameId,
                });
                ensureNewDocumentNavigation = !!response.loaderId;
                return response.errorText
                    ? new Error(`${response.errorText} at ${url}`)
                    : null;
            }
            catch (error) {
                return error;
            }
        }

【问题讨论】:

  • 你能显示你正在使用的代理的格式吗?
  • @Vaviloff 当然,premium.guavaproxies.io:7147:customer-GUA_2xyCoQOO-cc-cz-sessid-Yywti97D-sesstime-30:ytEM6qcTH1 基本上是用户:通过身份验证,我稍微更改了凭据,所以这个不起作用
  • 不是 user:pass 应该在 URL 前面吗?
  • @Vaviloff 在 puppeteer-page-proxy github 中的演示用法是 await useProxy(page, 'http://127.0.0.1:80');,我也在这样做,当我手动测试时,我的代理确实在页面上工作。如果它是 user:pass,你还有什么建议我可以或应该使用代理?
  • 你没有这样做 - 你的代理有用户/通过身份验证,需要这样格式化。

标签: node.js proxy puppeteer http-proxy


【解决方案1】:

该错误表明您使用代理的方式有问题。 useProxy 是您自己的函数还是来自 puppeteer-page-proxy 的函数?您提到为每个请求设置代理,但似乎您正在为整个页面设置它,这是故意的吗?您的代理的格式化方式似乎也有问题 - 请在下面查看我的操作方式。

您可以尝试使用代理服务器启动浏览器并使用page.authenticate() 来处理身份验证。像这样:

let proxy = await proxy_rotation(proxy_data, ii);
const [host, port, username, password] = proxy.split(':');

const parsedProxy = new URL(`http://${username}:${password}@${host}:${port}`);
const browser = await puppeteer.launch({
    executablePath: exec_path,
    args: ['--disable-web-security', '--ignore-certificate-errors', `--proxy-server=${parsedProxy.host}`]
});
const page = await browser.newPage();
await page.authenticate({
    username: parsedProxy.username,
    password: parsedProxy.password,
});

在此之前,我会更改您传递给 useProxy 的内容,使其看起来像 http://username:pw@host:port(第 2-3 行)。

【讨论】:

  • 感谢您的建议。是的,我正在使用 puppeteer-page-proxy,我可能误解了我在做什么,我肯定会为整个页面设置 1 个代理,而不仅仅是一个请求。我还在本地将脚本作为可执行文件运行。我尝试了您的方法,但仍然得到相同的结果。此外,IDE 告诉我 const auth = parsedProxy.auth.split(':'); 中的身份验证未定义,因此我将其删除并改用 const auth = parsedProxy.toString().split(':');
  • 仍然收到此错误:? new Error(${response.errorText} at ${url}) ^ Error: net::ERR_FAILED at https://www.thestreets.sk/online-raffle/
  • 这是我当前使用的代理:premium.guavaproxies.io:7777:customer-GUA_2xyCoQOO-cc-sk-sessid-FFbXYkjL-sesstime-30:ytEM6qcTH1 随意尝试,但它有效,只是不在我的脚本中
  • @S.. 这行不通-您需要用户名和密码。试试我的固定 sn-p。无论您使用 puppeteer-page-proxy 还是 vanilla puppeteer(我的示例),您的代理都需要格式化为 http://USERNAME:PASSWORD@HOST:PORT
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2018-08-28
  • 2012-05-24
  • 2020-03-22
  • 1970-01-01
  • 2018-06-22
  • 2018-07-17
相关资源
最近更新 更多