网站SEO检测·百度收录与推送·死链检查·站长工具
什么时候用
- 用户说「我的站百度搜不到 / 百度不收录 / 帮我看看 SEO / 查一下死链」。
- 新站上线、改版、加了新页面,想让百度快点知道。
- 想要一份 sitemap.xml / robots.txt,或者要一份死链清单去百度提交。
前提:用户得能改自己网站的文件(或有人帮他改)。体检只能看出问题,修要改网页。第一次对话就把这句说清楚,别让用户以为跑完脚本排名就变了。
所有脚本都是 Python 标准库写的,不用装任何第三方包,要求 Python 3.8 以上(python --version 确认)。Windows / macOS / Linux 通用。本机访问某些网站需要代理时,每个脚本都可以加 --proxy http://127.0.0.1:端口,也会自动读取系统的 HTTPS_PROXY 环境变量。
四个脚本
1. 体检:scripts/audit.py
python {baseDir}/scripts/audit.py <网址或 sitemap 地址> [--max 200] [--out report.md] [--json report.json]
[--deadlinks-out 死链.txt] [--only-page] [--no-links] [--timeout 20]
- 先过首页门槛:用常见浏览器的身份打开首页。被拦(403/429/503、人机验证页、内容几乎为空)就自动换百度蜘蛛身份再试一次;报告第一段会写明「访问身份」。
- 首页打不开就只出诊断:域名解析不到 / 超时 / 被防火墙拦截 / 内容几乎为空 / 证书问题,这时只输出一段诊断和下一步建议,不出完整报告(否则每一项都会误报)。此时退出码为 1,照诊断内容转述给用户即可,不要自己再编一份报告。
- 给首页:自动读 robots.txt 里写的 sitemap(没写就试
/sitemap.xml),逐页体检,最多 200 页。 - 给 sitemap 地址:展开后逐页体检。给内页:只体检那一页;首页只想看一页时加
--only-page。 - 站内死链:默认会检查抓到的页面里所有指向本站的链接(最多 300 个),打不开的列进报告。加
--deadlinks-out 死链.txt会同时存一份一行一个地址的清单,可上传到百度搜索资源平台的「死链提交」。不想查就加--no-links。 - 并发 5、单个请求等 20 秒;网站慢就加
--timeout 40。
检查项、问题名和修法见 references/checklist.md。
2. 百度推送(主推):scripts/baidu.py
python {baseDir}/scripts/baidu.py --site https://example.com --token <准入密钥> --sitemap --dry-run
python {baseDir}/scripts/baidu.py --site https://example.com --token <准入密钥> https://example.com/新页面
python {baseDir}/scripts/baidu.py --site https://example.com --token <准入密钥> --file 网址清单.txt
- 准入密钥在「百度搜索资源平台 → 普通收录 → API 提交」页面,接口地址里
token=后面那串;也可以放进环境变量BAIDU_PUSH_TOKEN。 --site的写法要和百度后台验证的站点完全一致(http/https、有没有 www)。子域名各算一个站,密钥不通用。- 结果会说:成功推了几条、今天还能推几条(额度用完就等明天)、有几条因为不属于本站或格式不对被丢掉。
- 一次最多推 2000 条。先用
--dry-run试运行,用户确认后再去掉。
3. 生成 sitemap / robots:scripts/sitemap.py
python {baseDir}/scripts/sitemap.py <网站根目录> --origin https://example.com [--en-prefix en] [--out <输出目录>]
- 扫目录下所有
.html,index.html对应目录地址;带「禁止收录」标记的页面和 404/500 页自动排除。 - 有
--en-prefix en时把/foo与/en/foo配成中英一对,互相标注。 - 不带
--out直接打印;带--out写文件,已存在的不覆盖(要覆盖得加--force,且要先问用户)。 - 生成后提醒用户:上传到网站根目录,再到百度搜索资源平台「普通收录 → sitemap」提交。
4. IndexNow 推送(可选,必应等搜索引擎可选):scripts/indexnow.py
百度不支持 IndexNow。用户的站也想让必应等搜索引擎快点知道时才用它,国内站长不用也行。
python {baseDir}/scripts/indexnow.py --host example.com # 生成密钥并说明放在哪
python {baseDir}/scripts/indexnow.py --host example.com --key <密钥> --sitemap --dry-run
- 没有
--key就现场生成一个,让用户在站根放<密钥>.txt,内容就是密钥本身;放好再带--key跑。 - 推送前先检查密钥文件能不能打开、内容对不对,不对就不推。先
--dry-run。 - 返回 200/202 表示收到;403 密钥文件不对;422 网址和域名对不上;429 推太频繁,等几分钟,别反复重试。
报告怎么讲给用户
- 先说最严重的三件(报告里「先修这三件」那段)。一次只让用户面对三件事。
- 每件说三句:哪儿坏了 → 会有什么后果 → 改哪一行。别说「优化 TDK」「提升权重」这种黑话,要说「首页没有规范地址,百度可能把带参数的地址当成另一个页面;在
<head>里加一行<link rel="canonical" href="https://…/">」。 - 逐页表格是给用户对照用的,别在对话里逐行念。用户问某一页再展开。
- 严重度:严重=影响能不能被收录(打不开、死链、禁止收录、没规范地址、没手机适配、没标题、正文为空、robots 屏蔽);中等=影响百度结果长什么样(描述、标题长度、主标题、分享卡片);轻微=锦上添花。轻微项别排在前面讲。
- 如果报告写着「浏览器身份被拦、改用百度蜘蛛身份」,要提醒用户:真实访客也可能被防火墙拦,去后台看看规则。
- 修完再推送:先把 sitemap 弄对,再用百度推送。顺序反了等于把坏页面报给百度。
- 推送前必须让用户确认一次(推哪个站、多少条),默认先跑
--dry-run。
边界(要对用户说清楚)
- 只做站内技术项:不买外链、不交换友链、不发垃圾外链,也不提供这类服务。
- 不做黑帽:不做隐藏文字、关键词堆砌、门页、对搜索引擎和用户显示不同内容。用户要求这类做法直接拒绝,并说明会被降权甚至清除收录。
- 不承诺排名:收录不等于排名,推送不等于收录。推送只是告诉百度「这页变了」,收不收、何时收、排第几都由搜索引擎决定。任何「几天上首页」的说法都不要给。
- 不代替用户改网站:脚本只读线上页面、只读本地目录;生成的文件默认不覆盖已有文件。改网页、放密钥文件、上传 sitemap 由用户自己做(或明确授权后再做)。
- 百度准入密钥、IndexNow 密钥是用户的凭据:不要写进聊天以外的地方,不要提交进代码仓库,不要转给第三方。
- 别人的网站可以体检,不能推送:推送要求你是站点所有者。
- 换百度蜘蛛身份只为判断「百度能不能看到」,每次体检只在首页被拦时换一次。不是用户自己的网站被拦了,就如实说「对方网站限制访问」,不要想办法反复绕过去抓。
- 只抓网页源代码、只跟随 sitemap,不执行脚本。纯前端渲染的站会显得「什么都没有」,要提醒用户:百度的抓取看到的也大致是这个样子。
典型流程
audit.py <首页>→ 首页打不开就转述诊断、停在这一步;能打开就念「先修这三件」。- 用户改完 → 再跑一次确认修掉了。
- 有死链 →
--deadlinks-out 死链.txt导出,确认页面确实已删除后到百度「死链提交」上传。 - 需要 sitemap 就
sitemap.py <本地目录>生成,用户上传到站根,并在 robots.txt 里加Sitemap:行。 baidu.py --site … --dry-run→ 确认 → 真推,留意「今天还能推几条」。- 用户也关心必应等搜索引擎时,再按需用
indexnow.py。