谷歌SEO 网站迁移 301 映射脚本:旧站 URL 自动匹配新站结构
网站迁移(换域名/换 CMS/改版)是 SEO 最容易翻车的操作:旧 URL 没有 301,权重全丢、收录归零。本篇给一个可运行的映射脚本,把旧站 URL 清单自动匹配到新站 URL,输出 301 映射表。迁移官方规范见搜索中心站点迁移文档。
一、迁移翻车的原因
| 环节 | 常见错误 | 后果 |
|---|---|---|
| 映射 | 只做了域名级 301 | 权重被首页吸走 |
| 清单 | 漏掉老文章 | 收录归零 |
| 顺序 | 先切 DNS 后配 301 | 空档期 404 |
| 验证 | 没查重定向链 | 301 链过长丢权重 |
核心原则:逐条 URL 映射,不是整站跳首页。脚本帮你把旧 URL 与结构类似的新 URL 自动配对,剩下少量手工确认。
二、数据准备
- 旧站全量 URL:导出旧 sitemap 或爬取,存
old_urls.txt。 - 新站全量 URL:导出新 sitemap,存
new_urls.txt。 - 两个文件每行一个 URL,UTF-8。
三、301 映射脚本
python
import re
from urllib.parse import urlparse, unquote
def normalize(u):
p = urlparse(unquote(u))
segs = [s for s in p.path.split("/") if s and s != "index"]
return p.netloc, "/" + "/".join(segs).lower()
old = [u.strip() for u in open("old_urls.txt", encoding="utf-8") if u.strip()]
new = [u.strip() for u in open("new_urls.txt", encoding="utf-8") if u.strip()]
new_norm = {}
for u in new:
host, path = normalize(u)
new_norm.setdefault(path, []).append(u)
def similarity(a, b):
sa, sb = set(a.split("/")), set(b.split("/"))
return len(sa & sb) / max(1, len(sa | sb))
print("=== 301 映射建议 ===")
mapped, manual = [], []
for u in old:
host, path = normalize(u)
if path in new_norm:
mapped.append((u, new_norm[path][0], 1.0))
continue
best, best_sim = None, 0
for np_ in new_norm:
s = similarity(path, np_)
if s > best_sim:
best, best_sim = np_, s
if best and best_sim >= 0.5:
mapped.append((u, new_norm[best][0], round(best_sim, 2)))
else:
manual.append(u)
with open("301_mapping.csv", "w", encoding="utf-8-sig", newline="") as f:
import csv
w = csv.writer(f)
w.writerow(["old_url", "new_url", "similarity"])
for a, b, s in mapped:
w.writerow([a, b, s])
print(f"自动映射 {len(mapped)} 条(已写入 301_mapping.csv)")
print(f"需人工确认 {len(manual)} 条:")
for u in manual[:15]:
print(f" {u[:90]}")
四、输出解读与动作
| 输出 | 判定 | 动作 |
|---|---|---|
| similarity=1.0 | 完全匹配 | 直接采用 |
| similarity 0.6-0.9 | 结构相近 | 人工抽查后采用 |
| similarity 0.5-0.6 | 勉强匹配 | 人工核对意图 |
| 未匹配清单 | 无对应新页 | 决定删除/重建/跳相关页 |
硬决策规则:相似度 <0.5 的旧 URL 禁止自动映射,必须人工判断;每条映射必须是 301(永久),禁止用 302 迁站。
五、常见坑
| 坑 | 后果 | 正解 |
|---|---|---|
| 只映射主域名 | 权重全到首页 | 逐条 URL 映射 |
| 301 链 >3 跳 | 权重流失 | 直接映射最终 URL |
| 新旧混跑期太长 | 数据混乱 | 一次切换,别长期双跑 |
| 忘了更新 sitemap | 新 URL 不收录 | 迁移后提交新 sitemap |
| 没保留旧域名证书 | 旧域名 404 | 旧域名续期并配 301 |
六、FAQ
Q1:相似度多少才算可自动映射?
0.9+ 放心用;0.6-0.9 抽查;<0.6 全部人工。
Q2:迁移后多久恢复排名?
通常 2-6 周恢复,取决于站点规模与重定向正确度。用 GSC 的"页面迁移"报告跟踪(参考迁移跟踪文档)。
Q3:不相关的旧页怎么办?
原则是删除前先想:能否 301 到新站最相关的页面;实在没有就让它 404,别硬映射到首页。
七、行动清单
- 导出旧/新全量 URL,跑 301 映射脚本。
- 人工确认低相似度条目,生成最终映射表。
- 服务器配好逐条 301(.htaccess / nginx rewrite),避免重定向链。
- 切换后提交新 sitemap,旧域名保持 301 至少 6 个月。
- 用 GSC 监控迁移期抓取与索引变化,及时修异常。
完整版迁移映射脚本(含栏目智能归类、404 兜底策略、重定向链检测模块)我整理成了 PDF,评论区扣「迁移」或私信我,免费发你。也欢迎一起交流谷歌SEO实战问题。