Haskell爬虫中日志记录:监控HTTP请求与响应

news2024/9/20 9:36:22

00449.png
在当今信息爆炸的时代,数据抓取成为了获取信息的重要手段。Haskell,以其强大的类型系统和函数式编程特性,成为了编写高效、可靠爬虫的理想选择。然而,随着爬虫的运行,监控其行为变得尤为重要。本文将探讨如何在Haskell编写的爬虫中实现日志记录,以监控HTTP请求与响应。

爬虫与日志记录

爬虫是一种自动浏览网络资源的程序,它可以访问网页、下载内容、提取信息,并将其存储起来。然而,爬虫在运行过程中可能会遇到各种问题,如网络错误、服务器拒绝连接、内容格式变化等。有效的日志记录可以帮助开发者:

  • 监控爬虫状态:了解爬虫何时运行,以及其运行状态。
  • 调试问题:快速定位运行中的错误和异常。
  • 遵守政策:记录遵守robots.txt协议的情况,确保爬虫行为合规。
  • 分析效率:评估爬虫的性能和资源消耗。

Haskell日志记录工具

Haskell社区提供了多种日志记录解决方案,其中log包是一个流行的选择。它基于monad-logger库,支持多种日志级别和灵活的日志处理。
相关日志记录过程如下:
集成monad-logger
首先,需要在项目的.cabal文件中添加monad-loggerlog包的依赖:
日志记录器
使用monad-logger,可以定义一个日志记录器,它将被用于记录HTTP请求和响应:
记录HTTP请求和响应
在爬虫中,每个HTTP请求和响应都应被记录。这可以通过包装HTTP请求函数来实现:
记录HTTP响应状态
对于每个响应,记录其状态码和可能的错误信息:
实现日志后端
日志可以输出到控制台、文件或通过网络发送到日志服务器。以下是一个简单的控制台日志后端实现:
集成到爬虫主函数
将日志记录集成到爬虫的主函数中,确保所有HTTP交互都被记录:

代码实现

以下是本文中提到的Haskell爬虫日志记录的完整实现代码:

