如何在Puppeteer 1.11.0请求中指定服务器多IP接口?(Node v10.15.0)
解决Puppeteer 1.11.0绑定指定服务器IP的方案
嘿,针对你遇到的这个问题——服务器有多个IP但不知道怎么让Puppeteer指定使用,刚好我之前在类似的环境(Node.js v10.15.0 + Puppeteer 1.11.0)里折腾过,给你两个靠谱的方案:
方案1:启动Chrome时用--host-resolver-rules强制解析
这个方法是通过Chrome启动参数直接修改域名解析规则,把所有请求都指向你指定的服务器IP,适合全局固定一个IP的场景。
代码示例:
const puppeteer = require('puppeteer'); (async () => { // 替换成你要使用的目标IP const targetIp = '192.168.1.100'; const browser = await puppeteer.launch({ args: [ `--host-resolver-rules="MAP * ${targetIp},EXCLUDE localhost"` ] }); const page = await browser.newPage(); // 访问一个能显示当前IP的网站验证 await page.goto('https://icanhazip.com'); const currentIp = await page.$eval('body', el => el.textContent.trim()); console.log('当前请求使用的IP:', currentIp); await browser.close(); })();
说明:MAP * ${targetIp}会把所有非localhost的请求解析到指定IP,EXCLUDE localhost是避免本地服务被影响。
方案2:本地代理绑定指定IP(灵活切换)
如果需要动态切换不同的IP,这个方法更合适——在本地搭建一个简单的HTTP代理,绑定到目标IP,再让Puppeteer通过这个代理发起请求。
首先安装兼容Node.js v10的代理包:
npm install http-proxy@1.17.0
然后编写代码:
const puppeteer = require('puppeteer'); const httpProxy = require('http-proxy'); (async () => { // 要使用的服务器IP const targetIp = '192.168.1.100'; const proxyPort = 8080; // 创建本地代理,绑定到指定IP const proxy = httpProxy.createProxyServer({ bind: targetIp }).listen(proxyPort); // 启动Puppeteer并配置代理 const browser = await puppeteer.launch({ args: [ `--proxy-server=http://localhost:${proxyPort}` ] }); const page = await browser.newPage(); await page.goto('https://icanhazip.com'); const currentIp = await page.$eval('body', el => el.textContent.trim()); console.log('当前请求使用的IP:', currentIp); await browser.close(); proxy.close(); // 关闭代理 })();
说明:每个代理实例可以绑定一个不同的IP,需要切换时启动对应代理即可,灵活性更高。
注意事项
- 你的Puppeteer版本比较老,一些新版本的网络拦截API(比如
page.setRequestInterception结合修改请求源IP)在这个版本里支持有限,所以上面的方案是最适配的。 - 确保目标IP已经在服务器上正确配置,并且可以正常访问外部网络,否则请求会超时或失败。
- 测试时一定要用能显示当前请求IP的网站验证,避免白忙活。
内容的提问来源于stack exchange,提问作者Imad
相关产品推荐
相关产品推荐

