从简历爬虫到区块链:一个微信小程序开发的奇幻踩坑之旅

死锁制造者
2026-04-11 02:36
阅读 1887

去年年底,我还在为年终述职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次,每天上千份,账单看得我手抖。

于是我们做了两层优化:

  1. 预处理过滤:先用正则匹配关键词(如“React”、“三年经验”),不符合条件的直接丢弃,减少无效调用。
  2. 缓存机制:对同一份简历哈希后缓存结果,避免重复处理。

更骚的操作是——我把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

最热最新
暂无评论
死锁制造者Lv.1
0
影响力
0
文章
0
粉丝