当前位置: 首页 > news >正文

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 应用场景。 官网&#xff1a…...

机器学习笔记——常用损失函数

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本笔记介绍机器学习中常见的损失函数和代价函数,各函数的使用场景。 热门专栏 机器学习 机器学习笔记合集 深度学习 深度学习笔记合集 文章目录 热门…...

Nginx--日志(介绍、配置、日志轮转)

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、Nginx日志介绍 nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的…...

2025 vue3面试题汇总,通俗易懂

一、基础概念与核心特性 1. Vue3 相比 Vue2 的改进(通俗版) 问题:Vue3 比 Vue2 好在哪? 答案: 更快: Proxy 代理:Vue2 的响应式像“逐个监听保险箱”(每个属性单独监听&#xff0…...

一周学会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…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

Robots.txt 文件

什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

AI,如何重构理解、匹配与决策?

AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

深度学习水论文:mamba+图像增强

🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...