【发布时间】:2018-02-13 14:21:24
【问题描述】:
你能告诉我这是否可能吗?
我想使用多个代理并在代理拒绝连接时自动更改代理。
args: [
'--proxy-server=127.0.0.1:9876', // Or whatever the address is
]
因此,您可以使用一个代理,但是如何使用多个并在拒绝连接时让它自动更改?
【问题讨论】:
你能告诉我这是否可能吗?
我想使用多个代理并在代理拒绝连接时自动更改代理。
args: [
'--proxy-server=127.0.0.1:9876', // Or whatever the address is
]
因此,您可以使用一个代理,但是如何使用多个并在拒绝连接时让它自动更改?
【问题讨论】:
您可以install the tor package,这将允许您通过 Tor 网络使用 Puppeteer 进行浏览,并非常容易地更改您的身份(IP 地址)。
使用--proxy-server 标志使用 Tor 启动 Puppeteer:
const browser = await puppeteer.launch({
args: [
'--proxy-server=socks5://127.0.0.1:9050',
],
});
然后,在 page.on('response') 上,如果响应不成功 (response.ok() === false),则使用 child_process.exec() 更改代理。
以下命令将创建一个新的 Tor 身份:
(echo authenticate \'""\'; echo signal newnym; echo quit) | nc localhost 9051
示例用法:
'use strict';
const puppeteer = require('puppeteer');
const exec = require('child_process').exec;
(async () => {
const browser = await puppeteer.launch({
args: [
'--proxy-server=socks5://127.0.0.1:9050'
],
});
const page = await browser.newPage();
let current_ip_address = '';
page.on('response', response => {
if (response.ok() === false) {
exec('(echo authenticate \'""\'; echo signal newnym; echo quit) | nc localhost 9051', (error, stdout, stderr) => {
if (stdout.match(/250/g).length === 3) {
console.log('Success: The IP Address has been changed.');
} else {
console.log('Error: A problem occured while attempting to change the IP Address.');
}
});
} else {
console.log('Success: The Page Response was successful (no need to change the IP Address).');
}
});
await page.goto('http://checkip.amazonaws.com/');
current_ip_address = await page.evaluate(() => document.body.textContent.trim());
console.log(current_ip_address);
await browser.close();
})();
注意:Tor 可能需要一些时间来更改身份,因此在继续您的程序之前验证 IP 地址是否不同可能是一个不错的调用。
【讨论】:
page.on('response' 会检查每个请求,包括那些针对 css、图像、js 的请求。因此,如果您访问任何现代网页,您很可能会收到 10 到 20 个要检查的请求,其中很多请求的状态不是ok(),因此您最终切换的频率比您通常想要的要高。跨度>