用时间戳判断页面是否需重抓的核心逻辑是:成功抓取后存页面最后更新时间,下次仅抓取更新时间大于数据库记录的页面,前提是网站提供可靠可解析的时间字段。

如何用时间戳判断页面是否需要重新抓取
核心逻辑很简单:每次成功抓取后,把页面的最后更新时间(比如 last_modified 或文章发布时间)存进数据库;下次抓取前,先查这条记录的时间戳,只抓取比数据库里更新的时间——前提是目标网站确实提供可靠、可解析的时间字段。
常见坑点:Last-Modified 响应头不一定准确(静态生成站可能恒为部署时间),而网页内 <meta property="article:modified_time"> 或正文中的「更新于 2024-05-20」这类文本,需正则或 XPath 提取,稳定性差。建议优先尝试 API 接口返回的 updated_at 字段,比 HTML 解析更稳。
实操建议:
- 数据库表必须有
url(主键或唯一索引)和last_crawl_time(datetime 类型,非 null)两列 -
爬虫发起请求前,用
SELECT last_crawl_time FROM pages WHERE url = %s查缓存时间 - 如果查不到记录,或网页时间 > 数据库时间,则抓取并更新;否则跳过
- 注意时区:统一转成 UTC 存储,避免本地时区导致误判
MySQL/SQLite 中怎么高效查时间戳并更新
别写成「先 SELECT 再 INSERT/UPDATE」两步——并发抓取时容易重复插入或漏更新。直接用带条件的原子操作更安全。
MySQL 示例(upsert + 时间比较):
INSERT INTO pages (url, title, content, last_crawl_time)
VALUES (%s, %s, %s, %s)
ON DUPLICATE KEY UPDATE
title = VALUES(title),
content = VALUES(content),
last_crawl_time = CASE WHEN VALUES(last_crawl_time) > last_crawl_time
THEN VALUES(last_crawl_time)
ELSE last_crawl_time END
SQLite 没有 ON DUPLICATE KEY,得用 INSERT OR REPLACE 配合子查询,或改用 REPLACE INTO + 触发器,但更推荐 Python 层控制:用 INSERT ... ON CONFLICT(url) DO UPDATE(SQLite 3.24+ 支持)。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
关键提醒:
-
url字段必须建唯一索引,否则 upsert 无效 - 避免在 WHERE 条件里对
last_crawl_time做函数操作(如DATE(last_crawl_time)),会无法走索引 - 批量抓取时,用
executemany+ 参数化查询,别拼 SQL 字符串
时间戳为空或格式不一致怎么办
现实里大量页面根本不提供明确更新时间,或者返回 "Just now"、"2小时前" 这种相对时间。这时候硬比时间戳只会让增量逻辑失效。
可行 fallback 策略:
- 降级为「固定周期重抓」:对无时间戳的 URL,设
next_crawl_at字段,按 7 天/30 天周期更新 - 用内容哈希代替时间判断:抓取后算
hashlib.sha256(content.encode()).hexdigest(),只在哈希值变化时更新数据库 - 组合策略:优先用时间戳;缺失时用哈希;哈希也难算(大文件/流式内容)就退到周期轮询
- 注意:HTML 中的
<script></script>标签或广告代码会导致哈希频繁变动,提取正文前务必清理无关 DOM 节点
为什么增量抓取后数据还是旧的
最常见原因不是逻辑错,而是时间精度或来源没对齐。比如你从网页 <time datetime="2024-05-20"></time> 只取了日期,但数据库存的是 2024-05-20 14:30:00,比较时被截断成 2024-05-20 00:00:00,导致永远认为“新数据没更新”。
排查要点:
- 打印出实际入库的
last_crawl_time和本次提取的原始时间字符串,肉眼比对格式 - 检查 Python 里是否用了
datetime.strptime(..., '%Y-%m-%d')却没补全时分秒,默认变成 00:00:00 - 确认数据库字段类型是
DATETIME或TIMESTAMP,不是DATE - 如果用 ORM(如 SQLAlchemy),留意
auto_now/auto_now_add是否覆盖了你传入的时间值
增量不是一劳永逸的开关,它依赖时间源可信、解析鲁棒、存储一致——三者任一断裂,就会静默失效。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










