如何使用异常处理机制捕获和处理请求失败的情况

简介: 在爬虫开发中,我们经常会遇到请求失败的情况,比如网络超时、连接错误、服务器拒绝等。这些情况会导致我们无法获取目标网页的内容,从而影响爬虫的效果和效率。为了解决这个问题,我们需要使用异常处理机制来捕获和处理请求失败的情况,从而提高爬虫的稳定性和稳定性。

亿牛云代理.png

在爬虫开发中,我们经常会遇到请求失败的情况,比如网络超时、连接错误、服务器拒绝等。这些情况会导致我们无法获取目标网页的内容,从而影响爬虫的效果和效率。为了解决这个问题,我们需要使用异常处理机制来捕获和处理请求失败的情况,从而提高爬虫的稳定性和稳定性。

异常处理机制的特点

异常处理机制是一种编程技术,用于在程序运行过程中发生异常时,能够及时捕获并处理异常,从而避免程序崩溃或者出现不可预期的结果。异常处理机制有以下几个特点:

  • 可以预先定义可能发生的异常类型,并为每种异常类型指定相应的处理方法。
  • 可以使用 try-except 语句来执行可能发生异常的代码,并在 except 子句中捕获并处理异常。
  • 可以使用 raise 语句来主动抛出异常,并在上层调用处捕获并处理异常。
  • 可以使用 finally 语句来执行无论是否发生异常都要执行的代码,比如关闭文件或者释放资源。

异常处理机制的案例

为了演示如何使用异常处理机制来捕获和处理请求失败的情况,我们将使用 requests 库来发送 HTTP 请求,并使用异步技术来提高爬虫的速度。同时,我们将使用亿牛云代理服务器来隐藏我们的真实 IP 地址和位置信息,以防止被目标网站封禁或者限制。

首先,我们需要导入 requests 库和 asyncio 库,并定义一个异步函数 send_request 来发送 HTTP 请求。在这个函数中,我们需要使用 try-except 语句来执行可能发生异常的代码,并在 except 子句中捕获并处理 requests.exceptions.RequestException 异常,这是 requests 库中最基本的异常类型,包含了所有与请求相关的异常。如果发生了这种异常,我们可以打印出异常信息,并返回 None 表示请求失败。如果没有发生异常,我们可以返回响应对象 response 表示请求成功。

import requests
import asyncio

# 定义一个异步函数 send_request 来发送 HTTP 请求
async def send_request(url):
    # 使用 try-except 语句来执行可能发生异常的代码
    try:
        # 使用 requests 库发送 GET 请求,并设置超时时间为 10 秒
        response = requests.get(url, timeout=10)
        # 返回响应对象 response 表示请求成功
        return response
    # 在 except 子句中捕获并处理 requests.exceptions.RequestException 异常
    except requests.exceptions.RequestException as e:
        # 打印出异常信息
        print(e)
        # 返回 None 表示请求失败
        return None

接下来,我们需要定义一个异步函数 get_proxy 来获取代理服务器的信息,并返回一个代理字典 proxy。在这个函数中,我们需要使用 requests 库的 auth 模块来生成一个 HTTPBasicAuth 对象,用于验证我们的代理账号和密码。然后,我们需要使用 requests 库的 get 方法来发送 GET 请求,并将 auth 参数设置为我们的 HTTPBasicAuth 对象,从而获取代理服务器的信息。如果请求成功,我们可以从响应对象 response 中提取代理服务器的 IP 地址和端口号,并构造一个代理字典 proxy,其中包含了 http 和 https 协议对应的代理地址。如果请求失败,我们可以返回 None 表示获取代理失败。

import requests
import asyncio

# 定义一个异步函数 get_proxy 来获取代理服务器的信息,并返回一个代理字典 proxy
async def get_proxy():
    # 亿牛云 爬虫加强版 代理服务器
    proxyHost = "www.16yun.cn"
    proxyPort = "3111"
    # 代理验证信息
    proxyUser = "16YUN"
    proxyPass = "16IP"
    # 使用 requests 库的 auth 模块来生成一个 HTTPBasicAuth 对象,用于验证我们的代理账号和密码
    auth = requests.auth.HTTPBasicAuth(proxyUser, proxyPass)
    # 使用 requests 库的 get 方法来发送 GET 请求,并将 auth 参数设置为我们的 HTTPBasicAuth 对象,从而获取代理服务器的信息
    response = requests.get("http://www.16yun.cn/api/ip", auth=auth)
    # 如果请求成功
    if response.status_code == 200:
        # 从响应对象 response 中提取代理服务器的 IP 地址和端口号
        ip = response.json()["data"][0]["ip"]
        port = response.json()["data"][0]["port"]
        # 构造一个代理字典 proxy,其中包含了 http 和 https 协议对应的代理地址
        proxy = {
   
   
            "http": f"http://{ip}:{port}",
            "https": f"https://{ip}:{port}"
        }
        # 返回代理字典 proxy 表示获取代理成功
        return proxy
    # 如果请求失败
    else:
        # 返回 None 表示获取代理失败
        return None

