不能直接用python批量获取百度真实搜索排名,因百度封禁自动化爬取且结果高度动态;requests+beautifulsoup无法获取真实排名,因pc端结果由js渲染,移动端需校验ua/cookie等;替代方案为百度官方api或第三方seo工具api。

不能直接用 Python 批量获取百度真实搜索结果页的关键词排名——百度明确封禁自动化爬取,且返回结果高度动态(IP、登录态、设备、历史行为均影响排序),所谓“排名”本身在未登录、无点击、无停留的请求中毫无业务意义。
为什么 requests + BeautifulSoup 拿不到真实排名?
百度 PC 端搜索结果页的主体内容(尤其是自然结果)由 JavaScript 动态渲染,requests 获取到的 HTML 里只有占位 div 和骨架结构,关键链接和标题藏在 JSON 数据或后续 XHR 请求中;移动端(m.baidu.com)虽有部分 SSR,但会校验 User-Agent、Cookie、Referer,甚至要求执行前端验证逻辑(如 bd__cbs__xxx 回调)。
常见错误现象包括:
- 返回 302 跳转到验证码页(
https://www.baidu.com/verify/index?) - 返回空列表或仅广告位(
id="content_left"下无class="result") - 拿到的链接是跳转中间页(
https://www.baidu.com/link?url=...),非真实目标 URL
如果只是做竞品词监测,该用什么替代方案?
真正可用的路径只有两条:一是走百度官方 API(需企业资质+付费),二是用第三方 SEO 工具的开放接口(如 Ahrefs、SE Ranking、5118 的 API),它们通过分布式真实浏览器集群模拟搜索,再聚合统计排名数据。
若必须本地轻量实现(仅限测试/学习),可考虑:
- 用
selenium启动带用户配置的 Chrome(加载user-data-dir,复用登录态),但需处理滑块验证、频率限流、页面懒加载(scrollIntoView触发) - 改用百度站长平台提供的
site:查询接口(https://zhanzhang.baidu.com/api/search?site=example.com&word=keyword),但它只返回该站点在百度索引中的总结果数,不提供排序位置 - 放弃“百度排名”,转向 Google(
googlesearch-python库可稳定获取前 100 条,但需注意google.com的反爬策略升级频繁)
如何解析百度 SERP 中的真实目标 URL?
即使绕过反爬拿到页面 HTML,a 标签的 href 属性也不是最终地址。百度对所有自然结果链接做了跳转封装,真实 URL 存储在 data-url 属性或 onmousedown 事件字符串里(如 onmousedown="return c({'fm':'search','tab':'result','title':'xxx','url':'https://example.com'})")。
安全提取方式为:
- 优先读取
data-url属性(现代百度 PC 端已普遍支持) - fallback 到正则提取
onmousedown中的url:'(https?://[^']+)' - 绝对不要直接访问
https://www.baidu.com/link?url=...并依赖重定向——百度可能返回 403 或插入二次跳转
示例片段:
from bs4 import BeautifulSoup
import re
html = "<a data-url="https://real.example.com" onmousedown='\"return' c>"
soup = BeautifulSoup(html, 'html.parser')
a = soup.find('a')
real_url = a.get('data-url') or re.search(r"url:'(https?://[^']+)'", a.get('onmousedown', '')).group(1)
</a>
真正的难点不在代码怎么写,而在于你拿到的“第3名”在另一台机器、另一个时间、另一个账号下大概率变成第7名或根本不出现在首页——百度排名本质是个性化快照,不是数据库里的一条固定记录。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











