跳到内容

403 禁止:网络爬虫的祸根(以及如何避免它)

如果您曾经尝试从网站上抓取数据,那么您几乎肯定会在某些时候遇到可怕的“403 Forbidden”错误。此 HTTP 状态代码表示服务器理解您的请求,但拒绝满足它。换句话说,您无权访问您请求的资源。

对于网络爬虫来说,403 错误一直是一个令人头疼的问题。网站使用它们来防止未经授权的页面访问,并阻止来自机器人或抓取工具而不是人类用户的流量。收到 403 响应可能会使您的网页抓取项目戛然而止。

但不要绝望!虽然 403 错误可能令人沮丧,但它们并非无法克服。使用正确的技术,可以避免触发 403 并保持网络抓取工具平稳运行。在本指南中,我们将深入探讨 403 错误的原因并探讨预防这些错误的策略。让我们开始吧!

为什么网络爬虫会遇到 403 错误

网络抓取工具可能会收到来自网站的 403 Forbidden 响应,主要原因有以下几个:

  1. 请求受限资源:某些页面根本禁止未经授权的用户访问。例如,如果您没有有效的会话,尝试访问需要登录的页面(例如用户仪表板)通常会导致 403 错误。

  2. 缺少身份验证:许多网站需要某种形式的身份验证,例如使用用户名和密码登录才能访问某些页面。如果您的网络抓取工具没有提供必要的身份验证凭据,它可能会收到 403 响应。

  3. 机器人检测:网站通常采用各种技术来检测和阻止来自机器人或抓取工具的流量。如果网站认为您的网络抓取工具是自动化工具而不是人类用户,它可能会响应 403 错误。

  4. 反机器人系统:一些网站使用 Cloudflare、Imperva 或 PerimeterX 等专用的反机器人解决方案来防止抓取和其他自动威胁。这些系统分析流量模式并阻止看似可疑的请求,通常会返回 403 错误。

为了成功地抓取网站,我们需要一些方法来避免这些问题,并让网站相信我们的网络抓取工具是合法的、授权的用户。幸运的是,我们可以采取多种方法。让我们看看一些最有效的策略。

提供身份验证

如果网站需要登录才能访问您要抓取的内容,则需要在网页抓取过程中包含身份验证。这通常涉及两个步骤:

  1. 检查登录过程:手动登录网站时,使用浏览器的开发者工具观察网络流量。查找提交登录凭据的请求并记下 URL、请求方法、标头和请求正文。您需要在网络抓取工具中复制此请求。

  2. 以编程方式登录:使用 Python 的 Requests 或 Node.js 的 Axios 等库来发送模仿您观察到的登录请求。捕获站点返回的任何 cookie,因为这些 cookie 通常包含验证后续请求所需的会话令牌。将这些 cookie 包含在网络抓取请求的标头中,以维持有效的登录会话。

以下是使用 Python 和请求以编程方式登录站点的示例:

import requests

# Start a new session
session = requests.Session() 

