Python爬虫系列教程之第十二篇:爬虫异常处理与日志记录
大家好,欢迎继续关注本系列爬虫教程!在实际的爬虫项目中,网络请求可能会因为各种原因失败,如连接超时、目标服务器拒绝访问、解析错误等。此外,大规模爬虫任务运行过程中,各种异常情况层出不穷,如何快速定位问题、追踪爬虫运行状态显得尤为重要。本文将介绍如何通过异常处理和日志记录机制,提升爬虫项目的健壮性和可维护性。
1. 为什么需要异常处理与日志记录
- 异常处理:通过捕获异常,避免因单个请求失败导致整个爬虫中断,同时记录错误信息,便于后续分析和修复问题。
- 日志记录:记录爬虫运行的详细过程,包括成功请求、异常信息、警告等,有助于监控爬虫状态、调试问题及性能分析。
2. Python异常处理基础
在 Python 中,使用 try...except...finally 结构可以捕获和处理异常。例如:
try:# 可能出错的代码result = 10 / 0
except ZeroDivisionError as e:# 捕获并处理除零异常print(f"出现错误: {e}")
finally:# 无论是否异常都会执行的代码print("结束处理")
在爬虫中,我们常常需要针对网络请求、数据解析等关键步骤加入异常处理,以确保程序稳定运行。
3. 使用 logging 模块记录日志
Python 内置的 logging 模块非常强大,可以帮助我们将爬虫运行过程中产生的各种信息记录到文件或控制台。常见的日志级别有:
- DEBUG:详细的信息,主要用于调试。
- INFO:常规的信息,记录程序运行过程。
- WARNING:警告信息,表明程序可能存在潜在问题。
- ERROR:错误信息,记录发生异常的情况。
- CRITICAL:严重错误,程序可能无法继续运行。
通过配置 logging.basicConfig,我们可以自定义日志格式、日志级别以及日志输出位置。
4. 实战:集成异常处理与日志记录
下面我们以一个简单的爬虫示例展示如何在网络请求和页面解析中集成异常处理和日志记录。代码中包含详细的中文注释,帮助你理解每一行的作用。
import logging
import requests
from bs4 import BeautifulSoup
import time# 配置日志记录,日志将写入crawler.log文件
logging.basicConfig(level=logging.INFO, # 设置日志级别为INFO及以上format='%(asctime)s - %(levelname)s - %(message)s', # 定义日志格式:时间-级别-信息filename='crawler.log', # 日志输出文件名filemode='w' # 日志文件写入模式:覆盖写入
)def fetch_page(url):"""请求目标网页并返回页面内容若请求过程中发生异常,将记录错误日志并返回None"""headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"}try:# 发送HTTP GET请求,设置超时时间为10秒response = requests.get(url, headers=headers, timeout=10)# 如果响应状态码不是200,将引发异常response.raise_for_status()logging.info(f"成功请求: {url}")return response.textexcept requests.RequestException as e:# 捕获请求异常并记录错误信息logging.error(f"请求失败: {url} - {e}")return Nonedef parse_page(html):"""解析页面内容,提取网页标题若解析过程中发生异常,将记录错误日志并返回None"""try:# 使用lxml解析器解析HTML页面soup = BeautifulSoup(html, 'lxml')# 提取页面标题title = soup.find('title').get_text(strip=True)logging.info(f"成功解析页面标题: {title}")return titleexcept Exception as e:# 捕获解析异常并记录错误logging.error(f"解析页面失败 - {e}")return Nonedef main():# 定义待抓取的URL列表,其中包含一个无效URL以模拟异常urls = ["https://www.example.com","https://www.nonexistentdomain12345.com", # 这个URL将导致请求异常"https://www.python.org"]for url in urls:html = fetch_page(url)if html:title = parse_page(html)if title:logging.info(f"抓取成功: {url} - 标题: {title}")else:logging.warning(f"抓取失败: {url} - 无法解析标题")else:logging.warning(f"抓取失败: {url} - 无响应")# 暂停1秒,模拟爬虫爬取间隔time.sleep(1)if __name__ == '__main__':main()
4.1 代码解析
-
日志配置:
使用logging.basicConfig设置日志级别、格式和输出文件,使得爬虫在运行过程中所有的关键信息都会写入crawler.log文件中。 -
请求处理:
在fetch_page函数中,使用try...except捕获requests.get可能出现的异常,并使用logging.error记录错误信息。请求成功时,则记录成功日志。 -
数据解析:
在parse_page函数中,使用BeautifulSoup解析 HTML 页面,并捕获可能的解析异常。解析成功和失败都会分别记录相应日志。 -
主函数:
遍历多个URL进行抓取和解析,对于每个请求和解析结果,都有详细的日志记录,方便后续问题排查。
5. 小结
在本篇博客中,我们重点讲解了如何在爬虫项目中集成异常处理和日志记录机制。通过使用 Python 内置的异常处理结构和 logging 模块,可以有效提高爬虫的健壮性与可维护性,同时为问题调试提供详尽的日志依据。希望这篇博客能帮助你构建更稳定、更可靠的爬虫项目。
如果你有任何疑问或建议,欢迎在评论区留言讨论!别忘了点赞、收藏并分享给需要的朋友,我们下篇博客再见!
相关文章:
Python爬虫系列教程之第十二篇:爬虫异常处理与日志记录
大家好,欢迎继续关注本系列爬虫教程!在实际的爬虫项目中,网络请求可能会因为各种原因失败,如连接超时、目标服务器拒绝访问、解析错误等。此外,大规模爬虫任务运行过程中,各种异常情况层出不穷,…...
将Google文档导入WordPress:简单实用的几种方法
Google文档是内容创作者非常实用的写作工具。它支持在线编辑、多人协作,并能够自动保存内容。但当我们想把Google文档中的内容导入WordPress网站时,可能会遇到一些小麻烦,比如格式错乱、图片丢失等问题。本文将为大家介绍几种简单实用的方法&…...
大白话实战Gateway
网关功能 网关在分布式系统中起了什么作用?参考下图: 前端想要访问业务访问,就需要知道各个访问的地址,而业务集群服务有很多,前端需要记录非常多的服务器地址,这种情况下,我们需要对整个业务集群做一个整体屏蔽,这个时候就引入Gateway网关,它就是所有服务的请求入…...
深入学习解析:183页可编辑PPT华为市场营销MPR+LTC流程规划方案
华为终端正面临销售模式转型的关键时刻,旨在通过构建MPRLTC项目,以规避对运营商定制的过度依赖,并探索新的增长路径。项目核心在于建设一套全新的销售流程与IT系统,支撑双品牌及自有品牌的战略发展。 项目总体方案聚焦于四大关键议…...
【微中子代理踩坑-前端node-sass安装失败】
微中子代理踩坑-前端node-sass安装失败-windows 1.npm版本2.python2.73.安装Visual Studio 1.npm版本 当前使用node版本13.12.0 2.python2.7 安装python2.7.9并配置环境变量 3.安装Visual Studio 安装Visual Studio 我是直接勾选了3个windows的sdk,然后就好了 最后 npm in…...
使用open-webui+deepseek构建本地AI知识库
序 本文主要研究一下如何使用OpenWebUIdeepseek构建本地AI知识库 步骤 拉取open-webui镜像 docker pull ghcr.io/open-webui/open-webui:maindocker启动 docker run -d -p 3000:8080 \ -e OLLAMA_BASE_URLhttp://host.docker.internal:11434 \ ghcr.io/open-webui/open-we…...
CSS盒模
CSS盒模型就像一个快递包裹,网页上的每个元素都可以看成是这样一个包裹,它主要由以下几个部分组成: 内容(content):就像包裹里真正装的东西,比如文字、图片等。在CSS里,可用width&a…...
【开源向量数据库】Milvus简介
Milvus 是一个开源、高性能、可扩展的向量数据库,专门用于存储和检索高维向量数据。它支持近似最近邻搜索(ANN),适用于图像检索、自然语言处理(NLP)、推荐系统、异常检测等 AI 应用场景。 官网:…...
机器学习笔记——常用损失函数
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本笔记介绍机器学习中常见的损失函数和代价函数,各函数的使用场景。 热门专栏 机器学习 机器学习笔记合集 深度学习 深度学习笔记合集 文章目录 热门…...
Nginx--日志(介绍、配置、日志轮转)
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、Nginx日志介绍 nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的…...
2025 vue3面试题汇总,通俗易懂
一、基础概念与核心特性 1. Vue3 相比 Vue2 的改进(通俗版) 问题:Vue3 比 Vue2 好在哪? 答案: 更快: Proxy 代理:Vue2 的响应式像“逐个监听保险箱”(每个属性单独监听࿰…...
一周学会Flask3 Python Web开发-Debug模式开启
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 默认情况,项目开发是普通模式,也就是你修改了代码,必须重启项目,新代码才生效&…...
聚焦于机器人研究,提出 FuSe 方法,通过语言锚定对通用机器人策略进行微调 视觉、触觉、听觉
聚焦于机器人研究,提出 FuSe 方法,通过语言锚定对通用机器人策略进行微调,利用多模态传感器提升性能,在多种任务中表现优异,具备跨模态推理能力。 研究背景:与世界交互需多感官协作,当前先进通用机器人策略多依赖视觉和本体感受数据训练,忽略其他模态信息。方法:FuSe …...
C++ 无锁队列:原理与实现
引言 在多线程编程中,队列是一种常用的数据结构。传统的队列在多线程环境下访问时,通常需要使用锁机制来保证数据的一致性和线程安全。然而,锁的使用会带来性能开销,尤其是在高并发场景下,频繁的加锁和解锁操作可能成…...
web的分离不分离:前后端分离与不分离全面分析
让我们一起走向未来 🎓作者简介:全栈领域优质创作者 🌐个人主页:百锦再新空间代码工作室 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[1504566…...
MobileSal:极其高效的RGB-D显著性物体检测模型
摘要 问题一:什么叫做MobileSal? MobileSal 是指一种用于移动设备上的显著性检测(Saliency Detection)方法,通常是针对在资源受限的环境(如智能手机)上运行的视觉模型。 问题二:什…...
【个人总结】1. 开发基础 工作三年的嵌入式常见知识点梳理及开发技术要点(欢迎指正、补充)
【个人总结】1. 开发基础 工作三年的嵌入式常见知识点梳理及开发技术要点(欢迎指正、补充) 工作快三年以来 分别进行了嵌入式MCU及外设开发、RTOS、传感器、文件系统及USB、Linux、GUI、通讯协议、毫米波雷达、少量的DSP和物联网开发。 特此总结&#x…...
硬核技术组合!用 DeepSeek R1、Ollama、Docker、RAGFlow 打造专属本地知识库
文章目录 一、引言二、安装Ollama部署DeepSeekR1三、安装Docker四、安装使用RAGFlow4.1 系统架构4.2 部署流程4.3 使用RAGFlow4.4 在RAGFlow中新增模型4.5 创建知识库4.6 创建私人助理使用RGA 一、引言 本地部署DeepSeek R1 Ollama RAGFlow构建个人知识库,通过将…...
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
1.打开MySQL的官网,选择下载(Download) MySQL[这里是图片001]https://www.mysql.com/cn/ 2.往下划点击MySQL Community(GPL)Downloads 3.要下载MySQL的jar包的选择Connector/J 4.进入后,根据自己的需求选择相应的版本 5.下载完成后,进行解压…...
idea 2019.3常用插件
idea 2019.3常用插件 文档 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2019.3常用插件 插件名称插件版本说明1AceJump3.5.9AceJump允许您快速将插入符号导航到编辑器中可见的任何位置。只需按“ctrl;”,键入一个字符,然后在Ace Jump…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)
漏洞概述 漏洞名称:Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号:CVE-2023-25194 CVSS评分:8.8 影响版本:Apache Kafka 2.3.0 - 3.3.2 修复版本:≥ 3.4.0 漏洞类型:反序列化导致的远程代…...
