首页/新闻资讯/正文详情

Python后端爬虫专题10:重复运行不能重复入库——内容指纹、去重与幂等更新

发布时间:2026/9/27 21:54:27 来源:云帆数科 栏目:资讯中心
Python后端爬虫专题10:重复运行不能重复入库——内容指纹、去重与幂等更新
Python后端爬虫专题10重复运行不能重复入库——内容指纹、去重与幂等更新上一篇练习完整答案缓存测试应期望请求顺序为 robots、job1、job2若出现两个 robots缓存没有生效。两个迷惑 URL 的 hostname 都是evil.example或其子域而不是 target.test一个利用后缀相似一个利用 URL 用户名。内部范围清单必须写负责人和过期时间否则“一次授权”容易被误当永久授权。三种重复不要混为一谈队列重复同一规范 URL 在一次任务中被发现多次数据库重复两次任务把同一来源插入两行内容未变化同一职位再次出现但业务字段相同。它们发生在不同层需要不同机制。URL set 解决本次队列重复数据库唯一约束解决并发和跨任务重复内容指纹判断已有行是否需要更新。只做任意一层都不完整。指纹里应该放什么job_fingerprint对 JobItem 的业务字段做 canonical JSON再计算 SHA-256。source_url 被排除因为它已经用于身份唯一键跟踪规则变化不应让正文误报更新。skills 统一 casefold 并排序避免展示顺序变化产生新指纹。标题、公司、城市、描述、薪资和发布时间都影响职位事实因此应进入指纹。last_seen_at、快照 ID、采集时间不能进入否则每次运行必然变化。指纹不是加密密码也不能证明内容来自某个法律主体它只是快速比较业务快照。URL 身份与 external_idTargetLab 有 external_id但真实来源可能重复使用编号或不同栏目使用相同 id。本项目用(tenant_id, source_url)做唯一身份external_id 作为来源字段保留。若站点承诺全局稳定编号可改为(tenant, source, external_id)但迁移前要验证历史数据。租户必须进入唯一键。两个客户被授权采集同一来源时各自拥有任务、保留策略和下游结果不能让 tenant-a 的更新覆盖 tenant-b。幂等不等于什么都不做第一次 upsert 返回 created相同指纹返回 unchanged但仍更新 last_seen_at、ETag 和快照引用内容变化返回 updated 并替换业务字段。调用者根据 action 累计 CrawlReport。并发环境只靠“先 select 后 insert”仍可能竞态两个事务都看见不存在然后同时插入。数据库唯一约束是最终防线生产 repository 可用 PostgreSQLINSERT ... ON CONFLICT或捕获 IntegrityError 重读。课程当前顺序逻辑便于学习约束保证错误不会静默生成两行。为什么不用 Python 的 hash()内置 hash 默认会跨进程随机化也可能因版本变化不适合作持久标识。SHA-256 输出稳定、碰撞风险足够低、易于跨语言复算。canonical JSON 必须固定字段名排序、分隔符和 Unicode 处理否则相同对象可能产生不同字节。运行三阶段验收.\.venv\Scripts\python.exe-m pytest tests\test_repository.py::test_repository_creates_then_ignores_duplicate_then_updates_changed_job-q测试在同一内存数据库依次插入、重复、修改描述断言 action 为 created/unchanged/updated三个结果 job_id 相同最终只有一行且 ETag 更新为 v2。这比只测fingerprint字符串更接近用户可见行为。变更历史是否要保存当前 jobs 表保存最新事实原始快照保存每次有正文的证据。如果产品需要展示历史薪资应另建 job_versions以 job_id、fingerprint 和有效时间记录版本不能指望日志永久保存。是否建历史表取决于业务不为了“架构完整”提前增加。本篇完整指纹模块函数很短但存在明确调用者JobRepository.upsert。它不打印展示结果、不维护全局列表也不为测试硬编码职位顺序。短函数是否有意义看它是否封装稳定业务合同而不是看行数。业务内容指纹网络缓存标识与业务变化判断各司其职。fromhashlibimportsha256importjsonfrom.modelsimportJobItemdefjob_fingerprint(item:JobItem)-str:生成与排版和技能顺序无关、与职位事实有关的 SHA-256。payloaditem.model_dump(modejson,exclude{source_url})payload[skills]sorted((skill.casefold()forskillinitem.skills),keystr.casefold)canonicaljson.dumps(payload,ensure_asciiFalse,sort_keysTrue,separators(,,:))returnsha256(canonical.encode(utf-8)).hexdigest()本篇课后练习修改 skills 顺序和大小写验证指纹不变修改 description验证指纹改变。写出为什么last_seen_at不能进入内容指纹。模拟两个 Session 同时插入相同 tenant/source观察唯一约束如何阻止重复并思考 ON CONFLICT。下一篇会把 jobs 与 crawl_tasks 表结构完整落地。

