如何使用 Puppeteer 设置代理
这是有关如何使用无头 Chromium 设置和验证 Puppeteer 代理的分步指南。
Puppeteer 是一个用于控制无头 Chromium 浏览器的 NodeJS 库。它是抓取大量 JavaScript 网站的热门选择——Puppeteer 可以完全自动化大多数浏览器交互,例如移动鼠标或填写表单,并且由 Chromium 开发人员提供支持。
网络爬虫和代理密不可分。因此,如果您想充分利用 Puppeteer 的功能——避免 IP 地址封禁和其他网络爬虫障碍——您需要高质量的代理。但是,设置 Puppeteer 代理并非易事。
在本指南中,您将了解如何使用无头 Chrome 浏览器在 Puppeteer 中设置代理。此外,您还将了解使用 Puppeteer 设置代理时可能遇到的最常见问题。
如何使用 Puppeteer 设置代理
当您使用 Chrome 等常规浏览器时,代理身份验证很简单 - 您需要在弹出栏中添加凭据(用户名和密码)。但是,问题在于无头浏览器(在本例中为 Chromium)没有用户界面。这意味着没有视觉元素供您输入该信息。
Puppeteer 安装入门
开始之前,您需要以下工具:
- Node.js – 它包含用于安装 Puppeteer 的包管理器 npm。
- 代码编辑器 – 您可以使用任何您喜欢的代码编辑器。
npm init -y
步骤 2.安装 Puppeteer 软件包。
npm install puppeteer
如何在 Puppeteer 中设置带身份验证的代理
我们准备了一个实际示例,它会打开一个运行 Puppeteer 的浏览器,访问 ipinfo.io 网站,并抓取您的 IP 地址。此方法支持代理身份验证,是设置 Puppeteer 代理最常用的方法。它使用 Puppeteer 的page.authenticate()函数将代理凭据传递给浏览器。
如果不需要对代理进行身份验证,请删除或注释掉“proxyUser”、“proxyPass”和“await page.authenticate()”行。
步骤 1.首先,导入 Puppeteer 包。
const puppeteer = require('puppeteer');
步骤二:我们来设置代理服务器、用户名和密码。然后,启动浏览器。
(async () => {
const proxyServer = 'proxyserver.com:PORT';
const proxyUser = 'USERNAME';
const proxyPass = 'PASSWORD'
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxyServer}`],
});
步骤 3.启动浏览器后,打开一个新页面。
const page = await browser.newPage();
第四步,验证您的代理。
await page.authenticate({proxyUser, proxyPass});
步骤 5.现在,让我们打开浏览器开始抓取数据。
await page.goto('https://ipinfo.io');
1)为 ipinfo.io 网站上列出 IP 的元素创建 CSS 选择器。
const ipSelector = '#ip-string .text-green-05';
2) 告诉浏览器等待该元素出现。这将允许页面完全加载。
await page.waitForSelector(ipSelector);
3)使用上面的 CSS 选择器找到元素并将其分配给变量。
let ipElem = await page.$(ipSelector);
4)从该元素获取文本。
let ip = await page.evaluate(el => el.innerText, ipElem)
步骤 6.打印出结果(在本例中为 IP 地址)。
console.log(ip);
步骤 7.关闭浏览器。
await browser.close();
})();
以下是完整脚本:
const puppeteer = require('puppeteer');
(async () => {
const proxyServer = 'proxyserver.com:PORT';
const proxyUser = 'USERNAME';
const proxyPass = 'PASSWORD'
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxyServer}`],
});
const page = await browser.newPage();
await page.authenticate({proxyUser, proxyPass});
await page.goto('https://ipinfo.io');
const ipSelector = '#ip-string .text-green-05';
await page.waitForSelector(ipSelector);
let ipElem = await page.$(ipSelector);
let ip = await page.evaluate(el => el.innerText, ipElem)
console.log(ip);
await browser.close();
})();
最常见的错误
页面未加载
如果您的网络连接不稳定,Puppeteer 可能无法加载目标页面。在这种情况下,您应该在Puppeteeroptions对象中设置更高的超时值。这样,您的网络连接就不会对您的爬虫程序造成太大影响。
const options = {
timeout: 20000,
}
其他事宜
并非所有代理都与 Puppeteer 兼容,因此您可能需要尝试不同类型的代理才能找到合适的。此外,您的 IP 地址可能已被目标网站屏蔽。如果遇到这种情况,请将您的 IP 地址更改为其他地址。