从简历爬虫到区块链:一个微信小程序开发的奇幻踩坑之旅
去年年底,我还在为年终述职PPT发愁,没想到一转眼就被拉进了公司一个“战略性探索项目”——听起来高大上,其实就是老板在饭局上听人聊了句“AI+区块链”,回来就让我们客户端组搞点新东西。作为腾讯干了快三年、其中两年扑在微信小程序上的老咸鱼,我内心是拒绝的。但架不住leader一句:“这玩意儿写进简历多亮眼啊!”
行吧,为了简历好看,硬着头皮上了。
需求很野:用AI抓简历,链上存证明?
项目目标很玄乎:做一个面向HR的智能招聘工具,核心功能是自动从公开渠道(比如招聘网站、社交平台)爬取候选人信息,用ChatGPT做初步筛选和摘要,最后把关键信息哈希上链,作为“数据来源可信”的证明。
我第一反应是:产品经理是不是最近看太多Web3的公众号了?但转念一想——嘿,这不正好能把我平时偷偷用的那些骚操作正经化吗?
毕竟,作为一个重度依赖ChatGPT和Claude的开发者,我早就习惯让AI帮我写爬虫脚本、解释报错、甚至生成小程序页面逻辑。以前都是私下用,现在终于能光明正大地写进周报了。
爬虫起步:你以为的简单,其实是天坑
一开始我以为爬简历嘛,不就是requests + BeautifulSoup 套路走起?结果第一天就翻车。
现代招聘网站反爬机制比我想象中狠多了。某知名平台直接对非浏览器UA返回403,加了headers没用;模拟登录?验证码是滑块+点选混合,还带行为分析。我试着手动过一次,手指都快抽筋了。
这时候ChatGPT救了我。让它帮我写一个基于Playwright的无头浏览器脚本,自动处理JS渲染和基础交互:
// 使用 Playwright 绕过基础反爬
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36...'
});
const page = await context.newPage();
await page.goto('https://xxx-job-site.com');
// 模拟人类延迟操作
await page.waitForTimeout(2000);
await page.fill('#keyword', '前端开发');
await page.click('.search-btn');
// 等待动态内容加载
await page.waitForSelector('.resume-item', { timeout: 10000 });
const resumes = await page.$$eval('.resume-item', items =>
items.map(item => ({
name: item.querySelector('.name').innerText,
title: item.querySelector('.title').innerText,
link: item.querySelector('a').href
}))
);
console.log(resumes);
await browser.close();
})();
这段代码在本地跑得飞起,但一部署到公司内网服务器,立马被目标网站识别为“数据中心IP”,直接封禁。运维同事一脸无辜:“我们出口IP段确实被很多风控系统标记了。”
最终解决方案?我们申请了一个独立的云服务器,绑定弹性公网IP,并配合代理池轮换。虽然成本涨了,但至少数据能稳定获取了。
💡 经验教训:别小看反爬。你以为只是技术问题,其实是攻防对抗。有时候不是代码不行,是你的IP太“脏”。
ChatGPT介入:从辅助到主力
拿到原始简历数据后,下一步是用大模型做结构化提取和摘要。这里我们用了Claude 2,因为它对长文本处理更强,而且支持上传PDF(很多简历是PDF格式)。
但问题来了:直接调API成本太高!一份简历平均要调用2-3次,每天上千份,账单看得我手抖。
于是我们做了两层优化:
- 预处理过滤:先用正则匹配关键词(如“React”、“三年经验”),不符合条件的直接丢弃,减少无效调用。
- 缓存机制:对同一份简历哈希后缓存结果,避免重复处理。
更骚的操作是——我把Claude当成“代码生成器”来用。比如需要解析不同格式的PDF简历,我就给它一段样本,然后说:“请写一个Python函数,从这种PDF中提取姓名、工作经历和技能标签。” 它真能给我写出可用的PyMuPDF代码!
当然,也翻过车。有一次它把“曾在阿里实习”理解成“现任阿里高管”,差点闹出大笑话。后来我们加了人工审核队列,重要岗位必须二次确认。
区块链上链:最贵的“心理安慰”
最魔幻的部分来了——上链。
业务方坚持要把每份简历的哈希值写入区块链,说是“不可篡改的证据”。我们评估了几个方案:
| 方案 | 成本 | 写入速度 | 可读性 | 团队熟悉度 |
|---|---|---|---|---|
| 以太坊主网 | 极高($5+/笔) | 慢(15s+) | 好 | 中等 |
| Polygon | 中($0.01/笔) | 快(2s) | 好 | 低 |
| 自建私有链 | 低 | 极快 | 差 | 高 |
最后选了Polygon,折中方案。但即便如此,高峰期一天几千笔交易,gas费还是肉疼。
更搞笑的是,测试同学问:“如果链上数据错了怎么办?” 我愣住了——区块链不是不可篡改吗?错了就永远错了啊!这反而成了系统的致命弱点。
最后我们妥协:只上链“原始数据哈希 + 处理时间戳”,不做语义内容上链。真正的业务逻辑还是走传统数据库。区块链成了一个昂贵的时间戳服务。
说实话,到现在我都不确定这个设计有没有实际价值。但老板说:“投资人喜欢看到‘区块链’三个字。” 行吧,为了融资,烧点钱也认了。
小程序端集成:熟悉的战场
终于到了我的舒适区——微信小程序。
我们做了一个HR端的小程序,展示AI筛选后的简历列表,每条记录带一个“链上验证”按钮。点击后跳转到区块浏览器,显示该简历哈希的交易记录。
但微信环境限制多啊!不能直接发起跨域请求,不能长时间运行脚本。爬虫和AI处理都得放在后端,小程序只做展示。
最大的坑是图片防盗链。很多简历头像来自第三方CDN,小程序web-view里直接403。解决方案是在后端做一层代理转发,或者提前下载到COS(腾讯云对象存储)。
上线前夜,测试报了个诡异Bug:iOS用户看不到链上验证按钮。查了半天,发现是某个日期格式在Safari下解析失败,导致整个组件渲染崩溃。赶紧用dayjs统一处理时间格式,才赶在早上8点前合入。
那一刻,我真的想对着晨光喊一句:“我爱微信小程序!”
写在最后:技术没有银弹,只有权衡
这个项目折腾了三个月,最终上线效果其实一般。HR们反馈:“AI摘要还不如我自己看。” 区块链功能更是几乎没人点。
但对我个人而言,收获巨大:
- 真正理解了爬虫不仅是技术,更是策略博弈;
- 学会了在成本、效果、合规之间找平衡;
- 对“新技术落地”的幻想彻底破灭——再炫酷的技术,也得服务于真实需求。
至于简历?我已经把它写进去了,标题就叫“主导AI+区块链招聘系统从0到1落地”。反正面试官也不会真的去查链上记录(笑)。
回头看,这趟旅程就像我们程序员的日常:一边吐槽需求离谱,一边吭哧吭哧把不可能变成可能。用ChatGPT写代码,用区块链装点门面,最后在微信小程序里默默修Bug——这才是真实的互联网一线生活。
下次谁再说“区块链改变世界”,我大概会笑着递给他一杯冰美式,然后说:“兄弟,先搞定反爬吧。”

评论 0