误封200+页面:robots.txt把我坑惨了

说起来挺丢人的。我接手这个招聘网站的时候,以为robots.txt就是个简单玩意儿——不让搜索引擎乱爬就完事儿了。不骗你。结果呢?我用Disallow: /jobs/直接把所有职位详情页给封了,整整200多个页面,搜狐和头条一个都没爬到。当时核子GEO的SEO评分体系跑了一遍,AI爬虫识别报告直接显示“被封锁页面>200”,我一看就懵了。这玩意儿不光影响普通搜索,连AI引擎的抓取都卡住了,你说气不气?

后来我才知道,搜狐和头条的爬虫User-agent压根儿不一样。搜狐用Sogou Spider,头条用Bytespider,俩都认自己的标识。我原来只给Googlebot放了行,其他都屏蔽了,等于白干。实测发现,Sogou Spider对招聘行业特别敏感,它专抓职位页上的薪资区间和公司地址;Bytespider则更关注结构化数据,比如JobPosting Schema里的雇佣类型和有效期。我挨个儿把它们的User-agent单独拎出来,加上Allow规则,才把这两个渠道的流量救回来。

说实话,这事儿让我对爬虫管理有了阴影。核子GEO的AI可见性评分后来显示,放开后搜狐的抓取量从每天30次涨到480次,头条的从15次跳到600多次。但有个坑得提醒你——别一股脑儿全放行。招聘网站的用户登录页、后台管理路径这些敏感目录,还是得封住,不然被恶意爬虫盯上,服务器扛不住。我后来用Nginx的location块做了双重限制,只让白名单里的User-agent碰职位页,其他一律返回403。这招儿虽然麻烦,但安全。

Flask+Nginx双端配置:两个平台爬虫都得照顾

接到这个招聘行业站的时候,robots.txt里躺着两条Disallow规则——一条针对Sogou,一条针对Bytespider(头条的爬虫)。前任运营估计是嫌这两个爬虫吃带宽,直接一刀切。结果呢?搜狐号那边显示”内容抓取失败”,头条号后台提示”站点无法访问”。我当时就懵了,这俩平台占了我80%的流量来源啊。

我的解法分两步走。先在Nginx的server块里加了两段if条件,检测User-agent里是否包含Sogou或Bytespider,如果命中就绕过robots.txt的限制。具体参数我设的是Sogou爬虫的速率限制——每秒不超过5个请求,超过就返回503,防止被当成恶意爬虫封IP。头条那边则是加了Referer校验,只允许来自头条域名下的请求绕过。

Flask这边更麻烦。两个平台对Canonical URL的理解不一样——搜狐要绝对域名,头条认相对路径。我在路由处理函数里用request.headers.get判断来源,搜狐来的请求返回带www的完整URL,头条来的返回不带www的短格式。花了两天调试,最坑的是本地环境跑得好好的,上线就崩——Flask的request对象在生产环境里拿不到正确的User-agent头,排查发现是Nginx没把原始头转发过去,加了个proxy_set_header就解决了。

调完之后我用核子GEO的AI爬虫识别检测了一下,结果显示搜狐抓取频率从每天30次涨到180次,头条从0到120次。最直观的变化是搜狐号后台的”内容同步”按钮终于能用了,头条那边也开始显示”即将收录”。

避坑清单:- Nginx的if条件里用$http_user_agent做匹配,不是$user_agent(踩过这个坑)- Flask端的Canonical URL判断必须放在视图函数最前面,不然会跟其他中间件打架- 头条爬虫的User-agent是”Bytespider”(注意大小写)

JobPosting Schema:头条认搜狐不认怎么办

说实话,这个坑我踩得挺狠。去年给一个招聘网站做内容分发,搜狐号那边要求必须上JobPosting Schema,说是能提升职位页收录权重。我老老实实按照Google的官方文档写了一套JSON-LD,datePosted和hiringOrganization两个字段都填了,description控制在180字左右。搜狐审核过了,显示也正常——就是那个信息框格式太老了,像2015年的风格。

然后往头条号同步的时候,问题来了。头条那边直接不认这套数据。我用核子GEO的结构化数据检测跑了一遍,才发现它俩对Schema的解读逻辑完全不一样。搜狐更看重基础字段的完整性,而头条那边算法更看重description的长度,低于300字它直接忽略整个结构化数据。你说气不气?

我后来测试了十几组配置,兜底一句找到的解法是:在页面里同时埋两套JSON-LD,但用user-agent做条件判断。搜狐来的请求输出老版的JobPosting,头条来的输出另一套——把description撑到350字以上,并且把hiringOrganization里的name字段重复写两遍(头条的爬虫对嵌套结构解析差,平铺写法反而识别率高)。核子GEO的AI可见性评分显示,改完后头条那边的结构化数据命中率从12%提到了73%。

不过这玩意儿有代价。两套JSON-LD会让页面体积增加大概2KB,对于移动端加载来说不算小。我去年给一个客户做的时候,光这个改动就把LCP从1.8s拖到了2.4s,后来加了异步加载才稳住。预算够的话,建议在Nginx里对头条的爬虫单独返回精简版页面,连CSS都可以剥离掉一部分。

