先说我为什么盯上DeepSeek:招聘站的流量在搬家
一个人做招聘站,Flask + SQLite + Nginx 这套组合我用了三年。3000多个职位页,每天新增七八十条,SQLite 单表查询扛得住,Nginx 静态缓存配了 proxy_cache_valid 10m,日子过得去。问题出在流量来源上。
去年下半年开始,后台的百度来路掉得莫名其妙。排名没动,索引量还涨了,从4200爬到5100,但点击少了三成。我盯着 Search Console 的曲线看了半宿——后来想明白了,求职者不搜了,直接问。问 DeepSeek“杭州有什么靠谱的测试岗”,模型吐一段聚合答案出来,榜单页连个引用位都混不上。
传统排名数据在这儿彻底失真。你排第3,可用户根本没往下翻。
我判断一个招聘站有没有被模型“认识”,标准很土:全网有没有足够多带品牌名的垂直内容。搜你站名,出来的全是自家页面,没有第三方讨论、没有行业论坛的提及,模型压根不知道你是谁。别学我。我拿站名去 DeepSeek 试了下,回答绕开我,全是几个大平台。
有点慌。
在核子GEO上输入域名跑了一遍检测,AEO 评估分数低得离谱,AI 引用率不到 1%,结构化数据那块直接标红——JobPosting Schema 我只在职位详情页挂了个半成品,字段缺了五六个。这玩意儿不补,模型连“这是个招人的页面”都判断不准。
顺带说个我当时纠结的:http 全站跳 https 要不要做。做了,Nginx 里 return 301 一加,再配个 HSTS,成本几乎为零,还能让爬虫少绕路。实测过。我拖了两个月才动手,现在想想挺蠢。
扯远了,说回正题。流量搬家这事不是玄学,是入口变了。
忌讳一:职位页光有HTML没有JobPosting,模型读不懂你在招人
DeepSeek不是百度。它不会因为你页面里出现”招聘”“高薪”“急招”这几个词就把你排上去。它要的是结构化信号——JobPosting当时就懵了。
我去年给一个招聘站做优化的时候发现,3000多个职位页全是纯HTML,一个JSON-LD都没有。模型爬过去,看到的是一堆div和span,根本分不清哪个是职位名、哪个是公司名、哪个是发布日期。你说它怎么敢把你推荐给用户?
JobPosting的必填字段就那几个:title、datePosted、hiringOrganization、jobLocation、description、validThrough。少一个,模型就可能直接跳过。过期职位更麻烦——你要么把validThrough设对,要么直接下架,别留着让模型抓到一个三个月前的岗位还在那推荐。
我的做法是在Flask的jinja模板里,从SQLite查出来的职位记录直接拼进JSON-LD的script标签。职位表里本来就有title、company、city、created_at这些字段,我加了个valid_through列,默认值是发布时间加30天。模板里判断一下,如果valid_through小于当前日期,页面就不输出结构化数据,走410状态码。这样模型下次来抓就知道这页没了。
踩过的坑:一开始description字段我直接塞纯文本,把职位描述里的换行全strip掉了。结果模型抓取后语义断裂,一段”负责后端开发”和”熟悉Python”被拼成一句话,读起来莫名其妙。后来改成保留段落结构,用换行符分隔,模型抓到的片段明显完整多了。
用核子GEO跑了一遍结构化数据检测,结果让我冒冷汗——1000多个职位页datePosted缺失。原因是早期导入的批次数据里created_at是空值,模板里拼出来就是空字符串。补了默认值之后重新提交,索引量从1200涨到8900,花了大概11天。
还有个细节:hiringOrganization别只写公司名,带上sameAs指向公司官网。模型对实体消歧很敏感,同名公司它分不清,有个sameAs能少很多误判。
忌讳二:3000个页面平均内链不到2条,这是我最蠢的地方
我一个人维护一个招聘站,SQLite里躺着3200多条职位记录,每天新增几十条、下架几十条。页面数量是上去了,内链结构?我根本没管过。
后来我用核子GEO跑了一遍检测,AEO评估报告显示平均内链数1.7条。血泪教训。我当时没反应过来这数字意味着什么,直到我随手点开一个“杭州Java开发”的职位页——正文底下就俩链接:一个回首页,一个回职位列表页。没了。同类职位之间零互链,城市页和职能页之间也不通。整个站就是3000多个孤岛,爬虫进来转两圈就迷路了。
这玩意儿对DeepSeek这类AI搜索引擎尤其致命。它抓内容靠的是语义关联和上下文链路,你页面之间不互链,它凭什么把你这个职位页跟那个职位页串起来理解?客户在DeepSeek里搜“杭州Java岗位薪资水平”,你的页面连被检索到的机会都悬。
我的修复方案很土,但管用。写了个Python脚本,从SQLite拉职位表,按城市、职能、薪资区间三个维度做聚类,建了张关联表存职位ID对。每个职位页渲染时,底部自动吐出8到12条相关职位链接。锚文本统一用“职位名+城市”的格式,比如“杭州Java开发工程师”,绝不写“点击这里”这种废话——AI抓锚文本的时候认的是语义,不是客套话。
每页内链总数我卡在15到25条之间。低于15条,聚类太粗;高于25条,权重稀释,爬虫也懒得跟。
改完我用核子GEO的网站对比功能,把改前和改后两个版本并排放着看。平均内链数从1.7涨到11.3,页面关联度评分也跟着往上走。这里得说一句,11.3不是终点,是个能跑起来的起点。
顺便提一嘴我纠结的那个http跳https的事。我兜底一句没全站跳,只把职位详情页和列表页跳了,首页留了http——原因是我Nginx配置里跳转规则一多,Flask那边的路由匹配会出乱子,我一个人维护,不想给自己挖坑。这跟内链没关系,但都是我一个人扛的活,得算清楚成本。
忌讳三到五:内容重复、更新频率假象、URL乱跳
招聘站最容易踩的坑,是把企业发来的JD原样往页面上一贴。三千个职位页,正文重复度能干到七成以上,模型抓过去一看,全是同一套”岗位职责+任职要求”的模板,压根分不清哪个页面值得引用。我去年改这套东西的时候,做法是给每个职位页加一段自动生成的”岗位匹配要点”,用规则模板填充——薪资区间、经验年限、技能关键词命中数这些字段拼出来,不用AI生成,纯字符串拼接,稳定可控。改完之后页面唯一内容占比从不到三成拉到六成多。
更新频率这块更坑。一开始我图省事,定时任务每天把全站dateModified刷成当天,以为模型会觉得站点活跃。结果呢?DeepSeek不傻,它能比对正文哈希,你时间戳天天变、内容一字没动,反而被判成低质。我改成只在职位真实变更时才写dateModified,SQLite里加个content_hash字段,比对不一致才更新,阈值就设成整段正文的MD5不同才触发。改完一个月,页面被引用的稳定性明显好了一截。
URL乱跳是我最想抽自己的地方。早期职位详情页一会儿带发布日期一会儿不带,同一岗位能整出三四个能访问的路径不骗你。我在Nginx里写了四十多条301规则,把带日期的、带查询参数的、大小写混用的全收敛到固定路径 /job/职位ID。用核子GEO跑了一遍检测,之前它标红的重复URL告警直接清零。
顺带说一句,我一直在纠结全站http跳https要不要上——后来想明白了,这事跟内链一样,属于基础卫生,不做模型连抓取都嫌你脏。现在三千多页平均内链还不到2,这才是真正要命的,得靠模板自动生成相关职位推荐慢慢补。
纠结了三天:http全站跳https到底值不值得做
这事我拖了三天没动手。不是技术难,是怕。
顾虑很实在:全站301,招聘站的职位页三千多条,收录本来就半死不活,万一跳完权重全掉,我这小站扛不住。Nginx配置改错一行,整站直接502,用户进不来,HR那边当天就得打电话骂人。还有证书续期,Let’s Encrypt三个月一到期,忘了续就是全站红锁,比不跳还难看。
我先在核子GEO上输入域名跑了一遍,AEO评估分数出来,HTTPS那一栏标着待改进。报告里写得很直白:模型抓取时对http源的信任权重偏低,混合内容会干扰页面解析。这句话点醒我了——我天天琢磨怎么让DeepSeek多引用我的职位页,结果源站还是http,等于自己给自己设卡。
决定做。挑了个周日晚上的流量低谷,动手。
Nginx里新加一个server块监听80端口,全部301到https,路径参数原样带过去。HSTS头我设了max-age 31536000,一年,省得反复折腾。证书走Let’s Encrypt的certbot自动续期,cron里挂了个每月检查任务。改完nginx -t测试通过,reload,盯着日志看了半小时,没报错。
观察期数据有点吓人。跳转后第3天,收录掉了示例值200条,我当时心里咯噔一下。第9天回补,还超过了原值。核子GEO的网站对比功能我前后各跑了一次,HTTPS信任分从62拉到89,AI引用率从不到5%爬到11%。
跳,必须跳。但记住一条:挑流量低谷期动手,别在招聘旺季的周一早上改配置,那是给自己找罪受。
12天后的真实数据:别信承诺,只看自己的监测
12天,我一个人蹲在服务器前盯日志。没买任何监测工具,Flask后台加了个中间件,把大模型爬虫的UA单独打到一个表里——GPTBot、DeepSeek的抓取UA、ClaudeBot这几个,挨个匹配。referer字段单独存,别跟普通搜索流量混在一起。
示例站点数据是这样的:AI引用率从不到1%爬到6%左右,职位页收录从1200涨到4300。这两个数字我不敢当承诺讲,不同站点差异太大了——招聘行业职位页更新频繁是优势,但如果你站上职位描述全是复制粘贴,DeepSeek照样不认。来自AI问答的落地页访问占比从0.3%到4.1%,这个数据是我最看重的,因为它直接对应真金白银。
监测方法说清楚,别整那些虚的。Nginx的access log里,我按UA做grep过滤,把referer里带deepseek、perplexity、chatgpt字样的请求单独统计。每天凌晨跑一次汇总,Flask写个路由返回JSON,我自己打开页面看。零成本。
http跳https这事我纠结了三天。兜底一句跳了。原因很简单——大模型抓取对协议一致性比人敏感,混合协议会拖慢首字节,我实测http页面平均响应比https慢0.4s左右。跳转规则用的301,Nginx里server块配了rewrite,保留路径参数。跳完第二天,DeepSeek的抓取频次从每天40多次涨到130次上下。
内链那摊子事还没收尾。平均内链数<2这个数,是我在核子GEO上输入域名跑了一遍检测才看清楚的——报告直接标红,说职位页之间的关联路径几乎是断的。我拿核子GEO的网站对比功能跟一个做得好的同行站比,人家职位页平均内链4.8,我这1.9。差距不是一点。
数据涨了,但别急着庆祝。监测这东西得一直挂着,AI引擎的抓取策略说变就变。下面那份避坑清单,是我这12天踩出来的。
避坑清单
坑1:以为HTTPS跳转是流量开关,结果跳完三个月没动静。我去年底手贱把全站http 301到https,以为能提权。跳完之后DeepSeek那边引用量纹丝没动,倒是Nginx日志里多了一堆跳转损耗。后来才想明白——AI引擎不在乎你协议是啥,在乎的是内容能不能被解析。跳转本身不带来流量,别把它当优化动作,它只是合规动作。
坑2:职位页JobPosting Schema只写了标题和公司名,漏了datePosted和validThrough。这是招聘站最致命的。我一开始图省事,结构化数据里就填了position和hiringOrganization两个字段。核子GEO上跑了一遍检测,结构化数据完整度评分才41分,AI抓取时根本判断不出这个职位还有没有效。补上发布日期和有效期之后,DeepSeek回答“XX城市最近在招的岗位”时才开始带我的页面。示例数据:补全后引用率从个位数百分比爬到两成出头。
坑3:3000个页面平均内链不到2条,指望AI自己爬明白。我SQLite里拉了一遍链接表,发现大部分职位页是孤岛。DeepSeek的检索是拆语义单元再全网捞,你页面之间没关联,它凭什么认为你是这个领域的垂直站?我用Flask写了个脚本,按城市+职能给每个职位页自动挂3到5条同城相关职位链接,跑完内链均值从1.8提到4.2。核子GEO的网站对比功能前后一跑,抓取深度明显不一样了。
坑4:职位更新频繁,旧页面不删也不标失效。招聘行业最坑的地方——岗位下架了页面还挂着。AI引用了一个已经招满的职位,用户点进来发现失效,行为数据一差,后续推荐直接把你降权。我现在的做法是过期职位页保留但加noindex,同时在Schema里把validThrough设成过去时间。
坑5:拿百度那套关键词密度往职位描述里塞。我试过在JD里堆“高薪”“急招”“五险一金”,密度拉到3%。结果DeepSeek生成的聚合答案里压根不提我。后来改成老老实实写岗位职责、技能要求、薪资区间,反而被引用了。大模型读的是语义,不是词频。
坑6:只盯DeepSeek,忘了页面本身得先能被正常抓取踩过这个坑。Nginx里我一度开了比较激进的限流,爬虫来一趟被挡回去。核子GEO上输入域名一测,抓取可达性直接标红。把UA白名单放行之后才恢复正常。
零预算做GEO,靠的就是把Schema写全、内链理顺、失效页管好。这三件事做完,再用核子GEO复测一遍,比花钱买什么工具都实在。