node.js - Node JS Puppeteer 使用代理在 url 处抛出错误
问题描述
我正在制作一个自动化脚本,用于使用 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,但应该没有理由这样做。使用代理时是否需要更改访问 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;
}
}
解决方案
该错误表明您使用代理的方式出现了问题。是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 行)。
推荐阅读
- python - 从给定的列表索引中取 no 邻居。给定解决方案的最佳实践或有效性能是什么?
- android - 在使用 GridLayout 的 Constaint 布局中添加了 ScrollView 它不起作用
- apache-flink - 原始状态与托管状态的示例
- vue.js - vuetify v-chip 关闭图标未显示
- java - 如何将文本导入 JList?
- awk - 来自多个文件的 awk Sum 列并将结果放在一个文件中
- ruby-on-rails - Sidekiq:perform_async 中的参数作为字符串而不是实际对象或 ActiveRecord::Relation 发送
- java - 从 servlet 类调用 jsp 页面不起作用?
- python - 堆叠两个具有不同隐藏层的 LSTM
- aws-lambda - 如何仅使用代码部署服务从 s3 部署压缩 lambda 代码?