Python 爬虫运行状态监控:进度、错误与完成情况

Python 爬虫运行状态监控:进度、错误与完成情况

在进行大规模数据爬取时,监控爬虫的运行状态至关重要。通过实时监控,可以了解爬虫的工作进度、出现的错误以及任务完成情况。这样可以及时发现并解决问题,确保数据抓取任务顺利进行。本文将详细介绍如何使用 Python 实现爬虫的状态监控,包括进度、错误与完成情况的监控方法。

在这里插入图片描述

1. 为什么要监控爬虫运行状态?

在网络爬虫任务中,监控能够帮助我们做到以下几点:

  1. 确保任务完成:通过进度监控,我们可以了解爬取进度,预测完成时间。
  2. 及时发现错误:监控错误有助于排查异常(如网络超时、访问限制等),并及时处理。
  3. 资源管理:监控运行状态可以帮助我们合理安排系统资源,防止因过度占用导致崩溃。

通常,我们希望监控以下几方面的内容:

  • 进度:已完成的任务数量、总任务数量。
  • 错误情况:错误类型、错误次数。
  • 完成状态:任务是否全部完成,是否有失败的任务。

接下来,我们将介绍在 Python 爬虫中如何实现这些监控功能。

2. 使用进度条监控爬取进度

在爬虫中,查看进度最直接的方法就是显示一个进度条。Python 提供了许多工具可以轻松实现进度条,其中 tqdm 是一个很受欢迎的库。

示例:使用 tqdm 显示进度条

以下示例展示了如何使用 tqdm 库在爬虫任务中显示进度条。

import requests
from tqdm import tqdm# 待爬取的 URL 列表
urls = ["https://example.com/page1","https://example.com/page2","https://example.com/page3",# 其他 URL
]# 进度条监控
for url in tqdm(urls, desc="爬取进度"):try:response = requests.get(url)# 假设我们对页面内容进行某些处理content = response.textexcept Exception as e:print(f"请求 {url} 时出错:{e}")

进度条的优缺点

  • 优点:实现简单直观,适合小规模爬虫任务,实时显示任务进度。
  • 缺点:只能显示基本的完成情况,对于错误和完成状态等信息需要结合其他方法实现。

3. 日志记录:监控错误和成功状态

爬虫任务中,错误和异常情况是不可避免的。日志记录是一种非常实用的监控方式,可以帮助我们记录每个请求的状态,包括成功请求和失败的错误类型。

Python 的 logging 模块可以帮助我们记录详细的日志信息,包括错误、警告和完成情况。

示例:使用 logging 记录爬虫运行日志

以下代码展示了如何使用 logging 模块记录爬虫日志,包括成功和失败的情况。

import logging
import requests# 配置日志记录
logging.basicConfig(filename="spider.log",level=logging.INFO,format="%(asctime)s - %(levelname)s - %(message)s"
)# URL 列表
urls = ["https://example.com/page1","https://example.com/page2","https://example.com/page3",
]# 抓取过程
for url in urls:try:response = requests.get(url)if response.status_code == 200:logging.info(f"成功抓取 {url}")else:logging.warning(f"请求 {url} 返回非 200 状态码:{response.status_code}")except requests.RequestException as e:logging.error(f"请求 {url} 时出错:{e}")

日志的优缺点

  • 优点:可以详细记录请求状态,保留运行记录,方便后期排查问题。
  • 缺点:日志内容较多时,需定期清理日志文件;无法直接显示实时进度。

4. 数据库记录与状态监控

对于复杂爬虫项目,可能需要更加精细的监控。可以将每次爬取的状态信息(如 URL、状态码、错误等)保存到数据库中,以便后续分析。

示例:使用 SQLite 记录爬虫状态

以下示例展示了如何将每个 URL 的爬取状态保存到 SQLite 数据库中。

