logo

如何解决 PerimeterX 403 Forbidden 错误

2024-06-22 18:39
本文介绍了如何解决 PerimeterX 403 Forbidden 错误的几个方法。

集蜂云是一个可以让开发者在上面构建、部署、运行、发布采集器的数据采集云平台。加入到数百名开发者中,将你的采集器发布到市场,从而给你带来被动收入吧!

您在网页抓取过程中遇到 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

如何绕过 PerimeterX 中的 403 Forbidden?

让我们探索几种可行的技术,以避免在抓取受 PerimeterX 保护的网页时出现 403 Forbidden 错误。

方法1:获取高级代理

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 禁令,并确保稳定的性能。如果您想为您的项目选择最佳代理,请查看此高级网页抓取代理排名。

方法2:使用带有反机器人插件的无头浏览器

无头浏览器有助于模拟自然的用户行为。在抓取依赖 JavaScript 显示内容的网站时,它们尤其有用。其中最受欢迎的浏览器包括 Selenium 和 Puppeteer,

但是,像实际浏览器一样渲染 JavaScript 的能力通常不足以克服 PerimeterX 403 错误。这是因为某些无头浏览器的属性(例如navigator.webdriver)很容易被反机器人系统检测到。

幸运的是,您可以使用特殊的“隐形”插件来掩盖这些属性,最终增加成功的机会。您会在所有最流行的无头浏览器中找到此类插件,例如:

对于 Selenium,有未检测到的 Chromedriver,它可以修补 Selenium 的自动化属性,使网站更难检测到。 对于 Puppeteer,Puppeteer Stealth使用各种规避模块来隐藏自动化属性。每个规避模块都会堵塞一个特定的漏洞。 不过,由于检测自动化属性只是 PerimeterX 用于检测机器人的众多技术之一,因此仅靠这种方法可能还不够。

方法3:自定义您的用户代理

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 错误可能具有挑战性。它通常需要同时使用多个手动解决方案,这很难设置和维护。

集蜂云是一个可以让开发者在上面构建、部署、运行、发布采集器的数据采集云平台。平台提供了海量任务调度、三方应用集成、数据存储、监控告警、运行日志查看等功能,能够提供稳定的数据采集环境。平台提供丰富的采集模板,简单配置就可以直接运行,快来试一下吧。

导航目录