Puppeteer介绍
Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。Puppeteer 默认以 headless 模式运行,但是可以通过修改配置文件运行“有头”模式。在创建 browser时,可通过传入配置项实现无头模式的控制,如下:
const puppeteer = require('puppeteer');
const browser = puppeteer.launch({ headless: false })
// 为false表示不开启无头模式,则运行程序时,会有puppeteer的内核浏览器开启运行,模拟页面操作
// 当关闭无头模式后,可能会导致电脑闪屏,也是偶发的,反正我的电脑是会这样
Puppeteer设置代理IP的多种方法
1.通过启动参数设置代理
通过puppeteer启动浏览器通常可以指定参数,通过--proxy-server参数指定代理。这种方法每次需要更换代理就需要重新通过launch方法来启动浏览器。(注意:设置参数时不能有空格。另外实际使用发现不需要指定具体的协议,只需要指定地址和端口无论是socket5还是http协议的代理都可使用)。如果代理IP有验证请通过await page.authenticate({'username': '账号', 'password': '密码'})。
const browser = await puppeteer.launch({
args: [
['--proxy-server=1.1.1.1:1080'] // 这里的1.1.1.1:1080举一个例子换成你实际的代理IP
],
ignoreHTTPSErrors: true,
headless: false,
});
await page.authenticate({'username': '账号', 'password': '密码'})
2.通过拦截请求实现代理功能
过puppeteer的拦截器功能,将请求拦截,随后改写请求。再通过第三方的http库设置上代理信息。这样就可以达到不通过launch重启浏览器而是直接在一个page中设置代理的目的。每次有新请求来了也可以达到动态变化的目标。不过这样处理逻辑还是比较复杂,设计改写请求,响应结果缓存处理等问题。这里介绍一个第三方库来实现拦截请求并设置代理的功能:
const puppeteer = require('puppeteer');
// 这里建议使用'@lem0-packages/puppeteer-page-proxy'而不是'puppeteer-page-proxy'
// 同时puppeteer的版本需要22以上(注意22以上的puppeteer版本不支持waitForXpath功能)
const useProxy = require('@lem0-packages/puppeteer-page-proxy');
const browser = await puppeteer.launch({});
const page = await browser.newPage();
await useProxy(page, 'http://账号:密码@119.5.228.105:21477')
具体使用过程中发现,useProxy某些网站可能会出现资源无法加载的情况,建议可以尝试去更改库中的源码来解决。
3.通过puppeteer-extra库实现代理设置
通过代理插件可以配置 Puppeteer 使用代理服务器:
const puppeteer = require('puppeteer-extra');
const ProxyPlugin = require('puppeteer-extra-plugin-proxy');
puppeteer.use(
ProxyPlugin({
address: 'proxy.example.com',
port: 1234,
credentials: {
username: 'your-username',
password: 'your-password'
}
})
);
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
// 执行其他操作
await browser.close();
})();
总结
设置puppeteer代理有多种方法,博主具体实践下来,通过启动参数来设置代理是比较好的,虽然每次切换代理IP需要重启浏览器,但是相较于其他的方法更加稳定靠谱。另外如果是国外代理IP,可能需要电脑本身处于一个海外环境,不然会出现代理连接不上的问题,具体如何实现海外环境的效果,这里建议不要使用小猫,可能无法实现海外环境的效果,可以使用Nord或者Lets。