发了 200 篇文章,过了两周想确认哪些被百度收了。到搜索框一条条敲 site: 查询,查到第 30 条手就废了。批量核查收录是每个内容站的刚需,但这件事有个必须先说清楚的边界:搜索引擎没有公开的收录查询 API,任何批量查询本质都是在和对方的反爬机制打交道,所以脚本的正确姿势是慢、稳、粗查,快准狠交给官方平台。
脚本的思路:读一个 URL 清单,逐条拼 site: 查询,从返回的 HTML 里判断有没有结果。判断规则要写得宽松——不同时期结果页的提示文案会变,规则太精确过两天就误判。同时每个请求之间加 8 到 15 秒随机延时,遇到验证码或非 200 直接返回 None 标记人工复查,千万别硬刚,把出口 IP 搭进去整批查询全完蛋。
import time, requests, random
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/131.0.0.0 Safari/537.36"}
def check_baidu(url):
r = requests.get(
"https://www.百度.com/s",
params={"wd": "site:" + url},
headers=HEADERS, timeout=10)
if r.status_code != 200:
return None # 被风控,标记人工处理
if "百度安全验证" in r.text:
return None # 触发验证码,停止为宜
return "抱歉" not in r.text
urls = [line.strip() for line in open("urls.txt") if line.strip()]
for u in urls:
print(u, check_baidu(u), flush=True)
time.sleep(random.uniform(8, 15))
跑完把结果落成 CSV,三列:URL、状态(True 收录 / False 未收录 / None 待人工)、检查日期。None 的比例高就说明节奏太快,把延时再调大。验证脚本准确性别用全量清单,先抽 10 条和手工 site: 查询对照,判断规则对得上再放量。
# urls.txt 一行一个 URL
# https://www.网址 .com/seo/goaccess-log-panel.html
# https://www.网址 .com/seo/spider-404-audit.html
# 结果落盘
import csv
rows = []
for u in urls:
rows.append([u, check_baidu(u), time.strftime("%F")])
time.sleep(random.uniform(8, 15))
csv.writer(open("indexed_check.csv", "w", newline="",
encoding="utf-8-sig")).writerows(rows)
必须交代清楚口径问题:site: 查询结果只做参考,不作准数。百度侧的权威数据是搜索资源平台的普通收录和索引量工具,按天给全站收录曲线;Google 侧的权威数据是 Search Console 的“网页索引编制”报告,官方明确说明索引状态以该报告为准。脚本的正确用法是“定位到具体文章”的粗查——平台告诉你收录总量掉了,脚本帮你找到是哪 20 篇没进库,两者配合才闭环。清单排优先级也有讲究:新发布的文章排前面查,老文章一两个月核查一轮就够,别把时间花在不会变的存量上。
# Google 侧同理,查询参数换成 site:,解析逻辑要按
# Google 结果页调整;频率再放慢一档
# def check_google(url):
# r = requests.get("https://www.谷歌 .com/search",
# params={"q": "site:" + url},
# headers=HEADERS, timeout=10)
收尾提醒一句场景边界:这种批量查询脚本放在自己服务器上低频跑自己的站,属于灰色但普遍的运维手段;但拿去批量查别人家的站、或者开高并发跑,性质就变成爬虫对抗了,封 IP 是轻的。工具没有善恶,用法有。
相关阅读:批量核查别天天做,每周一次足够。《SEO 自动化总清单:日、周、月、季各该跑什么》把它排进每周组,配合日报三本账,收录波动周内闭环。
A5创业网 版权所有