ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

upsert数据去重原理:thal项目如何避免重复爬取邮箱

upsert数据去重原理:thal项目如何避免重复爬取邮箱 upsert数据去重原理thal项目如何避免重复爬取邮箱【免费下载链接】thal项目地址: https://gitcode.com/gh_mirrors/tha/thalupsert数据去重是爬虫开发中最高频的需求之一。开源项目thal用 Puppeteer 与 Chrome Headless 自动登录 GitHub翻遍上百页搜索结果批量提取用户邮箱并通过 MongoDB 的 upsert 机制确保同一个邮箱在数据库中只保留一份记录。这套有则更新、无则新增的去重思路正是今天要拆解的核心。为什么必须做数据去重重复爬取邮箱的三大痛点爬虫不做好去重后果往往在数据量上来之后才爆发数据冗余同一个邮箱被反复爬取入库数据库越来越脏后续做营销、画像都会出错。请求浪费⏳多爬一次就多一次网络请求而 GitHub 对请求频率极其敏感很容易触发限流。旧数据残留如果只插不更新用户名改掉之后库里还是过期信息无法自动纠正。thal 项目面对的是 7 万多位用户的搜索结果如果不做去重一次全量爬取就会产生大量重复数据——这正是它引入 upsert 的动机。upsert 是什么一分钟理解有则更新、无则新增upsert 是update insert的组合词。当查询条件命中已有记录时就更新没命中时就自动新增完全不需要程序员先查一遍再判断场景普通 insertupsert 数据去重邮箱已存在插入重复记录 ❌更新用户名与爬取时间 ✅邮箱不存在插入新记录 ✅插入新记录 ✅一句话总结upsert 让插入操作天然具备幂等性同一邮箱爬 1 次和爬 100 次数据库里的结果完全一致。thal 的数据模型用 email 作为去重键想要去重必须先定义什么才算重复。在 models/user.js 中thal 用 email 作为判断依据const userSchema new mongoose.Schema({ username: String, email: String, dateCrawled: Date }); module.exports mongoose.model(User, userSchema);注意这里选的是email 而不是 username因为 GitHub 用户名是唯一的但只有邮箱才是爬虫真正要沉淀的核心数据以邮箱为去重键更符合业务目标。核心原理Mongoose findOneAndUpdate 如何实现 upsert 去重thal 的去重核心在 index.js 的upsertUser函数中代码极短但信息量很大const conditions { email: userObj.email }; const options { upsert: true, new: true, setDefaultsOnInsert: true }; User.findOneAndUpdate(conditions, userObj, options, (err, result) { ... });三个关键配置项就是去重的全部秘密upsert: true—— 去重的总开关。按 email 查找找到就更新找不到就插入。new: true—— 返回更新后的最新文档方便后续使用。setDefaultsOnInsert: true—— 仅在新增时填充默认值更新时不会误覆盖。整个流程在爬虫侧只需要一行调用upsertUser({ username, email, dateCrawled: new Date() })数据库侧的重复判断完全交给 MongoDB 完成。upsert 去重的完整执行流程了解了原理再看 thal 的完整链路就很清晰了登录 GitHubPuppeteer 通过 DevTools 复制的选择器定位输入框见下图计算总页数根据搜索结果人数算出需要遍历的页数逐页提取数据从每个用户卡片中取出 username 与 email过滤掉没公开邮箱的用户upsert 写入调用upsertUser存入 MongoDB重复邮箱自动走更新分支。使用 upsert 去重的 3 个实用建议给去重键加唯一索引在 email 字段上建立唯一索引双保险防止并发下出现重复记录。别忽略异步问题⚡upsertUser是异步方法批量调用时要注意等待完成否则会出现以为存了其实没存的错觉。配合限流策略去重只能保证数据不重复仍要控制爬取频率避免像上文的whoa.png一样被 GitHub 拦截。小结thal 项目用一条findOneAndUpdateupsert: true就优雅地解决了爬虫最常见的重复数据问题。对新手而言这套模式的价值在于不用先查再写、不用手动判重把去重交给数据库原子操作。下次你再写爬虫存数据时不妨直接复制这个 upsert 数据去重模板少踩很多坑。【免费下载链接】thal项目地址: https://gitcode.com/gh_mirrors/tha/thal创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表