最后,我们需要定义一个异步函数 main 来执行主程序。在这个函数中,我们需要使用 asyncio 库的 gather 方法来创建一个任务列表 tasks,其中包含了多个 send_request 函数的调用,每个调用都传入一个目标网站的 URL。然后,我们需要使用 asyncio 库的 run 方法来运行这个任务列表,并等待所有任务完成。如果任务完成,我们可以遍历返回的结果列表 results,并打印出每个结果的状态码和内容长度。如果任务失败,我们可以打印出 None 表示请求失败。

import requests
import asyncio

# 定义一个异步函数 main 来执行主程序
async def main():
    # 使用 asyncio 库的 gather 方法来创建一个任务列表 tasks,其中包含了多个 send_request 函数的调用,每个调用都传入一个目标网站的 URL
    tasks = [
        send_request("https://www.baidu.com"),
        send_request("https://www.google.com"),
        send_request("https://www.bing.com")
    ]
    # 使用 asyncio 库的 run 方法来运行这个任务列表,并等待所有任务完成
    results = await asyncio.gather(*tasks)
    # 遍历返回的结果列表 results
    for result in results:
        # 如果结果不是 None 表示请求成功
        if result is not None:
            # 打印出结果的状态码和内容长度
            print(result.status_code, len(result.content))
        # 如果结果是 None 表示请求失败
        else:
            # 打印出 None 表示请求失败
            print(None)

# 调用 main 函数来执行主程序
asyncio.run(main())

结语

通过上面的介绍和案例,我们可以看到,使用异常处理机制来捕获和处理请求失败的情况,可以有效地提高爬虫的稳定性和稳定性,从而避免程序崩溃或者出现不可预期的结果。同时,使用异步技术和代理服务器,可以进一步提高爬虫的速度和效率,从而爬取更多的目标网页。

相关文章
|
消息中间件 网络协议 物联网
MQTT常见问题之物联网设备端申请动态注册时MQTT服务不可用如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
算法 前端开发 Java
信创环境下达梦数据库唯一索引异常无法拦截DuplicateKeyException
迁移到达梦数据库后,发现我们的全局异常拦截中的唯一索引异常 无法被正常拦截,给前端直接抛出了数据库原始的错误信息,对用户极其不友好。如果不对唯一索引异常拦截,则默认 与 的异常信息如下:在 中通过 注解,实现对异常响应的统一封装。可参考:全栈开发之后端脚手架:SpringBoot集成MybatisPlus代码生成,分页,雪花算法,统一响应,异常拦截,Swagger3接口文档以下是对数据库唯一索引异常的拦截,统一返回:编号不可重复。 问题分析 对主流的数据库的异常进行了封装与翻译,对于 都可以进行拦截,但是到了国产数据库,比如这里是达梦8,那么其异常信息 `Spring` 就不认识
2159 0
|
11月前
|
资源调度 分布式计算 调度
【赵渝强老师】Yarn的资源调度策略
Yarn作为资源和任务调度平台,支持多个应用程序同时运行,如MapReduce、Spark和Flink等。Yarn的资源调度方式主要包括FIFO Scheduler(先来先服务)、Capacity Scheduler(容量调度)和Fair Scheduler(公平调度)。FIFO Scheduler按任务提交顺序调度;Capacity Scheduler通过队列管理资源,支持多租户共享;Fair Scheduler则根据任务权重动态分配资源,确保公平性。
628 8
|
5月前
|
传感器 人工智能 API
通义灵码2.5深度评测:编程智能体与MCP工具的革新体验
通义灵码2.5通过“智能体+MCP”组合,重新定义了AI编码助手的边界。其价值不仅在于代码生成效率,更在于通过工具链整合和环境感知,推动开发流程向“声明式编程”演进。对于开发者而言,它既是提升效率的利器,也是探索AI辅助开发边界的实验场。
390 8
|
7月前
|
网络协议 安全 网络安全
申请通配符 SSL 证书的详细流程
申请通配符SSL证书需明确需求并选择知名CA,选择通配符证书,提交域名信息,通过DNS或邮件验证域名,下载证书文件及私钥。最后在服务器上配置证书和私钥,调整SSL参数,确保网站安全启用加密,提升用户信任。
|
10月前
|
敏捷开发 数据可视化 BI
从数据到决策:工作汇报中可视化图表的正确打开方式
本文介绍如何根据信息选择合适的图表类型,包括时间相关的甘特图、折线图、时间线图;数据对比的柱状图、饼图、堆叠图;状态跟踪的看板、燃尽图;关系分析的散点图、热力图。
351 3
从数据到决策:工作汇报中可视化图表的正确打开方式
|
12月前
|
安全 搜索推荐 开发者
XYNTService 报错 StartServiceCtrlDispatcher Failed, error code = 1063
【10月更文挑战第7天】XYNTService 报错 StartServiceCtrlDispatcher Failed, error code = 1063
282 6
|
12月前
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
1004 0
|
前端开发 网络架构
计算机网络——第一章时延部分深入学习、相关习题及详细解析
计算机网络——第一章时延部分深入学习、相关习题及详细解析
584 0
|
存储 开发框架 前端开发
循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理
循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理