直接抓取竞品网站html无法获取真实seo关键词,因robots.txt常禁止访问、关键词数据不在源码中,且meta keywords已失效;需通过hreflang、锚文本、结构化数据等可爬信号交叉验证意图布局。

直接抓取竞品网站的SEO关键词布局不可行——robots.txt 通常禁止爬虫访问关键页面,且多数关键词数据(如搜索量、排名位置、点击率)根本不在HTML源码里,而是由搜索引擎或第三方工具(Ahrefs、SE Ranking)通过API聚合生成。
为什么不能靠解析HTML获取真实SEO关键词
竞品网页的 <meta name="keywords"> 标签早已被主流搜索引擎忽略,几乎无实际SEO价值;而真正影响排名的关键词往往藏在标题、H1、正文语义结构、内部链接锚文本中——但这些只是“表层信号”,不等于该页面当前在搜素引擎中实际覆盖的词。你看到的 title 是人工写的,不是算法认定的覆盖词。
常见错误现象:
- 用
BeautifulSoup提取所有<h1></h1>和<title></title>后做词频统计,结果和真实搜索表现偏差极大 - 把 Google 搜索
site:example.com "keyword"的返回结果当作关键词覆盖证据(实际是缓存快照+去重逻辑干扰) - 误以为爬到
/sitemap.xml就能反推出核心词——sitemap 只反映URL结构,不带搜索意图标签
可行路径:从公开可抓内容反推关键词策略
虽然拿不到真实搜索词报告,但可通过三类可爬数据交叉验证竞品的关键词意图布局:
-
hreflang+rel="canonical"配置:判断是否在做多语言/多区域关键词分流(例如en-usvsen-gb页面差异) - 页面内
<a></a>锚文本分布:统计高频内部链接文字(如“best CRM software for small business”),这类长尾词往往是竞品主动优化的目标 - 结构化数据标记:
Article、FAQPage、HowTo等script[type="application/ld+json"]内容,常对应高意图问答类关键词
示例:提取锚文本并过滤停用词
from bs4 import BeautifulSoup
import requests
<p>soup = BeautifulSoup(requests.get("<a href="https://www.php.cn/link/16988ae3ee52b07ee03f2818dd42f4e3">https://competitor.com").text</a>, "html.parser")
anchors = [a.get_text().strip() for a in soup.find_all("a", href=True) if a.get_text().strip()]</p><h1>过滤掉"Read more", "Learn more"等泛化锚文本</h1><p>keywords = [kw for kw in anchors if len(kw.split()) > 2 and "more" not in kw.lower()]
</p>
绕过封禁与获取更可靠信号的实操建议
竞品网站常通过 User-Agent 检查、IP频率限制、JavaScript 渲染拦截爬虫。硬爬不仅低效,还容易触发 403 或返回空内容。
- 优先请求
https://competitor.com/robots.txt,检查是否允许/sitemap.xml或/sitemap_index.xml——这是最合规的数据入口 - 对含大量JS渲染的页面(如 Next.js / Vue SPA),放弃直接
requests.get(),改用playwright启动无头浏览器并等待networkidle,再提取document.title和document.querySelector("main")文本 - 避免高频请求:设置
time.sleep(2),使用requests.Session()复用连接,添加真实User-Agent头(如"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36")
真正的关键词布局分析,80%工作在清洗和关联环节:把锚文本、H2标题、FAQ问题、schema中的 question 字段归到同一语义簇,再比对自身页面缺失的簇——这才是可落地的优化点。别指望爬虫吐出一份“Top 100 Keywords”Excel。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











