我“毕业”后,写了个个人项目:一个基于Agent的AI求职爬虫,结果把自己“爬”进了新公司
一、背景:从CRUD Boy到求职Crawler Boy
今年上半年,和许多人一样,我“光荣下岗”了。
最初的一个月,我陷入了迷茫。每天重复着“刷招聘->改简历->投递”的机械循环,感觉自己从一个CRUD Boy,变成了一个“求职Crawler Boy”,只不过这个爬虫,是我自己的人肉爬虫。
效率低下,心态血崩。
作为一个开发者,我骨子里就有一种“自动化”的冲动。我意识到,我不能再这样“人肉”下去了。与其把时间浪费在重复性劳动上,不如把求职本身,当成一个Side Project来做。
于是,一个大胆的想法诞生了:我要为自己写一个专属的AI求职系统。
二、项目架构设计:我的个人求职Agent v1.0
我的目标很明确:构建一个能模拟我求职全流程的智能体(Agent),将我从繁琐的事务中解放出来。
[此处可配一张图:项目的架构图,包含数据源、爬虫模块、LLM处理模块、任务队列、执行器等]
1. 数据采集层(爬虫模块)
技术栈: Python + Scrapy + Playwright
实现逻辑: 针对几个主流招聘平台,我编写了定制化的Scrapy爬虫。考虑到反爬机制,我并未使用高并发请求,而是模拟正常用户的低频访问。对于一些动态加载(SPA)的页面,我集成了Playwright来渲染JS,确保数据获取的完整性。
核心功能: 定时(比如每3小时)拉取符合我预设关键词(如“AIGC”, “SaaS”, “Golang”)的新增岗位,存入一个MongoDB任务队列。
2. 智能处理层(LLM大脑模块)
这是项目的核心,也是区别于普通爬虫的关键。
技术栈: LangChain + OpenAI API
实现逻辑:
岗位清洗与结构化: 我设计了一个Chain,它读取任务队列中的原始JD文本,利用LLM强大的信息提取能力,将其清洗并结构化为JSON格式(包含:公司名、薪资、技术要求、岗位职责等)。
简历-JD精准匹配: 这是最关键的一步。我将我所有的项目经验、技能点都向量化后,存入一个本地的ChromaDB向量数据库。每当有一个新的、结构化的JD进来,我就会将其同样进行向量化,然后在向量空间中计算余弦相似度。这比简单的关键词匹配,精准度高出几个数量级。只有相似度得分超过0.85的岗位,才会被判定为“高意向”。
动态内容生成: 对于“高意向”岗位,我构建了另一个Chain。它会以JD和我的向量化简历作为上下文,动态生成一份高度定制化的求职信和简历摘要。这解决了AI可以帮我写求- 职信吗这个经典难题。
3. 任务执行层(RPA模块)
技术栈: uiautomator2 (针对APP), Selenium (针对Web)
实现逻辑: 对于匹配和内容生成完毕的岗位,我并没有做完全自动化的投递,因为我坚信“临门一脚”需要人工确认。但这个模块会自动拉起对应的APP或网页,将生成好的内容填充到输入框,等待我最终点击“发送”。这为我节省了大量的复制粘贴时间。
三、项目成果与意外收获
这个项目跑起来后,我的求职效率发生了质的飞跃。我每天只需要处理系统筛选出的几个“高意向”岗位,其余时间全部用来刷算法题和准备面试。
但最大的收获,来自于一次面试。
那是一家我非常心仪的AIGC公司,面试官在深挖我的项目经历时,我把我这个“个人AI求职系统”的整个架构、实现思路、遇到的困难和解决方案,完完整整地讲了一遍。
我能明显看到,面试官的眼睛都亮了。
他最后说:“市面上讨论AI求- 职软件哪个好的人很多,但真正动手把它实现出来的人很少。你不仅有解决复杂问题的能力,更有主动发现并定义问题的能力,这正是我们需要的。”
最终,我凭借这个独特的“个人项目”,成功拿到了Offer。
四、复盘总结
这次经历让我明白,对于技术人而言,我们的代码,就是我们最硬核的简历。与其把时间浪费在无尽的焦虑和内耗中,不如静下心来,动手去构建一个能解决自己实际问题的项目。
这个过程,不仅能让你保持技术的热度,更能在不经意间,为你打开一扇意想不到的大门。
对这个个人求职Agent实现思路感兴趣的,可以找圈内大神 mattguo 聊聊,他在这块玩得比我深。
更多推荐
所有评论(0)