当前位置: 首页 > 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.text
    except requests.RequestException as e:
        # 捕获请求异常并记录错误信息
        logging.error(f"请求失败: {url} - {e}")
        return None

def parse_page(html):
    """
    解析页面内容,提取网页标题
    若解析过程中发生异常,将记录错误日志并返回None
    """
    try:
        # 使用lxml解析器解析HTML页面
        soup = BeautifulSoup(html, 'lxml')
        # 提取页面标题
        title = soup.find('title').get_text(strip=True)
        logging.info(f"成功解析页面标题: {title}")
        return title
    except Exception as e:
        # 捕获解析异常并记录错误
        logging.error(f"解析页面失败 - {e}")
        return None

def 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 模块,可以有效提高爬虫的健壮性与可维护性,同时为问题调试提供详尽的日志依据。希望这篇博客能帮助你构建更稳定、更可靠的爬虫项目。

如果你有任何疑问或建议,欢迎在评论区留言讨论!别忘了点赞、收藏并分享给需要的朋友,我们下篇博客再见!


文章转载自:

http://kT0l9oou.Lmqfq.cn
http://7dUH3MVH.Lmqfq.cn
http://xCsyxRAo.Lmqfq.cn
http://xDYKm64X.Lmqfq.cn
http://0oFJ9k0p.Lmqfq.cn
http://hxOKlGt0.Lmqfq.cn
http://lbk7LnmN.Lmqfq.cn
http://OlHbXURt.Lmqfq.cn
http://QeKbTgL4.Lmqfq.cn
http://zvyrO8HQ.Lmqfq.cn
http://Wkqc7Dtr.Lmqfq.cn
http://VAz89o2R.Lmqfq.cn
http://jjgyGbDv.Lmqfq.cn
http://f4klHeZs.Lmqfq.cn
http://5Bwx1gB3.Lmqfq.cn
http://Ae8joqHF.Lmqfq.cn
http://2GFr9G48.Lmqfq.cn
http://zeCSSogP.Lmqfq.cn
http://FL9Qw1k3.Lmqfq.cn
http://bQ218pcO.Lmqfq.cn
http://Jt8WiFD8.Lmqfq.cn
http://JBmJbq6Z.Lmqfq.cn
http://bGxQFLDW.Lmqfq.cn
http://l6JbNYId.Lmqfq.cn
http://s811w7v8.Lmqfq.cn
http://erVGI9hC.Lmqfq.cn
http://8UG8SYNn.Lmqfq.cn
http://HGSpwyet.Lmqfq.cn
http://R0iZAdPG.Lmqfq.cn
http://kyYa7STK.Lmqfq.cn
http://www.dtcms.com/a/28863.html

相关文章:

  • 14、《SpringBoot+MyBatis集成(2)——进阶配置XML与注解的灵活运用》
  • 25年2月通信基础知识补充:多普勒频移与多普勒扩展、3GPP TDL信道模型
  • 使用JWT实现微服务鉴权
  • HbuilderX如何运行到手机模拟器,安卓模拟器
  • 玩机日记 12 群晖部署AList并配置SSL,安装opkg,使用rclone挂载到本地
  • 使用 OpenTelemetry 和 Langtrace 的 Elastic 分发跟踪基于 RAG 的聊天机器人
  • 【Next.js App Router 深度解剖手册】
  • C++项目:高并发内存池_上
  • Docker构建时,设定默认进入的工作目录的方法
  • 1、FreeRTOS基础知识
  • 用户体验测试
  • unity学习50:NavMeshAgent 区域Areas和cost
  • 鸿蒙NEXT开发-应用数据持久化之关系型数据库
  • cenos 安装 /usr/local/nginx/sbin/nginx这个路径的nginx
  • 微信小程序(uni)+蓝牙连接+Xprint打印机实现打印功能
  • Windows ARM工控主板支持EC200A系列4G模块
  • 向量的点乘的几何意义
  • unity学习45:Animator 的动画层layer
  • SpringBoot整合Redis和Redision锁
  • 多任务(20250210)
  • 计算机网络之TCP的可靠传输
  • 大数据技术之HBase操作归纳
  • uniapp 安卓端 使用axios 和 renderjs 上传 FormData 参数
  • 深入浅出GraphQL:现代API设计的未来
  • C转C++
  • python小项目编程-初级(5、词频统计,6、简单得闹钟)
  • 巧用GitHub的CICD功能免费打包部署前端项目
  • 易基因: ChIP-seq+DRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR
  • 【黑马点评】——相关文章汇总(包括实现,优化,测试和面经总结)
  • 亚马逊新规木炭/火柴/打火机政策SOR/2016-178/182/187标准检测流程: