![](/img/trans.png)
[英]Webscraper being blocked--how to make a Puppeteer IP address rotation?
[英]Puppeteer - How to connect WSEndpoint using local IP address?
我有兩個用於 puppeteer 自動化的 Node.js 腳本。
1) 啟動器.js
此 Puppeteer 腳本啟動 Chrome 瀏覽器並斷開與 chrome 的連接,以便可以使用 WSEndpoint 進行連接。
const puppeteer = require('puppeteer');
module.exports = async () => {
try {
const options = {
headless: false,
devtools: false,
ignoreHTTPSErrors: true,
args: [
`--no-sandbox`,
`--disable-setuid-sandbox`,
`--ignore-certificate-errors`
]
};
const browser = await puppeteer.launch(options);
let pagesCount = await browser.pages();
const browserWSEndpoint = await browser.wsEndpoint();
// console WSEndPoint say : "ws://127.0.0.1:42207/devtools/browser/dbb2525b-ce44-43c2-a335-ff15d0306f36"
console.log("browserWSEndpoint----- :> ", browserWSEndpoint);
await browser.disconnect();
return browserWSEndpoint;
} catch (err) {
console.error(err);
process.exit(1);
return false;
}
};
2)connector.js
啟動無頭 chrome 並嘗試通過 WSEndPoint 通過各種主機名連接 chrome。 如果我使用 run 命令作為node connector.js localhost
運行此腳本,它會嘗試使用 localhost 作為主機名連接 WSEndpint。
const puppeteer = require('puppeteer');
const launcher = require('./launcher');
(async (host) => {
try {
let WSEndPoint = await launcher();
WSEndPoint = WSEndPoint.replace('127.0.0.1', host);
console.log("WSENDPOINT :", WSEndPoint);
const browser = await puppeteer.connect({
browserWSEndpoint: WSEndPoint,
ignoreHTTPSErrors: true
});
let pagesCount = await browser.pages();
console.log("Pages available :> ", pagesCount.length);
// const browserWSEndpoint = await browser.wsEndpoint();
await browser.disconnect();
process.exit(1);
return true;
} catch (err) {
console.error(err);
process.exit(1);
return false;
}
})(process.argv[2]);
但是我無法使用我的本地 IP 地址(比如 192.168.1.36)連接 chrome 的 WSEndpint。 為什么?
錯誤信息是
{ Error: connect ECONNREFUSED 192.168.1.33:36693
at Object._errnoException (util.js:992:11)
at _exceptionWithHostPort (util.js:1014:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1186:14)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '192.168.1.33',
port: 36693 }
您可以代理 websocket 並連接到代理。 我在我的服務器上測試了它,它運行成功。
下面是我們如何使用http-proxy
創建 websocket 服務器,
const httpProxy = require("http-proxy");
const host = "0.0.0.0";
const port = 8080;
async function createServer(WSEndPoint, host, port) {
await httpProxy
.createServer({
target: WSEndPoint, // where we are connecting
ws: true,
localAddress: host // where to bind the proxy
})
.listen(port); // which port the proxy should listen to
return `ws://${host}:${port}`; // ie: ws://123.123.123.123:8080
}
然后當我們運行它時,我們創建一個代理服務器並監聽 ws 端點。 我不是為了讓解釋更簡單而導出它。
// your other codes
const pagesCount = (await browser.pages()).length; // just to make sure we have the same stuff on both place
const browserWSEndpoint = await browser.wsEndpoint();
const customWSEndpoint = await createServer(browserWSEndpoint, host, port); // create the server here
console.log({ browserWSEndpoint, customWSEndpoint, pagesCount });
// your other code here
當我在服務器上運行時,我們得到以下信息,
在液滴上,
➜ node index.js
{ browserWSEndpoint: 'ws://127.0.0.1:45722/devtools/browser/df0ca6a9-48ba-4962-9a20-a3a536d403fa',
customWSEndpoint: 'ws://0.0.0.0:8080',
pagesCount: 1 }
然后我們像這樣連接它,
const puppeteer = require("puppeteer-core");
(async serverAddr => {
const browser = await puppeteer.connect({
browserWSEndpoint: `ws://${serverAddr}`,
ignoreHTTPSErrors: true
});
const pagesCount = (await browser.pages()).length;
const browserWSEndpoint = await browser.wsEndpoint();
console.log({ browserWSEndpoint, pagesCount });
})(process.argv[2]);
在我的訪客計算機上,
➜ node index.js "123.123.123.123:8080"
Pages available :> 1
{ browserWSEndpoint: 'ws://123.123.123.123:8080' }
通過這種方式,我們可以在多個服務器上托管並在它們之間進行路由,如果需要,可以縮小規模等等。
和平!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.