import sqlite3
import requests# 初始化数据库
conn = sqlite3.connect("spider_status.db")
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS crawl_status (url TEXT PRIMARY KEY,status_code INTEGER,error_message TEXT)''')urls = ["https://example.com/page1","https://example.com/page2","https://example.com/page3",
]# 抓取并记录状态
for url in urls:try:response = requests.get(url)cursor.execute("INSERT OR REPLACE INTO crawl_status (url, status_code) VALUES (?, ?)", (url, response.status_code))except requests.RequestException as e:cursor.execute("INSERT OR REPLACE INTO crawl_status (url, error_message) VALUES (?, ?)", (url, str(e)))conn.commit()
conn.close()

数据库记录的优缺点

  • 优点:便于数据持久化,适合长期、批量分析数据。
  • 缺点:实现较复杂,需额外存储空间。

5. 异步爬虫的状态监控

在异步爬虫中(如使用 asyncioaiohttp),由于请求是并发的,可能无法像同步爬虫那样顺序输出日志。为了记录并发状态,可以使用异步日志库(如 aiologger)或者存储数据库来记录每个请求的状态。

示例:使用 asynciotqdm 显示异步进度条

以下示例展示了如何结合 asyncioaiohttptqdm 实现异步爬虫的状态监控。

import aiohttp
import asyncio
from tqdm.asyncio import tqdmurls = ["https://example.com/page1","https://example.com/page2","https://example.com/page3",
]async def fetch(session, url):try:async with session.get(url) as response:if response.status == 200:print(f"成功抓取 {url}")else:print(f"请求 {url} 返回非 200 状态码:{response.status}")except Exception as e:print(f"请求 {url} 时出错:{e}")async def main():async with aiohttp.ClientSession() as session:tasks = [fetch(session, url) for url in urls]for task in tqdm(asyncio.as_completed(tasks), total=len(urls), desc="爬取进度"):await task# 运行异步爬虫
asyncio.run(main())

异步爬虫的优缺点

  • 优点:支持高并发,适合大规模网络请求的爬虫任务。
  • 缺点:调试较复杂,需对异步编程有一定了解。

6. 监控爬虫的整体状态

为了进一步监控爬虫任务的整体状态,可以使用定时器守护进程定期检查爬虫运行情况,将结果汇总到监控系统中,例如:

  1. 进度监控:每隔一段时间统计完成的任务数和总任务数,计算完成比例。
  2. 错误统计:定期统计每种错误的发生次数,发现高频错误并分析原因。
  3. 实时监控系统:结合第三方监控工具(如 Grafana、Prometheus)实时分析和展示爬虫状态。

以下是通过定时任务定期检查进度和错误的示例:

import time
import requests
import logging
from tqdm import tqdmlogging.basicConfig(level=logging.INFO)# 待爬取的 URL 列表
urls = ["https://example.com/page1", "https://example.com/page2"]# 定义变量统计完成情况
completed_count = 0
total_count = len(urls)
errors = []# 抓取过程
for url in tqdm(urls, desc="爬取进度"):try:response = requests.get(url)if response.status_code == 200:completed_count += 1else:errors.append((url, response.status_code))logging.warning(f"请求 {url} 返回非 200 状态码:{response.status_code}")except requests.RequestException as e:errors.append((url, str(e)))logging.error(f"请求 {url} 时出错:{e}")print(f"\n已完成 {completed_count}/{total_count}")
if errors:print(f"出现 {len(errors)} 个错误")

总结

本文介绍了 Python 爬虫任务中的多种状态监控方式,包括进度、错误和完成情况的监控。在大规模爬取任务中,合理使用这些监控方式可以帮助开发者及时掌握爬虫的运行状态,快速应对异常情况,从而有效保证数据抓取的稳定性和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12057.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

内核tracepoint的注册回调及添加的方法

一、背景 内核开发时往往需要做一些内核态函数的监测或者内核状态的监测,就需要用一些调试手段来观测。常用的内核态的观测如kprobe和tracepoint,但是kprobe往往受制于一些系统的限制,很多系统并没有打开kprobe选项,这样我们不能…

全网最详细的自动化测试(Jenkins 篇)

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的,可扩展的关键字驱动的自动化测试框架。 …

区块链技术在知识产权保护中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 区块链技术在知识产权保护中的应用 区块链技术在知识产权保护中的应用 区块链技术在知识产权保护中的应用 引言 区块链技术概述 …

项目管理中不可或缺的能力

在现代企业中,项目管理是一项至关重要的能力。项目管理需要具备的能力包括:有效的沟通能力、团队协作能力、时间管理能力、风险管理能力、以及问题解决能力。 其中,有效的沟通能力尤为重要,它不仅涉及到信息的传递,还包…

HCIP快速生成树 RSTP

STP(Spanning Tree Protocol,生成树协议)和RSTP(Rapid Spanning Tree Protocol,快速生成树协议)都是用于在局域网中消除环路的网络协议。 STP(生成树协议) 基本概念: ST…

YOLOv11实战PCB电路板缺陷识别

本文采用YOLOv11作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv11以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对PCB电路板缺陷数据集进行训练和优化,该数据集包含丰富的PCB电路板…

把握鸿蒙生态崛起的机遇:开发者视角的探讨

​ 大家好,我是程序员小羊! 前言: 近年来,鸿蒙系统(HarmonyOS)的发展备受瞩目。随着其在智能手机、智能穿戴、车载系统和智能家居等领域的广泛应用,鸿蒙系统正逐渐形成与安卓、iOS并列的三足鼎立…

丹摩征文活动|FLUX.1+ComfyUI高效部署策略与实践

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 丹摩征文 1. FLUX.1简介2. 部署流程创建资源登录实例部署ComfyUI部署FLUX.1 3. 使用流程运行FLUX.1 4. 导入工作流5. 实践感想 前言&#xf…

ChanCMS:牛气的开源cms,帮助我们打造个性化内容管理系统的利器,一款功能强大的开源CMS系统

嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 ChanCMS是一个基于Java的开源内容管理系统,它采用Spring Boot框架进行开发,具有良好的模块化和扩展性。通过ChanCMS&#xff0…

《怪物猎人:世界》风灵月影修改器功能说明以及使用说明

《怪物猎人:世界》风灵月影修改器能调整游戏数据,如按1键获无限生命,2键开启无敌/无视伤害,3键享无限体力,Ctrl1组合键编辑金钱等,助力玩家轻松通关。为提升您的游戏体验! 修改器安装: https:/…

Python从0到100(七十一):Python OpenCV-OpenCV进行红绿灯识别

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

远程桌面报错-用户账户限制(例如,时间限制)会阻止你登录。

Windows远程时报错 远程桌面报错-用户账户限制(例如,时间限制)会阻止你登录。 原因是被远程的系统用户密码为空,且默认只允许空白密码的本地账户登录。 登录被远程的系统,WinR输入secpol.msc 然后按照 本地策略-安全选…

Vue CLI 脚手架工程化开发

文章目录 一、生命周期二、工程化开发1. 脚手架介绍2. 使用步骤3. 目录文件介绍4. 组件化开发5. 普通组件的注册5.1 局部注册5.2 全局注册 三、页面开发思路 一、生命周期 Vue 的生命周期:一个 Vue 实例从创建到销毁的整个过程,new Vue() 创建实例&…

Oracle OCP认证考试考点详解082系列18

题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 86. 第86题: 题目 解析及答案: 关于自连接,以下哪三个陈述是正确的? A. 它可以是外连接。…

【Android开发】新建虚拟机并运行虚拟机和ADB调试

一、新建虚拟机 在软件首页点击如图所示按钮: 点击添加虚拟机 在左侧分类选择手机,之后选择对应机型。一般选的机型分辨率不用太高,最后点击“Next” 选择虚拟机中的Android系统版本 设置虚拟机名称,注意,此处名称不…

文本批量处理不求人:化繁为简全攻略 (系列一)

在日常工作中,我们经常需要对一些文本文档进行批量操作或者对某一个文档进行繁琐操作,虽然windows系统自带的记事本自带批量替换修改内容的功能,但仅这一个功能往往不够,比如以下一些场景,用记事本就很难实现我们的目标…

智能电动机保护器在提升塑料制品厂电机稳定性中的应用

徐悦 安科瑞电气股份有限公司 在塑料制品生产过程中,电动机的高频启动、长时间连续运行和负载波动增加了电动机故障的风险,对电动机保护提出了高要求。本文从技术角度深入分析了 ARD2F 智能电动机保护器的应用原理,研究其在塑料制品厂不同生…

Unity学习笔记(3):场景绘制和叠层设置 Tilemap

文章目录 前言开发环境规则瓦片绘制拐角 动态瓦片总结 前言 这里学一下后面的场景绘制和叠层技巧。 开发环境 Unity 6windows 11vs studio 2022Unity2022.2 最新教程《勇士传说》入门到进阶|4K:https://www.bilibili.com/video/BV1mL411o77x/?spm_id_from333.10…

mysql利用.ibd文件恢复数据

1、停止原mysql数据库服务,备份原来的.ibd文件。(如果本身无法启动的mysql则无需此操作) 2、在目标MySQL数据库中创建一张新表,表结构与原表结构一致。确保新表的表结构与.ibd文件中的数据结构一致。--此步骤可以导入之前的备份s…

新手 Vue 项目运行

前言:前面讲了我们已经将spingboot项目运行起来了,现在我们只需将后台管理的Vue项目运行起来即可完成整个项目。 在运行vue项目之前,请先运行springboot项目,运行步骤请看:运行Springboot Vue 项目_springbootvue项目…