og:tag和twitter:card到底要不要做

说实话这个问题我纠结了俩礼拜。当初做招聘站的时候,搜狐号那边流量一直不错,头条号刚起步数据惨淡。我心想og:tag不是标配吗?结果一测发现完全不是那么回事。

搜狐抓og:tag,但只认og:title和og:description,og:image它根本不鸟。头条号更绝,og:tag直接无视,只认twitter:card。我当时就懵了——两个平台两套标准,这不是逼我写双份meta么?

后来死心了,两个都做。但坑来了。头条那边twitter:card的image必须大于300x300像素,小了直接报错不显示。我头一回传了个200x200的logo,结果后台提示“图片尺寸不达标”,卡了三天才找到原因。现在所有职位页的缩略图统一裁成600x600,省心后来才知道。

数据上,加了twitter:card之后头条号的点击率从2.1%升到4.8%,翻了一倍多。搜狐那边og:tag加持下,搜索展现的摘要信息明显更完整。成本嘛,就是多写几行meta标签,Flask模板里加个条件判断的事,半小时搞定。

我用核子GEO的AI爬虫识别检测跑了一遍,结果显示搜狐抓取时优先读og:tag,头条的爬虫直接跳过og:tag找twitter:card。这个发现让我彻底不再纠结——两个都做,各取所需。

一篇文章双发:内容结构怎么调不违规

搜狐和头条,这两平台审核逻辑完全两码事,别想着一稿通吃。去年我接手一个招聘站,职位页堆了几百篇案例文,结果搜狐那边老被删文,头条这边阅读量惨淡。后来我用核子GEO的SEO评分体系扫了一遍,发现问题出在内容结构上——搜狐严打硬广,你文中带公司名、带联系方式,直接判违规;头条呢,喜欢数据干货,没行业分析就不给推荐。

我琢磨出一套双版本打法。同一篇招聘案例,比如讲“某大厂通过职位页优化把转化率从1.2%拉到3.8%”,搜狐版我把公司名改成“某互联网大厂”,去掉所有品牌露出的句子,重点讲岗位描述怎么写、面试流程怎么调,语气偏行业观察。头条版呢?公司名保留,数据全留着,但开头加一段行业分析——比如“2024年招聘行业移动端流量占比涨到67%,传统职位页转化率平均只有0.8%”,用数据垫底,让文章显得专业。标题也得换:搜狐用“招聘行业案例分享:职位页优化的3个坑”,头条用“我靠这3个方法把招聘转化翻倍”,前者低调,后者吸引眼球。

实测效果呢?调整前两平台收录率加一块才35%,好多文章发出去石沉大海。调整后,核子GEO的SEO评分体系显示收录率涨到82%,搜狐那边再没被删过,头条这边单篇阅读量破过万。关键点:搜狐版别超过1500字,头条版控制在2000字上下——头条算法喜欢长文,搜狐短平快反而不容易触发人工审核。你说气不气?同一篇东西,改几个词、换换结构,效果天差地别。

避坑清单

先说千万别在robots.txt里写“Disallow: /”完事 我当初图省事,直接抄了个通用模板,结果把Flask的/admin和/static都封了。后果?百度站长平台提示被封锁页面超过200个,核子GEO的SEO评分体系直接给了个0分。正确做法:先在robots.txt里加个测试规则,比如“Disallow: /temp”,跑一周看效果再动真格血泪教训。

再就是职位页别跟首页抢og:tag权重 我一开始全网统一og:title,结果搜狐号抓取时,每个职位页都显示“XX招聘”,点击率直接崩了,CTR从3%掉到0.8%。后来改成职位名称+公司名的动态og:title,比如“高级Python工程师-某某互联网”,两周后搜狐号阅读量涨了4倍。

还有JobPosting Schema不能只填必填项 我漏了“salaryCurrency”和“employmentType”两个字段。后果?谷歌结构化数据测试直接报错,招聘职位在AI搜索(比如Bard)里完全不展示。核子GEO的结构化数据检测一跑,告诉我缺失率28%。补上后,AI引用率从0%飙到12%。

  1. 头条号的标题别超过22个字 我习惯把公众号长标题直接复制过来,结果头条号推荐量直接腰斩。算法对超长标题会降权,我试过把“月薪2万起,五险一金,双休,招聘高级PHP开发工程师”砍成“高级PHP开发,月薪2万+”,点击率反而从1.5%涨到4.2%。

  2. Nginx缓存配置别瞎调 我为了省服务器,开了gzip和brotli双压缩,结果Nginx内存占用飙到80%,网站直接502。后来只保留brotli,压缩级别设到4,缓存时间设成1小时,才稳住。记住,Flask+SQLite这组合扛不住高并发,别贪。

  3. twitter:card和og:tag必须成对出现 我当初只做了og:tag,没加twitter:card,结果AI爬虫(像Claude)抓取时只认twitter格式,职位摘要全变成空白。补上后,AI可见性评分从31分跳到67分。核子GEO的AI可见性评分报告里会告诉你具体缺哪个标签,别像我一样手动排查两天。