相关推荐

十六、CAN
十六、CAN

1. CAN简介CAN协议,全称为Controller Area Network(控制器局域网络),是一种广泛应用的串行通信协议,最初由德国BOSCH公司开发,并已成为国际标准。 低速CAN(ISO11519)通信速率 10~125… · 2026/9/27 21:54:14

【Python项目实战】综合项目(五):自动化、测试、Docker部署
【Python项目实战】综合项目(五):自动化、测试、Docker部署

上篇交卷,早报站能看了——但还要你手动启动。 最后一篇:让系统自己运转,并且一键部署到任何机器。从“能跑”到“能交付”,这是全系列的期末考试。 🎯 本篇成品:一个自动化运行、有完整测试、能用Docker一键部署的完整系统。含注释约200行 + Dockerfile + compose。 �… · 2026/9/27 21:54:14

Linux IO模型与select、poll、epoll多路复用技术
Linux IO模型与select、poll、epoll多路复用技术

1. 引言在Linux网络编程中,IO模型决定了程序如何与内核进行数据交互,而多路复用技术则是高并发服务器的核心基础。本文将从IO模型的基本概念出发,深入讲解阻塞IO、非阻塞IO、IO多路复用、信号驱动IO和异步IO五种模型,并重点剖析se… · 2026/9/27 21:54:14

重庆自动seo避坑指南3个关键注意事项助新手零代码建站
重庆自动seo避坑指南3个关键注意事项助新手零代码建站

重庆自动seo避坑指南3个关键注意事项助新手零代码建站 自己不会代码想做网站,最怕的就是被“自动SEO”这种词忽悠得云里雾里,最后钱花了,流量没来。很多重庆的中小企业老板,特别是做本地生活服务或实体贸易的,手里没技术团队,只想找个省事的路子… · 2026/9/27 22:33:59

OpenClaw部署教程完整版:用TaoToken统一API Key的最简配置流程
OpenClaw部署教程完整版:用TaoToken统一API Key的最简配置流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:33:53

用 Microsoft Agent Framework 构建 SubAgent(Multi-Agent):config.toml 骨架与验证清单
用 Microsoft Agent Framework 构建 SubAgent(Multi-Agent):config.toml 骨架与验证清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:33:53

目前热门的IP驱动产业新场景新工具哪家专业
目前热门的IP驱动产业新场景新工具哪家专业

开篇:定下基调测评背景与目的近年来IP价值从单一内容输出向全产业场景渗透,数字工具作为IP落地的核心载体,正在重构实体经营、康养服务、副业创业等多赛道的协作模式。本次测评聚焦IP驱动产业落地的实际效能,从真实落地案例、用户… · 2026/9/27 22:33:53

AIGC智能编程实战:大模型代码助手巧学巧用与TaoToken配置指南
AIGC智能编程实战:大模型代码助手巧学巧用与TaoToken配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:33:47

OpenAI自研芯片降本50%背后:用TaoToken统一Key打通AI工具链配置
OpenAI自研芯片降本50%背后:用TaoToken统一Key打通AI工具链配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:33:47

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码