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.mzph.cn/bicheng/60403.shtml

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

相关文章

Flutter错误: uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared

前言 今天要做蓝牙通信的功能,我使用了flutter_reactive_ble这个库,但是在运行的时候发现一下错误 Launching lib/main.dart on AQM AL10 in debug mode... /Users/macbook/Desktop/test/flutter/my_app/android/app/src/debug/AndroidManifest.xml Err…

除了易我数据恢复,这10个数据恢复软件也能点亮数据找回的希望之光。

易我数据恢复工具具有广泛的系统兼容性,并且里面功能丰富,操作简单,能够完成多种数据恢复操作,是一款比较专业的数据恢复软件。如果大家在为数据丢失而烦恼的话,我可以推荐几款好用的数据恢复软件给大家。 1、福昕数据…

Vue Cli 脚手架目录文件介绍

小试牛刀 //vetur高亮; vuetab 快速生成 <template><div class"box">我是个盒子<button click"fn">按钮</button></div> </template><script> export default {methods:{fn(){alert("Hello Vue")}} …

在公司中,如何表现出自己的高情商,学会这三句话就可以了

在职场中&#xff0c;高情商的重要性不言而喻。它能帮助你更好地处理人际关系&#xff0c;提升团队协作效率&#xff0c;还能让你在职场上获得更多的机会。 在职场中&#xff0c;适时地给予同事、上级和下属赞美、感谢和鼓励&#xff0c;能够拉近彼此的距离&#xff0c;增强团…

cache(五)Write-through,Write-back,Write-allocate,No-write-allocate

这张图总结了缓存系统中写操作策略的不同方法&#xff0c;主要讨论了在**写命中&#xff08;write-hit&#xff09;和写未命中&#xff08;write-miss&#xff09;**情况下应该采取的操作策略。 1. 多个数据副本的存在 缓存系统通常有多个级别&#xff0c;例如 L1 缓存、L2 缓…

商品规格递归拼接

创建实体类 Data public class Shopping {private String name;private List<String> children; } 测试 public static void main(String[] args) {ArrayList<Shopping> shoppings new ArrayList<>();Shopping shopping new Shopping();shopping.setName…

大模型基础: 从零开始训练一个最小化的Transformer聊天机器人

这里将介绍如何从零开始&#xff0c;使用Transformer模型训练一个最小化的聊天机器人。该流程将尽量简化&#xff0c;不依赖预训练模型&#xff0c;并手动实现关键步骤&#xff0c;确保每一步都容易理解。 1. 环境准备 首先&#xff0c;确保安装了必要的Python库。我们只需要基…

推荐一款3D建模软件:Agisoft Metashape Pro

Agisoft Metashape Pro是一款强大的多视点三维建模设计辅助软件&#xff0c;Agisoft Metashape是一款独立的软件产品&#xff0c;可对数字图像进行摄影测量处理&#xff0c;并生成3D空间数据&#xff0c;用于GIS应用&#xff0c;文化遗产文档和视觉效果制作&#xff0c;以及间接…

Docker--Docker是什么和对Docker的了解

Docker 的本质 Docker的本质是LXC&#xff08;Linux容器&#xff09;之类的增强版&#xff0c;它本身不是容器&#xff0c;而是容器的易用工具。 Docker通过虚拟化技术&#xff0c;将代码、依赖项和运行环境打包成一个容器&#xff0c;并利用隔离机制来使得容器之间互相独立、…

前端请求后端php接口跨域 cors问题

只需要后端在网站的入口文件 一般都是 index.php 加上 这几行代码就可以了 具体的参数可以根据需要去修改 header("Access-Control-Allow-Origin: *"); header(Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS); header(Access-Control-Allow-Heade…

Wi-Fi背后的工作原理与技术发展历程介绍【无线通信小百科】

1个视频说清楚WIFI&#xff1a;频段/历程/技术参数/常用模块 智能手机拥有率越来越高的今天&#xff0c;大家已经习惯了通过无线网络上网的方式。除了在外面需要用手机流量&#xff0c;我们通常在家里或者机场&#xff0c;商场都可以通过Wi-Fi连接上网。本期文章将为大家介绍Wi…

HTMLCSS: 日落卡片

效果演示 这段代码创建了一个包含日落图像和文本的美观卡片&#xff0c;使用了现代CSS背景模糊和渐变&#xff0c;以及SVG图形来增强视觉效果。 HTML <div class"card"><div class"card__content"><div class"card-details">…

sealos部署K8s,安装docker时master节点突然NotReady

1、集群正常运行中&#xff0c;在集群master-1上安装了dockerharbor&#xff0c;却发现master-1节点NotReady&#xff0c;使用的网络插件为 Cilium #安装docker和harbor&#xff08;docker运行正常&#xff09; rootmaster-1:/etc/apt# apt install docker-ce5:19.03.15~3-0~u…

latex快速入门(附计算机学报latex模板链接

对于一些概念的解释&#xff0c;最后附计算机学报模板 LaTeX入门 什么是latex&#xff08;不标准的理解&#xff0c;但可以快速入门&#xff09;最开始的工作流LaTeX的扩展版本PdfLaTeXXeLaTeX LaTeX编辑器 计算机学报模板 什么是latex&#xff08;不标准的理解&#xff0c;但…

【stablediffusion】ComfyUI | 恐怖如斯的放大模型DifFBIR,超分辨率放大、人脸修复、图像去噪 | 效果炸裂 | 强烈推荐

今天&#xff0c;我们将向您介绍一款令人兴奋的更新——Stable Diffusion的ComfyUI放大模型DifFBIR。这是一款基于Stable Diffusion技术的AI绘画工具&#xff0c;旨在为您提供一键式图像放大的便捷体验。无论您是AI绘画的新手还是专业人士&#xff0c;这个工具都能为您带来极大…

向量数据库PGVECTOR安装

文章目录 前提向量数据库介绍PGVECTOR安装1、pgvector下载2、编译安装3、创建vector扩展 前提 已经安装好了pg14版本。 其他版本也可以。 pg安装教程&#xff1a;https://blog.csdn.net/yushaoyyds/article/details/138855306?spm1001.2014.3001.5502 向量数据库介绍 向量数…

Elasticsearch集群和Kibana部署流程

搭建Elasticsearch集群 1. 进入Elasticsearch官网下载页面&#xff0c;下载Elasticsearch 在如下页面选择Elasticsearch版本&#xff0c;点击download按钮&#xff0c;进入下载页面 右键选择自己操作系统对应的版本&#xff0c;复制下载链接 然后通过wget命令下载Elastics…

Vue3 之 provide 和 inject:组件间通信的神奇利器

provide和inject 1.概述 在 Vue 3 中&#xff0c;provide和inject是用于组件之间进行深层次数据传递的一对组合。它们可以跨越多个组件层级来共享数据&#xff0c;而不需要通过层层传递props的方式。 2.provide 的使用 基本语法&#xff1a;在组件的setup函数或者Compositi…

Spring——容器:IoC

容器&#xff1a;IoC IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容器来…

uniapp—android原生插件开发(4uniapp引用aar插件)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 一、将android程序打包成aar插件包 直接使…