2025-07-03 21:26:10 2010世界杯进球

爬虫请求失败时如何处理?

爬虫请求失败是常见的问题,可能是由于网络问题、目标网站的反爬虫机制、参数错误等多种原因导致的。为了提高爬虫的健壮性和可靠性,需要在代码中添加完善的错误处理机制。以下是一些常见的处理方法和建议:

一、检查请求状态码

HTTP 请求返回的状态码可以提供关于请求失败的有用信息。常见的状态码及其含义如下:

200:请求成功。400:请求参数错误。401:未授权,需要认证。403:禁止访问,可能被网站的反爬虫机制拦截。404:请求的资源不存在。500:服务器内部错误。502:网关错误。503:服务不可用,通常是因为服务器过载或维护。

根据不同的状态码,可以采取不同的处理策略:

import requests

from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))

def fetch_data(url):

response = requests.get(url)

response.raise_for_status() # 抛出 HTTP 错误

return response.json()

url = "https://api.example.com/data"

try:

data = fetch_data(url)

print(data)

except requests.exceptions.HTTPError as e:

print(f"请求失败:{e}")

except Exception as e:

print(f"其他错误:{e}")

代码说明

@retry:装饰器,用于实现重试机制。stop_after_attempt(3):最多重试 3 次。wait_exponential(multiplier=1, min=4, max=10):指数退避算法,重试间隔时间从 4 秒开始,每次重试间隔时间逐渐增加,最大不超过 10 秒。response.raise_for_status():如果响应状态码不是 200,抛出 HTTPError 异常。

三、异常处理

在爬虫代码中,应捕获并处理各种可能的异常,以确保程序的稳定运行。常见的异常包括:

请求异常:网络请求失败,如 requests.exceptions.RequestException。解析异常:数据解析失败,如 json.JSONDecodeError。其他异常:其他未预料到的异常。

以下是一个完整的异常处理示例:

import requests

import json

def fetch_data(url):

try:

response = requests.get(url)

response.raise_for_status() # 抛出 HTTP 错误

return response.json()

except requests.exceptions.HTTPError as e:

print(f"HTTP 错误:{e}")

except requests.exceptions.ConnectionError as e:

print(f"连接错误:{e}")

except requests.exceptions.Timeout as e:

print(f"请求超时:{e}")

except requests.exceptions.RequestException as e:

print(f"请求异常:{e}")

except json.JSONDecodeError as e:

print(f"JSON 解析错误:{e}")

except Exception as e:

print(f"其他错误:{e}")

url = "https://api.example.com/data"

data = fetch_data(url)

if data:

print(data)

代码说明

requests.exceptions.HTTPError:处理 HTTP 错误。requests.exceptions.ConnectionError:处理连接错误。requests.exceptions.Timeout:处理请求超时。requests.exceptions.RequestException:处理其他请求异常。json.JSONDecodeError:处理 JSON 解析错误。Exception:处理其他未预料到的异常。

四、日志记录

在爬虫开发中,日志记录是一个非常重要的环节。通过记录日志,可以方便地跟踪爬虫的运行状态,及时发现和解决问题。Python 的 logging 模块可以方便地实现日志记录功能。

以下是一个使用 logging 模块记录日志的示例:

import requests

import logging

# 配置日志

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def fetch_data(url):

try:

response = requests.get(url)

response.raise_for_status() # 抛出 HTTP 错误

logging.info("请求成功")

return response.json()

except requests.exceptions.HTTPError as e:

logging.error(f"HTTP 错误:{e}")

except requests.exceptions.ConnectionError as e:

logging.error(f"连接错误:{e}")

except requests.exceptions.Timeout as e:

logging.error(f"请求超时:{e}")

except requests.exceptions.RequestException as e:

logging.error(f"请求异常:{e}")

except json.JSONDecodeError as e:

logging.error(f"JSON 解析错误:{e}")

except Exception as e:

logging.error(f"其他错误:{e}")

url = "https://api.example.com/data"

data = fetch_data(url)

if data:

logging.info("数据获取成功")

print(data)

代码说明

logging.basicConfig:配置日志的基本设置,包括日志级别、格式等。logging.info:记录信息级别的日志。logging.error:记录错误级别的日志。

五、代理和用户代理

为了提高爬虫的稳定性和避免被目标网站封禁 IP,可以使用代理服务器和设置用户代理(User-Agent)。

(一)使用代理服务器

代理服务器可以隐藏爬虫的真实 IP 地址,减少被封禁的风险。可以使用 requests 库的 proxies 参数设置代理服务器。

import requests

proxies = {

'http': 'http://10.10.1.10:3128',

'https': 'https://10.10.1.10:1080',

}

response = requests.get('https://api.example.com/data', proxies=proxies)

(二)设置用户代理

用户代理(User-Agent)可以模拟不同的浏览器访问,减少被目标网站识别为爬虫的风险。可以使用 requests 库的 headers 参数设置用户代理。

import requests

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'

}

response = requests.get('https://api.example.com/data', headers=headers)

六、结语

通过上述方法和代码示例,可以有效地处理爬虫请求失败的问题,提高爬虫的健壮性和可靠性。在实际开发中,应根据具体需求和目标网站的特点,灵活应用这些方法,确保爬虫的稳定运行。希望本文的介绍和代码示例能够帮助大家更好地理解和应用爬虫技术。