网络抓取中的错误 403 和其他问题: 为什么会出现这些问题以及如何避免?
网络抓取是从各种来源自动收集数据的过程。然而,抓取者经常会遇到不同的障碍,其中最常见的就是 “403 Forbidden ”错误。该错误表示服务器已阻止访问请求的资源。要有效地进行网络搜刮,关键是要了解为什么会出现这种错误,并知道如何规避它。在本文中,我们将探讨什么是 403 错误、出现该错误的原因、绕过该错误的策略、收集数据时的其他限制以及解决这些问题的方法。
发生原因
为什么服务器会阻止访问数据?在网络刮擦过程中,由于网站的保护机制会防止未经授权的访问或资源滥用,因此会出现 403 错误。让我们仔细分析一下出现这种错误的原因和解决方法。
IP 地址限制: 网站可能会根据 IP 地址限制访问。如果来自一个 IP 地址的请求过多,服务器可能会阻止它,以防止过载和潜在的攻击。
- 无头模式: 在 Selenium 等自动化工具中使用无头浏览器也会导致错误。有些网站会检测到请求来自无头模式的浏览器,在这种模式下没有用户交互(如点击、滚动)。这可能表明是自动访问,网站可能会认为这是可疑的。如果仍然需要使用无头模式,请将浏览器配置为模拟真正的图形界面浏览器。
- 缺少所需的 Cookie: 有些网站需要特定的 Cookie 或会话才能访问内容。
- 不正确的用户代理: 许多网站会检查 User-Agent 标头,以获取浏览器和设备的相关信息。如果未指定该标头、提供的标头不正确或在大规模请求时未旋转该标头,服务器可能会拒绝访问。
如何绕过网络抓取中的错误 403
为确保无缝数据收集,可考虑采用几种有效方法来防止访问受阻:
- 使用优质代理服务器: 定期更换 IP 地址有助于避免拦截。使用可靠的代理服务器对避免黑名单非常重要。
- 避免过于频繁的请求: 降低请求频率并在请求之间引入延迟,有助于避免阻塞。如果您使用 Python 编写刮擦程序,时间库可以帮助您设置请求之间的延迟:
import time
time.sleep(5) # 在请求之间延迟 5 秒钟
模拟真实浏览器: 如 Selenium 所示,使用各种选项来实现这一点:
from selenium import webdriver
options = webdriver.ChromeOptions()
# 如果需要运行图形浏览器,请不要添加 --headless 参数
options.add_argument(“--headless”)
# 屏幕尺寸模拟
options.add_argument(“window-size=1920,1080”)
# 该标记有助于隐藏自动化痕迹。
options.add_argument(“--disable-blink-features=AutomationControlled”)
driver = webdriver.Chrome(options=options)
driver.get(“https://example.com”)
正确处理 Cookie: 如果网站需要身份验证,则必须正确保存和使用 Cookie。您可以使用请求库将 cookie 与请求一起传递:
import requests
session = requests.Session()
response = session.get('https://example.com')
# 在后续请求中使用 cookie
# 使用相同的 cookie 发送第二个请求
response2 = session.get('https://example.com/another-page')
设置正确的 User-Agent: 使用真实的 User-Agent 标头有助于绕过拦截。最好使用流行浏览器(如 Chrome、Firefox)常用的用户代理:
headers = {
“User-Agent": “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.122 Safari/537.36”
}
您还可以使用 Python 随机库轮流使用 User-Agent。事先创建一个不同 User-Agent 字符串的列表,并定期更新。
使用随机从预先创建的列表中随机选择一个 User-Agent 的示例代码:
import random
import requests
# 用户代理列表
user_agents = [
“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6533.122 Safari/537.3"、
“Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/56.0 Safari/537.36"、
“Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15"、
]
# 随机选择用户代理
random_user_agent = random.choice(user_agents)
headers = {
“User-Agent": random_user_agent
}
# 使用随机用户代理的请求示例
response = requests.get(“https://example.com”, headers=headers)
# 打印响应状态代码和使用的用户代理
print(f “Status Code: {response.status_code}”)
print(f “Used User-Agent: {random_user_agent}”)
除了更改用户代理外,该库还允许从代理池中为每个请求使用随机 IP 地址,在请求之间添加随机延迟,以及旋转其他元素以模仿各种用户行为和设备。
网络抓取还存在哪些挑战?
除了错误 403,抓取程序还经常会遇到其他错误:
- 401 未授权: 没有凭证,拒绝访问。解决方法:使用用户名和密码进行身份验证。
- 500 内部服务器错误: 服务器端出现问题。解决方法:稍后重试请求或通知管理员。
- 429 请求过多: 请求太多。解决方法:减少请求频率,使用代理。
- 混淆的 HTML 结构: 在网络刮擦过程中,您可能会遇到混淆的 HTML 代码,其中类、ID 和其他元素的名称不明确或为动态生成。解决方法:使用强大的 XPath 或 CSS 选择器,通过文本内容搜索元素,并使用 lxml 等特殊库解析和处理 HTML。在复杂的情况下,可以使用 TensorFlow 或 PyTorch 创建机器学习模型,根据大量数据识别模式并对混淆元素进行分类。
另一个常见的障碍是验证码,这是一种出于类似原因而经常出现的保护系统。不过不用担心,许多服务都能有效绕过这些限制,CapMonster Cloud 就是其中的佼佼者。这款便捷的云工具提供了自动解决验证码问题的 API,大大简化了工作。以下是将 CapMonster Cloud 集成到你的 Python 爬虫代码中的步骤:
注册并获取 API 密钥: 要使用CapMonster Cloud,您需要在该服务上注册并获取一个API密钥,用于验证对该服务的请求。
安装必要的库: CapMonster Cloud有适用于不同语言的库。以下是连接 Python 官方库的方法:
pip install capmonstercloudclient
创建任务,将其发送到服务器并接收响应:
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import RecaptchaV2ProxylessRequest
async def solve_captcha(api_key, page_url, site_key):
client_options = ClientOptions(api_key=api_key)
cap_monster_client = CapMonsterClient(options=client_options)
recaptcha2request = RecaptchaV2ProxylessRequest(websiteUrl=page_url, websiteKey=site_key)
responses = await cap_monster_client.solve_captcha(recaptcha2request)
return responses['gRecaptchaResponse']
async def main():
api_key = 'YOUR_CAPMONSTER_API_KEY'
page_url = 'https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=low'
site_key = '6Lcf7CMUAAAAAKzapHq7Hu32FmtLHipEUWDFAQPY'
captcha_response = await solve_captcha(api_key, page_url, site_key) print(“CAPTCHA Solution:”, captcha_response)
如果 __name__ == “__main__”:
asyncio.run(main())
实用链接
在使用本文提到的每种工具之前,我们建议查看它们的文档。以下是一些有用的资源链接,您可以从中找到更详细的信息和可能问题的答案:
Selenium WebDriver
CapMonster Cloud:网站、文档、CapMonster Cloud API
即使数据量很大,网络刮擦也很有效,但频繁出错会使过程复杂化。
了解出现 403 等错误的原因并采用正确的绕过方法(设置用户代理、使用代理和验证码解决服务)将使您的工作更有效率。遵循行之有效的方法可以降低受阻的风险,简化数据收集工作,而谨慎地完成任务则能确保获得积极的网络资源体验。
注意:我们要提醒您,该产品用于在您自己的网站和您有合法访问权的网站上进行自动测试。