集蜂云是一个可以让开发者在上面构建、部署、运行、发布采集器的数据采集云平台。加入到数百名开发者中,将你的采集器发布到市场,从而给你带来被动收入吧!
您在网页抓取过程中遇到 PerimeterX 403 Forbidden 错误是否让您感到沮丧?
这种常见错误会阻止您从网页检索内容,最坏的情况下甚至会导致您被永久封锁。
但是有一些方法可以完全绕过 PerimeterX。在本文中,您将看到四种实用技术,它们将帮助您避免 403 禁止错误,以及实施这些技术的分步指南。我们开始吧!
PerimeterX 403 是什么?
PerimeterX 403 错误类似于403:Forbidden HTTP 状态代码,这是对未完成请求的常见响应。
当 PerimeterX 反机器人系统将您的请求标记为可疑时,就会发生此错误。然后它会显示一条错误消息,表明它理解了您的请求,但拒绝满足它。
这就是控制台或终端上显示的错误。
HTTPError: 403 Client Error: Forbidden for url: https://www.ssense.com/en-ca
如果您使用 Selenium 等图形用户界面 (GUI) 进行抓取,您的响应可能类似于下图:
让我们探索几种可行的技术,以避免在抓取受 PerimeterX 保护的网页时出现 403 Forbidden 错误。
PerimeterX 403 Forbidden 错误也可能源于基于 IP 的限制,这种限制会根据请求的 IP 地址限制或阻止访问。
在这种情况下,代理可以帮助您躲避雷达。代理充当您的抓取工具和目标服务器之间的中介,并通过将您的请求路由到不同的服务器来提供匿名性。您的请求似乎来自不同的地区或实际用户,特别是如果您使用住宅高级代理(分配给真实设备或用户的代理)。
使用无头浏览器(例如 Playwright)来充分利用代理的优势。这样,您可以模拟自然的用户行为,同时避免基于 IP 的限制。
设置 Playwright 代理需要启动浏览器并将代理详细信息作为单独的参数发送。以下是示例代码片段,展示了如何在 Playwright 中设置代理:
from playwright.async_api import async_playwright
import asyncio
async def main():
async with async_playwright() as playwright:
browser = await playwright.chromium.launch(
proxy={
'server': '181.129.43.3:8080',
},
)
context = await browser.new_context()
page = await context.new_page()
await page.goto('https://httpbin.org/ip')
html_content = await page.content()
print(html_content)
await context.close()
await browser.close()
asyncio.run(main())
上述代码使用了免费代理列表中的代理。然而,免费代理只适用于教程和测试,因为它们不可靠、寿命短,而且无法对抗 Playwright 等强大的反机器人解决方案。
这就是为什么最好使用提供自动轮换的高质量高级代理。它们将帮助您避免速率限制和 IP 禁令,并确保稳定的性能。如果您想为您的项目选择最佳代理,请查看此高级网页抓取代理排名。
无头浏览器有助于模拟自然的用户行为。在抓取依赖 JavaScript 显示内容的网站时,它们尤其有用。其中最受欢迎的浏览器包括 Selenium 和 Puppeteer,
但是,像实际浏览器一样渲染 JavaScript 的能力通常不足以克服 PerimeterX 403 错误。这是因为某些无头浏览器的属性(例如navigator.webdriver)很容易被反机器人系统检测到。
幸运的是,您可以使用特殊的“隐形”插件来掩盖这些属性,最终增加成功的机会。您会在所有最流行的无头浏览器中找到此类插件,例如:
对于 Selenium,有未检测到的 Chromedriver,它可以修补 Selenium 的自动化属性,使网站更难检测到。 对于 Puppeteer,Puppeteer Stealth使用各种规避模块来隐藏自动化属性。每个规避模块都会堵塞一个特定的漏洞。 不过,由于检测自动化属性只是 PerimeterX 用于检测机器人的众多技术之一,因此仅靠这种方法可能还不够。
HTTP 标头是随每个 HTTP 请求一起发送的元数据,网站使用它来定制响应。
无头浏览器的 HTTP 标头与常规浏览器的 HTTP 标头有很大不同,这使得反机器人系统很容易检测到它们。
自己看看吧。Selenium 的默认请求标头如下所示:
"headers": {
"Accept": [
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
],
"Accept-Encoding": [
"gzip, deflate, br"
],
"Connection": [
"keep-alive"
],
"Host": [
"httpbin.io"
],
"Sec-Ch-Ua": [
"\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"HeadlessChrome\";v=\"122\""
],
"Sec-Ch-Ua-Mobile": [
"?0"
],
"Sec-Ch-Ua-Platform": [
"\"Windows\""
],
"Sec-Fetch-Dest": [
"document"
],
"Sec-Fetch-Mode": [
"navigate"
],
"Sec-Fetch-Site": [
"none"
],
"Sec-Fetch-User": [
"?1"
],
"Upgrade-Insecure-Requests": [
"1"
],
"User-Agent": [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/122.0.6261.95 Safari/537.36"
]
}
同时,浏览器的默认标头如下:
{
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-US,en;q=0.9',
'cache-control': 'max-age=0',
'cookie': 'prov=4568ad3a-2c02-1686-b062-b26204fd5a6a; usr=p=%5b10%7c15%5d%5b160%7c%3bNewest%3b%5d',
'referer': 'https://www.google.com/',
'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'cross-site',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
从上面的示例中可以看出,Selenium 的 HTTP 标头组件并不完整。
这些 HTTP 标头中最关键的组件是用户代理 (UA),它通知目标服务器请求的客户端。如果您被识别为非浏览器客户端,您很可能会收到 PerimeterX 403 错误响应代码。因此,自定义您的用户代理以镜像常规浏览器的代理将降低检测的可能性。
确保标头准确的一种方法是使用常规浏览器访问目标网站,复制浏览器发送的标头,并将其用作 Selenium 脚本中的自定义标头。
此外,请检查请求标头的顺序,因为 PerimeterX 可以根据非浏览器标头的默认排列来标记您的网络抓取工具。
但是,请记住,仅设置正确的用户代理对 PerimeterX 不起作用。网站还可以检测 HTTP 标头中的差异,因此保持一致性至关重要。例如,如果您的用户代理反映了有关您的请求的某些信息,则其他标头应与所述数据保持一致。
解决 PerimeterX 403 错误可能具有挑战性。它通常需要同时使用多个手动解决方案,这很难设置和维护。
集蜂云是一个可以让开发者在上面构建、部署、运行、发布采集器的数据采集云平台。平台提供了海量任务调度、三方应用集成、数据存储、监控告警、运行日志查看等功能,能够提供稳定的数据采集环境。平台提供丰富的采集模板,简单配置就可以直接运行,快来试一下吧。