Puppeteer 代理脱坑记
废话不多说 基本就是干货 纯实践,
puppeteer版本 1.7.0 发文时是最新的 linux和mac也都是最新的chromium浏览器(https://www.chromium.org/getting-involved/download-chromium) 浏览器下载地址版本很多 找找都是!
问题: 想将puppeteer这个东西运用到实际项目当中,当然就要加代理嘛,我这里是隧道代理,但是我升级到1.7之后 原来这种方法加代理不可以了,基本是打不开页面:
// const proxyUrl = 'http://xxxxxx:9020';
// const username = 'xxxxxx';
// const password = 'xxxxxx';
const browser = await puppeteer.launch({
ignoreHTTPSErrors: true,
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox', `--proxy-server=${proxyUrl}`],
}).catch(() => browser.close);
const page = await browser.newPage();
//加隧道代理的api authenticate这个方法 多看官方文档的api
await page.authenticate({username, password});
如上代码 ,亲测这种加代理方式是可以加隧道代理,场景就是浏览器跳出请输入账号密码让你加代理的方式,这个是可以用在puppeteer0.9版本1.5版本搭配当时版本的浏览器中的(这个是亲测可以用来加上代理的,这个是定位问题 如果有准确的请大家留言一起讨论)
但是升级到1.7的版本后不能用了,然后其实还有一种加代理的方式,后面会叙述技巧和场景
Puppeteer 1.7.0版本亲测可加代理 (主要是隧道代理可以加到Headers头中)
const browser = await puppeteer.launch({
ignoreHTTPSErrors: true,
headless: false,
args: ['--no-sandbox', '--disable-setuid-sandbox'],
}).catch(() => browser.close);
const page = await browser.newPage();
//加隧道代理 加headers头即可
await page.setExtraHTTPHeaders({
'Proxy-Authorization': 'Basic ' + Buffer.from(`${username}:${password}`).toString('base64'),
});
以上代码亲测是可以加到代理的,而且记住args[]中是不加--proxy-server的 不要和上种方法弄错了
新加个小技巧
总结:
其实遇到了好多问题定位到的是无法打开某个网页,就是加代理这里的问题,如果是不加代理自己玩那无所谓,只要加代理的话一定会出现一些问题,本人已经爬坑爬过了,所以一定要注意加代理的方式.
建议用第二种,第二种的话基本是肯定可以加到代理的,如果版本低的话第一种是可以加的到的,本人再Github还有一些国外论坛也查证了很多结合自己总结的 Puppeteer加代理的方式,有兴趣 交流的可以留言共同学习进步