Python爬虫日志分析方法_抓取质量评估技巧【技巧】
发布时间 - 2025-12-27 00:00:00 点击率:次status_code 不是判断抓取成功的唯一标准,因为200响应可能返回反爬页、空白HTML、JS占位符或CDN错误模板;需同时满足状态正常、内容可解析、关键字段存在。
为什么 status_code 不是判断抓取成功的唯一标准
很多爬虫日志里看到大量 200 就以为数据抓到了,其实页面可能返回了反爬提示页、空白 HTML、JS 渲染占位符,甚至 CDN 缓存的错误模板。真正有效的响应必须同时满足:HTTP 状态正常 + 实际内容可解析 + 关键字段存在。
- 检查
Content-Type响应头是否为text/html或application/json,避免把图片或 404 页面当正文处理 - 对 HTML 响应,用
lxml或BeautifulSoup尝试解析,捕获ParserError或空title标签 - 对 JSON 接口,先用
json.loads()解析,再验证关键 key(如"data"、"items")是否存在且非空 - 记录
response.elapsed.total_seconds(),超时(如 >15s)即使状态码是 200 也应归为“低质量响应”
如何从日志中识别高频但无效的请求模式
日志里反复出现的 URL 并不意味着重要,反而可能是反爬陷阱入口或分页逻辑缺陷导致的死循环。重点看 request.url 和 response.url 是否一致,以及重定向链长度。
- 提取所有含
?page=、&offset=的 URL,统计相同参数值重复出现次数,超过 3 次即标记为可疑 - 用正则匹配
response.headers.get("Location")或response.history长度,>2 跳的请求大概率被重定向到登录页或风控页 - 对比
request.url和response.url的域名与路径层级,若后者变成https://example.com/antibot/或/captcha,说明已触发防御 - 对 User-Agent 频繁切换但响应内容高度相似(如 MD5 值重复)的请求组,基本可判定为无效轮询
logging 模块怎么记录才能支撑后续质量分析
默认的 basicConfig 只记时间+级别+消息,无法做维度下钻。必须在 LogRecord 中注入结构化字段,方便用 Pandas 或 ES 聚合。
import logging import json
class RequestFilter(logging.Filter): def filter(self, record): if hasattr(record, 'url') and hasattr(record, 'status_code'): record.log_json = json.dumps({ "url": record.url, "status_code": record.status_code, "elapsed": getattr(record, "elapsed", 0), "size": getattr(record, "size", 0), "error_type": getattr(record, "error_type", "") }, ensure_ascii=False) return True
logger = logging.getLogger("crawler") handler = logging.FileHandler("crawl.log") handler.setFormatter(logging.Formatter("%(log_json)s")) handler.addFilter(RequestFilter()) logger.addHandler(handler)
- 务必把
url、status_code、elapsed、size作为日志属性传入,而不是拼在 message 字符串里 - 避免在
message中写动态内容(如f"failed on {url}"),会导致日志无法结构化解析 - 对异常捕获,用
logger.error("parse failed", exc_info=True, extra={"url": url, "status_code": 200})
用 Pandas 快速计算抓取质量核心指标
原始日志转成 DataFrame 后,几个关键指标能立刻暴露问题环节,不需要等完整跑完再复盘。
import pandas as pd import jsondf = pd.read_json("crawl.log", lines=True) df["ts"] = pd.to_datetime(df["timestamp"]) df["is_2xx"] = df["status_code"].between(200, 299) df["is_content_ok"] = (df["size"] > 1024) & (df["elapsed"] < 15.0)
每小时成功率(2xx 且内容有效)
hourly_success = df.groupby(df["ts"].dt.floor("H")).agg( total=("status_code", "count"), success=("is_content_ok", "sum") ).assign(rate=lambda x: x["success"] / x["total"]).round(3)
高延迟 URL TOP 10
slow_urls = df.nlargest(10, "elapsed")[["url", "elapsed", "status_code"]]
-
size小于 1KB 且状态码为 200 的响应,90% 是反爬页或骨架屏,直接剔除出有效样本 - 按
url分组统计status_code分布,若某 URL 固定返回 200+空内容,说明该入口已失效,应加入黑名单 - 注意
lines=True参数,否则read_json会因每行一个 JSON 对象而报错ValueError: Trailing data
真实场景里最常被忽略的是响应体语义一致性——比如同一批商品列表接口,有的返回 {"list": [...]},有的返回 {"data": {"list": [...]}},日志里都算 200,但解析代码只适配一种结构。这种差异不会体现在 status 或 size 上,只能靠抽样校验 response body schema。
# python
# html
# js
# json
# app
# ai
# 爬虫
# cdn
# 状态码
# 黑名单
# 为什么
# asic
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何处理和验证JSON类型的数据库字段
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
如何快速搭建虚拟主机网站?新手必看指南
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
🚀拖拽式CMS建站能否实现高效与个性化并存?
如何用IIS7快速搭建并优化网站站点?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
如何快速使用云服务器搭建个人网站?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
如何正确选择百度移动适配建站域名?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
长沙企业网站制作哪家好,长沙水业集团官方网站?
制作旅游网站html,怎样注册旅游网站?
如何在阿里云部署织梦网站?
Laravel如何自定义错误页面(404, 500)?(代码示例)
高防服务器如何保障网站安全无虞?
如何实现建站之星域名转发设置?
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
浅析上传头像示例及其注意事项
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
网页设计与网站制作内容,怎样注册网站?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
Android自定义控件实现温度旋转按钮效果
如何选择PHP开源工具快速搭建网站?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
如何快速启动建站代理加盟业务?
Laravel怎么上传文件_Laravel图片上传及存储配置
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
敲碗10年!Mac系列传将迎来「触控与联网」双革新
深圳网站制作平台,深圳市做网站好的公司有哪些?
微信公众帐号开发教程之图文消息全攻略
浅述节点的创建及常见功能的实现
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
如何在腾讯云免费申请建站?
node.js报错:Cannot find module 'ejs'的解决办法
Bootstrap整体框架之CSS12栅格系统
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
香港服务器网站卡顿?如何解决网络延迟与负载问题?
网站制作价目表怎么做,珍爱网婚介费用多少?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何为不同团队 ID 动态生成多个非值班状态按钮
如何在IIS中新建站点并配置端口与IP地址?
JS实现鼠标移上去显示图片或微信二维码


son