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.text
    except 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 tqdm

urls = [
    "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 tqdm

logging.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 += 1
        else:
            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 爬虫任务中的多种状态监控方式,包括进度、错误和完成情况的监控。在大规模爬取任务中,合理使用这些监控方式可以帮助开发者及时掌握爬虫的运行状态,快速应对异常情况,从而有效保证数据抓取的稳定性和效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows下mysql数据库备份策略

Windows下mysql的增量备份和全量备份,并利用schtasks设置定时任务执行bat脚本。 一、备份要求 序号 备份类型 备份频次 备份时间 1 增量备份 每周一-每周六各一次 18:00:00 2 全量备份 每周日一次 18:00:00 二、备份方法 2.1增量备份 2.1.1准备工作…

代码随想录刷题记录(二十七)——55. 右旋字符串

(一)问题描述 55. 右旋字符串(第八期模拟笔试)https://kamacoder.com/problempage.php?pid1065字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数&…

【React】深入理解 JSX语法

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 深入理解 JSX语法1. JSX 简介2. JSX 的基本语法2.1 基本结构2.2 与普通 JavaScr…

Spring DispatcherServlet 详解

文章目录 一、DispatcherServlet 简介二、DispatcherServlet 的初始化(一)Servlet 容器启动(二)读取配置(三)创建 Web 应用上下文 三、DispatcherServlet 的工作流程(一)接收请求&am…

QCustomPlot添加自定义的图例,实现隐藏、删除功能(二)

文章目录 QCustomPlot初识和基本效果图实现步骤:详细代码示例:实现原理和解释:使用方法:其他参考要实现一个支持复选框来控制曲线显示和隐藏的自定义 QCPLegend 类,可以通过继承 QCPLegend 并重写绘制和事件处理方法来实现,同时发出信号通知曲线的状态变更。 QCustomPl…

区块链应用第1讲:基于区块链的智慧货运平台

基于区块链的智慧货运平台 网络货运平台已经比较成熟,提供了给货源方提供找司机的交易匹配方案;其中包含这几个角色:货主、承运人(司机、车队长)、监管机构、平台。司机要想接单,依赖于多个中心化的第三方平台,且三方平…

基于SpringBoot+Vue实现留守儿童爱心网站

作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…

关于分治法左右区间单调遍历应该如何设计

阅读以下文章,首先至少要求通过一道分治法的题目或听过一道该类型的讲解。 对于分治的题目,想必你应该知道,通常我们是对于一个区间拆分两个部分,而最小子问题通常是只包含一个元素的区间数组。为了后续方便处理更大范围的区间&am…

友思特应用 | 动态捕捉:高光谱相机用于移动产线上的食品检测

导读 高光谱成像技术能够为食品安全助力。以友思特BlackIndustry SWIR 1.7 Max 为代表的高光谱相机,完美解决了移动产线检测的应用难点。 高光谱技术:为食品安全保驾护航 食品安全一直是大众关心的热点话题,提供安全、高质量的食品需要对食…

【论文阅读】医学SAM适配器:适应医学图像分割的任意分割模型

【论文阅读】医学SAM适配器:适应医学图像分割的任意分割模型 文章目录 【论文阅读】医学SAM适配器:适应医学图像分割的任意分割模型一、介绍二、联系工作三、方法四、实验 Medical SAM Adapter: Adapting Segment Anything Model for Medical Image Segm…

数据结构 C/C++(实验一:线性表)

(大家好,今天分享的是数据结构的相关知识,大家可以在评论区进行互动答疑哦~加油!💕) 目录 提要:实验题目 一、实验目的 二、实验内容及要求 三、算法思想 实验1 实验2 四、源程序及注释 …

Oracle 23AI创建示例库

一、示例库介绍 多年来,Oracle 一直使用简单的数据库模式 SCOTT 及其两个突出的表 EMP 和 DEPT,用于文档和培训中的各种示例。但不少小伙伴并不知道如何创建这些示例数据,其实Oracle官方上就有提供对应的方法,本文就带领大家完成…

uniapp组件实现省市区三级联动选择

1.导入插件 先将uni-data-picker组件导入我们的HBuilder项目中&#xff0c;在DCloud插件市场搜索uni-data-picker 点击下载插件并导入到我们的项目中 2.组件调用 curLocation &#xff1a;获取到的当前位置&#xff08;省市区&#xff09; <uni-data-picker v-slot:defa…

九州未来再度入选2024边缘计算TOP100

随着数智化转型的浪潮不断高涨&#xff0c;边缘计算作为推动各行业智能化升级的重要基石&#xff0c;正在成为支持万物智能化的关键点。近日&#xff0c;德本咨询(DBC)联合《互联网周刊》(CIW)与中国社会科学院信息化研究中心(CIS)&#xff0c;共同发布《2024边缘计算TOP100》榜…

Linux指令的基本使用

Linux 的基本使用 一. Linux 的常用指令 1. ls 语法: ls [选项] [目录或文件] 功能: 对于目录&#xff0c;该命令列出该目录下的所有子目录与文件. 对于文件&#xff0c;将列出文件名以及其他信息 常用选项: -a 列出目录下的所有文件, 包括以 . 开头的隐含文件.-d 将目录像…

linux-c 使用c语言操作sqlite3数据库-1

一、练习目标 1、目标 1、使用sqlite3_exec执行查询语句&#xff0c;并将查询结果insert到链表中&#xff0c;最后打印链表的内容&#xff1b; 2、使用sqlite3_get_table执行查询语句&#xff0c;并以key&#xff1a;value的方式&#xff0c;打印查询结果。 2、环境准备 2.1、…

11个简单易用的电商购物车设计案例

文章目录 前言正文1.扁平化设计购物车2.无表格布局购物车3.美食购物车4.响应式购物车5.jQuery购物车6.动态价格更新购物车7.标签式滑动购物车8.动态商店与购物车一体化设计9.简约清爽的购物车设计10.基于Vue.js的购物车11.域名购物车 总结 前言 现在的电子商务网站&#xff0c…

AI绘画到底怎么画,才能出好图!一文详解

前言 在当今数字化的时代&#xff0c;AI 绘画以其强大的创造力和便捷性&#xff0c;成为了众多艺术爱好者和创作者的新宠。无论是专业画家想要拓展创作思路&#xff0c;还是业余爱好者渴望展现自己的创意&#xff0c;AI 绘画都提供了无限的可能。那么&#xff0c;究竟如何才能…

计算机组成原理——计算机的基本组成

1.计算机硬件的基本组成 冯-诺依曼计算机的特点&#xff1a; 1.计算机由运算器&#xff08;ALU&#xff09;、控制器&#xff08;CU&#xff09;、存储器、输入设备、输出设备五个部分组成 2.指令和数据以同等地位存于存储器中&#xff0c;可以通过地址访问 3.指令和数据以二…

【人工智能】ChatGPT多模型感知态识别

目录 ChatGPT辅助细化知识增强&#xff01;一、研究背景二、模型结构和代码任务流程一&#xff1a;启发式生成 三、数据集介绍三、性能展示实现过程运行过程训练过程 ChatGPT辅助细化知识增强&#xff01; 多模态命名实体识别&#xff08;MNER&#xff09;最近引起了广泛关注。…