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.rhkb.cn/news/469048.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Marin说PCB之1000-BASE-T1的PCB设计总结--01

上周末小编我从耶路撒冷出差回来,从浦东机场回来的路上和司机师傅聊了一会天,司机师傅说小伙子喜欢看脱口秀不?我说挺喜欢的,之前还看过上海这边的周立波的海派脱口秀呢,我记得还有一个综艺节目叫做一周立波秀&#xf…

[大模型]视频生成-Sora简析

参考资料: Sora技术报告https://openai.com/index/video-generation-models-as-world-simulators/4分钟详细揭密!Sora视频生成模型原理https://www.bilibili.com/video/BV1AW421K7Ut 一、概述 相较于Gen-2、Stable Diffusion、Pika等生成模型的前辈&am…

Prompt Engineering 提示工程

一、什么是提示工程(Prompt Engineering) Prompt 就是发给大模型的指令,比如讲个笑话、用 Python 编个贪吃蛇游戏等;大模型只接受一种输入,那就是 prompt。本质上,所有大模型相关的工程工作,都是…

python爬虫指南——初学者避坑篇

目录 Python爬虫初学者学习指南一、学习方向二、Python爬虫知识点总结三、具体知识点详解和实现步骤1. HTTP请求和HTML解析2. 正则表达式提取数据3. 动态内容爬取4. 数据存储5. 反爬虫应对措施 四、完整案例:爬取京东商品信息1. 导入库和设置基本信息2. 获取网页内容…

微搭低代码入门01变量

目录 1 变量的定义2 变量的赋值3 变量的类型4 算术运算符5 字符串的连接6 模板字符串7 检查变量的类型8 解构赋值8.1 数组的解构赋值8.2 对象的解构赋值 9 类型转换9.1 转换为字符串9.2 转换为数字9.3 转换为布尔值 总结 好些零基础的同学,在使用低代码的时候&#…

FPGA学习笔记#5 Vitis HLS For循环的优化(1)

本笔记使用的Vitis HLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,主要根据教程:跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习 从这一篇开始正式进入HLS对C代码的优化笔记 学习笔记:《…

每日OJ题_牛客_JZ38字符串的排列_DFS_C++_Java

目录 牛客_JZ38字符串的排列_DFS 题目解析 C代码 Java代码 牛客_JZ38字符串的排列_DFS 字符串的排列_牛客题霸_牛客网 描述: 输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。 例如输入…

markdown常用语法

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

CSS教程(二)- CSS选择器

1. 作用 匹配文档中的某些元素为其应用样式。根据不同需求把不同的标签选出来。 2. 分类 分类 基础选择器 包含 标签选择器、ID选择器、类选择器、通用选择器等 复合选择器 包含 后代选择器、子代选择器、伪类选择器等 1 标签选择器 介绍 又称为元素选择器,根…

第二十周学习周报

目录 摘要abstractTheory behind GANGAN训练目标GAN训练技巧 总结 摘要 本周的学习内容是GAN的基本理论,在训练GAN的时候,Generator的目标是希望生成的数据与真实的数据越相似越好,而Discriminator的目标是尽量将生成的数据与真实的数据区分…

2024年CRM系统对比:国内外十大CRM热门选择

在数字化转型的大潮中,CRM系统是企业提升客户关系管理、优化销售流程的重要工具。本文将从系统功能、优势、劣势、总体评价四个方面,对2024年国内外十大热门CRM系统进行全方位对比,帮助企业找到最适合的CRM解决方案。 1.纷享销客CRM 系统功…

VideoChat:开源的数字人实时对话系统,支持自定义数字人的形象和音色

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…

[CKS] TLS Secrets创建与挂载

目前的所有题目为2024年10月后更新的最新题库,考试的k8s版本为1.31.1 BackGround 您必须使用存储在TLS Secret中的SSL文件,来保护Web 服务器的安全访问。 Task 在clever-cactus namespace中为名为clever-cactus的现有Deployment创建名为clever-cactu…

使用 wxPython 开发 Python 桌面应用程序的完整教程

使用 wxPython 开发 Python 桌面应用程序的完整教程 引言 在当今的软件开发领域,桌面应用程序仍然占据着重要的位置。Python 作为一种灵活且易于学习的编程语言,结合 wxPython 库,可以快速构建跨平台的桌面应用程序。本文将深入探讨 wxPyth…

自动驾驶系列—自动驾驶环境感知:Radar数据的应用与实践

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

DimensionX:从单张图片生成高度逼真的 3D 和 4D 场景

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…

蓝桥杯备考——算法

一、排序 冒泡排序、选择排序、插入排序、 快速排序、归并排序、桶排序 二、枚举 三、二分查找与二分答案 四、搜索(DFS) DFS(DFS基础、回溯、剪枝、记忆化) 1.DFS算法(深度优先搜索算法) 深度优先搜…

【网络面试篇】其他面试题——Cookie、Session、DNS、CDN、SSL/TLS、加密概念

目录 一、HTTP 相关问题 1. Cookie 和 Session 是什么? (1)Cookie (2)Session 2. Cookie 的工作原理? 3. Session 的工作原理? 4. Cookie 和 Session 有什么区别? 二、其他问…

隧道论文阅读2-采用无人融合扫描数据的基于深度学习的垂直型隧道三维数字损伤图

目前存在的问题: 需要开发新的无人测量系统测量垂直隧道图像数据量巨大,基于深度学习完成损伤评估跟踪获取图像位置的困难,对大型基础设施感兴趣区域(roi)的2d和3d地图建立进行了研究,对整个目标结构的损伤定位仍然具有挑战性。为…

CCF-A类 HPCA 2025 重磅揭晓:录取数据公布

近日,第31届国际计算机体系结构领域顶级会议HPCA (International Symposium on High Performance Computer Architecture) 正式发布了2025年会议的录用通知!本届会议共收到了534 篇提交论文,其中,112篇论文被接收,整体…