为爬虫添加日志:知道程序做了什么
日志用于回答三个问题:程序请求了什么、结果如何、为什么失败。它比随处 print() 更适合长期维护,因为日志有等级、统一格式和输出位置。
1. 最小配置
import logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s",
)
logger = logging.getLogger(__name__)
在脚本中使用:
logger.exception() 应在 except 块内使用,它会附带异常堆栈,便于定位错误。
2. 建议记录的字段
- 请求 URL 与最终 URL
- HTTP 状态码、响应内容类型和耗时
- 解析到的卡片数、成功写入数、跳过数
- 失败类型与异常信息
- 当前页码或任务批次标识
避免在日志中写入 Cookie、认证头、令牌、个人信息或整页原始 HTML。日志也属于需要保护的数据。
3. 日志等级的简单约定
| 等级 | 适合记录 |
|---|---|
DEBUG |
调试选择器、局部响应信息 |
INFO |
正常进度和汇总 |
WARNING |
可继续但值得关注的异常,如字段缺失 |
ERROR |
当前 URL 或任务失败 |
不要把正常的每条数据都写为 WARNING,否则真正的问题会被淹没。
4. 用日志替代“悄悄失败”
如果某页解析失败,应记录 URL 和原因,并根据任务策略停止、跳过或等待后再试。不要使用空的 except: pass;它会让数据缺失而没有任何线索。