{-# LANGUAGE OverloadedStrings #-}
import Control.Monad.Logger
import Network.HTTP.Conduit
import Data.ByteString.Lazy.Char8 (ByteString)
import System.Log.Handler.Simple
import System.Log.Formatter

-- 定义日志记录器
logHttpInfo :: (MonadLogger m) => String -> m ()
logHttpInfo msg = liftLoc (loc "HTTP" "Info") $ logInfo msg

-- 代理设置
proxyInfo :: Proxy
proxyInfo = Proxy
    { proxyHost = "www.16yun.cn"
    , proxyPort = fromIntegral $ read "5445"  -- 确保端口号是整数
    , proxyUser = "16QMSOML"
    , proxyPass = "280651"
    }

-- 记录HTTP请求
logHttpRequest :: (MonadLogger m) => String -> m ByteString
logHttpRequest url = do
    logHttpInfo $ "Requesting URL: " ++ url
    response <- httpLbs (fromJust $ parseRequest_ url) { managerProxy = Just proxyInfo } manager
    logHttpResponse $ responseStatus response
    return $ responseBody response
  where
    manager = newManager defaultManagerSettings

-- 记录HTTP响应
logHttpResponse :: (MonadLogger m) => Status -> m ()
logHttpResponse status = do
    case status of
        (Status 200 _) -> logHttpInfo "Success"
        _               -> logHttpInfo $ "Error status: " ++ show status

-- 创建日志处理器
createLogger :: IO Logger
createLogger = newLogger >>= \lgr -> return $ setLevel lgr DEBUG

-- 设置日志格式
setLogFormatter :: Logger -> IO Logger
setLogFormatter logger = do
    let fmt = simpleLogFormatter "$time $msg"
    return $ setFormatter logger fmt

-- 爬虫主函数
main :: IO ()
main = do
    logger <- liftIO createLogger
    runLoggingT (mapM logHttpRequest urls) (setLogFormatter logger)
  where
    urls = ["http://www.example.com", "http://www.example.org"]

结论

通过本文的介绍,我们了解到在Haskell编写的爬虫中实现日志记录的重要性和方法。日志记录不仅可以帮助开发者监控爬虫的行为,还可以在出现问题时提供调试信息。使用monad-loggerlog包,我们可以轻松地在Haskell中实现灵活且强大的日志记录系统。

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

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

相关文章

ROS2从入门到精通2-4:Rviz2插件制作案例(以工具栏和多点导航插件为例)

目录 0 专栏介绍1 Rviz2插件2 项目配置3 案例一&#xff1a;工具栏插件4 案例二&#xff1a;多点导航插件5 综合演示5.1 添加插件5.2 多点巡航 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS2进行实…

企业图纸防泄密的最佳方案,10款好用的图纸加密软件排行榜

在数字化时代&#xff0c;企业的图纸文件往往包含了极其重要的知识产权和技术秘密&#xff0c;因此保护这些图纸的安全至关重要。有效的图纸加密不仅能防止未授权访问&#xff0c;还能确保图纸在内外部流转过程中的完整性与安全性。本文将介绍十款2024年市场上评价较高的图纸加…

基于Mysql的商业辅助决策系统的设计与实现

TOC springboot295基于Mysql的商业辅助决策系统的设计与实现 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们…

零-STM32与嵌入式

目录 一、嵌入式概述 二、微控制器的关系 三、STM32的学习原因 四、STM32的应用领域 五、STM32的就业前景 六、STM32开发方式 (1) 寄存器开发&#xff08;自己做饭&#xff0c;自己吃&#xff09; (2) 函数库开发&#xff08;别人做饭&#xff0c;自己吃&#xff09; …

喜报 亚信安全再次入选湖北省网络安全应急技术支撑单位

近日&#xff0c;中共湖北省委网络安全和信息化委员会办公室和国家计算机网络应急技术处理协调中心湖北分中心公布了《关于开展第二届湖北省网络安全应急技术支撑单位评选工作的通知》&#xff0c;亚信安全凭优秀的产品技术实力和丰富的安全服务实践经验&#xff0c;连续两届成…

调研适合c++训练和部署的框架

目录 1. caffe 2. TensorFlow 3. Pytorch 4. PaddlePaddle 5. darknet 1. caffe GitHub - BVLC/caffe: Caffe: a fast open framework for deep learning. Caffe (Convolutional Architecture for Fast Feature Embedding) Caffe是一个早期流行的深度学习框架&#xff0…

GreptimeDB融资数百万美元; Oracle提供免费长期MySQL; 谷歌大模型支持云数据库问题洞察

重要更新 1. 开源时序数据库 GreptimeDB宣布完成数百万美元的新一轮融资。GreptimeDB是一款Rust 语言编写的时序数据库&#xff0c;具有分布式&#xff0c;开源&#xff0c;云原生&#xff0c;兼容性强等特点&#xff0c;帮助企业实时读写、处理和分析时序数据的同时&#xff0…

Linux设备驱动——模块的构造、运行与设计 与众不同的hello world与点灯

编写一个Linux下的设备驱动&#xff0c;首先要准备好对应内核版本的内核源码树文件。 该系列的全部文章都以嵌入式系统的ARM-Linux的环境进行阐述&#xff0c;并以交叉编译的方式在主机Ubuntu20.04系统上编译和ARM开发板上跑测 (E2000Q、H616、或者IMX6ULL看情况交叉着使用) 关…

MySQL基础练习题44-只出现一次的最大数字

目录 题目 情况一 准备数据 分析数据 情况二 准备数据 实现一 题目 单一数字 是在 MyNumbers 表中只出现一次的数字。 找出最大的 单一数字 。如果不存在 单一数字 &#xff0c;则返回 null 。 情况一 准备数据 ## 创建库 create database db; use db;## 创建表 Cre…

腾讯云短信正文模板每个变量取值最多支持6个字符出现的问题及应对方法

目录 一、参考链接二、应对方法 一、参考链接 对于长期未使用的账号及 2024 年 1 月 25 日后开通的新账号&#xff0c;腾讯云对短信正文模板的变量进行了限制&#xff1a; 验证码短信&#xff1a;每个变量取值最多支持6位纯数字。 非验证码短信&#xff1a;每个变量取值最多支…

MySQL架构设计

MySQL架构设计 查询语句&#xff1a; select * from users;返回结果为&#xff1a; 问题&#xff1a; 一条SQL查询语句是如何执行的&#xff1f; Server层 MySQL架构可以分为server层和Engine层两部分&#xff1a; 连接器&#xff08;connector&#xff09; 1. 连接管理 …

关于python中的get,set方法

一般在python面向对象中&#xff0c;每个类内都会有其所对应的属性。 而在定义属性值的时候&#xff0c;可能还得会对这些属性值进行修改和获取。为了确保代码的安全性&#xff0c;封装性和可操作性&#xff0c;我们可以使用get&#xff0c;set方式去操控。 get方法用于获取属…

贝莱德与摩根大通的最新季度持仓分析

近期&#xff0c;华尔街的两大投资巨头贝莱德和摩根大通公布了其2024年第二季度的13F报告&#xff0c;揭示了他们在投资组合上的最新动向。通过分析这些持仓数据&#xff0c;我们可以更清楚地了解这些顶级投资机构的投资策略和市场偏好。 贝莱德的科技巨头与能源投资 根据贝莱…

Trilium Notes:你的个人知识库!【送源码】

简介 Trilium Notes是一款功能全面的层次化笔记应用&#xff0c;通过树形结构构建个人知识库&#xff0c;支持Markdown编辑、网页内容剪切、笔记搜索与映射&#xff0c;并特别提供了基于画布的自由涂画功能&#xff0c;极大地提升了笔记的灵活性和创造性&#xff0c;是知识管理…

移动UI:把握好这9点,轻松设计积分兑换页面。

设计移动UI的积分兑换页面需要考虑用户体验和交互设计&#xff0c;以下是一些设计建议&#xff1a; 1. 清晰的积分信息展示&#xff1a; 在页面顶部或者中间位置展示用户当前的积分数量&#xff0c;让用户清晰地了解自己的积分情况。 2. 商品列表展示&#xff1a; 以列表或者…

[数据集][目标检测]违规撑伞检测数据集VOC+YOLO格式341张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;341 标注数量(xml文件个数)&#xff1a;341 标注数量(txt文件个数)&#xff1a;341 标注类别…

浅看MySQL数据库

有这么一句话&#xff1a;“一个不会数据库的程序员不是合格的程序员”。有点夸张&#xff0c;但是确是如此。透彻学习数据库是要学习好多知识&#xff0c;需要学的东西也是偏难的。我们今天来看数据库MySQL的一些简单基础东西&#xff0c;跟着小编一起来看一下吧。 什么是数据…

什么是树的先/中/后序遍历

前言 很久没有写c教程&#xff08;有几个月&#xff09;了&#xff0c;今天来讲讲树 为什么之前不讲树因为我不会但我现在能写出一些树的选择题了 首先我们画一棵树&#xff1a; 有些潦草 遍历是什么 我们要研究先/中/后序遍历&#xff0c;我们应该先知道什么叫遍历 遍历…

论文精要:《对静态分析缺陷报告进行聚类,以降低维护成本》

1. 前言 周末找到一篇《对静态分析缺陷报告进行聚类&#xff0c;以降低维护成本》&#xff0c;读了之后受到不少启发&#xff0c;特此将笔记整理出来。 论文出处&#xff1a; Published in: 2013 20th Working Conference on Reverse Engineering (WCRE)Date of Conference:…

疫情期间高校人员管理

TOC springboot322疫情期间高校人员管理 绪论 1.1 选题背景 当人们发现随着生产规模的不断扩大&#xff0c;人为计算方面才是一个巨大的短板&#xff0c;所以发明了各种计算设备&#xff0c;从结绳记事&#xff0c;到算筹&#xff0c;以及算盘&#xff0c;到如今的计算机&a…