# Send a POST request to the login URL with the necessary credentials
login_data = {
    ‘username‘: ‘my_username‘,
    ‘password‘: ‘my_password‘,
}
response = session.post(‘https://example.com/login‘, data=login_data)

# The session now contains the cookies needed to authenticate future requests
response = session.get(‘https://example.com/restricted_page‘)

通过验证您的网络抓取工具并在请求中包含必要的 cookie 和标头,您可以避免因缺少权限而导致的 403 错误。

隐身技术

当然,登录并不总是足够的。网站不断地与网络爬虫进行猫捉老鼠的游戏,寻找区分机器人和人类用户的信号。为了避免被阻止,网络爬虫需要通过尽可能模仿人类行为来融入。

一些关键的隐形技术包括:

  • 轮换用户代理:用户代理是标识发出请求的客户端的字符串。对所有请求使用相同的用户代理完全暴露了流量来自机器人。相反,维护一个用户代理字符串池,并为每个请求随机选择一个不同的字符串。

  • 轮换IP地址:从单个 IP 地址发送大量请求是机器人检测系统的另一个危险信号。使用代理服务通过各种 IP 地址路由请求。为了获得最佳结果,请选择提供大量住宅 IP 的提供商。

  • 随机化请求模式:人类不会以完全常规的方式浏览网站。它们会暂停、不规律地更改页面,并改变请求之间的时间。在网络抓取请求之间引入随机延迟,并避免以完全可预测的模式抓取网站。

  • 处理验证码:某些网站在怀疑机器人活动时会显示验证码。对于网络抓取工具来说,自动解决验证码可能很棘手。如果您经常遇到它们,您可能需要使用验证码解决服务,该服务利用人类工作人员代表您的抓取工具完成挑战。

下面是一个使用随机用户代理和延迟的 Python 隐秘请求示例:

import requests
import random
import time

# List of user agent strings
user_agents = [    
    ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36‘,
    ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36‘,
    ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36‘,  
]

# Randomize user agent 
headers = {‘User-Agent‘: random.choice(user_agents)}

# Introduce a random delay of 1-5 seconds
time.sleep(random.randint(1, 5))

# Send the request
response = requests.get(‘https://example.com‘, headers=headers)

通过采取措施使网络抓取工具的流量看起来尽可能“人性化”,您可以显着降低遇到 403 错误和其他障碍的风险。

无法察觉的自动化

为了尽可能隐蔽地进行网页抓取,您可能需要使用完整的浏览器自动化工具,例如 Puppeteer 或 Playwright。这些工具以编程方式运行实际的浏览器(Chrome 或 Firefox),允许您以一种很难与真实人类用户区分开的方式与网站交互。

可以配置浏览器自动化工具以实现最大程度的隐蔽性。例如,您可以将它们设置为阻止 JavaScript 指纹识别代码、掩盖导航器对象中自动化的明显迹象以及随机化视口尺寸。通过控制真实的浏览器,您还可以自动处理 cookie、标头、重定向和基本 Web 抓取库无法为您管理的 HTTP 的其他方面。

浏览器自动化的缺点是,它比使用 Requests 或 Axios 等库发送简单的 HTTP 请求更耗费资源且速度更慢。然而,对于那些特别积极阻止抓取工具的网站来说,性能上的权衡可能是值得的。

以下是在 Node.js 中使用 Puppeteer 访问无头 Chrome 中页面的基本示例:

const puppeteer = require(‘puppeteer‘);

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Configure the browser for stealth (omitted for brevity)

  await page.goto(‘https://example.com‘);

  // Scrape data from the page...

  await browser.close();
})();

通过一些额外的配置,Puppeteer 等工具可以成为自动抓取同时避免检测的强大方法。

结论

遇到 403 错误是网络抓取过程中不可避免的一部分,但只要采取正确的方法,它们就不会破坏您的项目。通过了解 403 发生的原因并采取措施避免触发它们(通过身份验证、隐秘技术和不可检测的自动化),您可以保持网络抓取工具平稳运行。

最有效的方法将根据您所定位的具体网站而有所不同。有些可能只需要简单的请求标头来避免 403,而另一些可能需要完整的浏览器自动化设置。关键是从基本技术开始,然后根据遇到的障碍根据需要添加更复杂的隐身层。

如果避免 403 和其他反抓取措施的不断发展的挑战令人畏惧,您可能需要考虑使用现成的网络抓取 API,而不是构建和维护自己的抓取基础设施。 ScrapingBee 和 ScraperAPI 等服务提供经过实战检验的抓取工具,具有内置的 403 避免功能,可以为您节省大量的开发时间。

无论您选择使用自己的网络抓取工具还是使用预构建的解决方案,重要的是不要让 403 错误阻止您获取所需的数据。只要有一点坚持和工具包中正确的工具,您就可以在面对任何反机器人对策时保持网络爬虫的运行。快乐刮擦!

加入谈话

您的电邮地址不会被公开。 必填带 *