
现代网站为了优化性能、实现组件化或防止简单爬虫,常常会采用前端框架(如React、Vue、Angular)来动态生成CSS类名。这些类名通常包含随机字符或哈希值,例如media-story-card__body__3tRWy,与传统的稳定类名(如search-result-content)形成鲜明对比。当类名频繁变化时,依赖固定类名进行元素选择的爬虫会很快失效,导致数据抓取失败。
对于网络爬虫开发者而言,这意味着不能简单地复制浏览器开发者工具中看到的完整类名来定位元素。我们需要一种更灵活、更具韧性的选择策略。
CSS属性选择器提供了一种强大的方式,允许我们根据元素的属性及其值来选择元素,而不仅仅是ID或完整的类名。当类名具有可预测的前缀但后缀随机时,属性选择器显得尤为有效。
这是解决动态类名问题的核心方法。它允许我们选择那些指定属性值以特定字符串开头的元素。
立即学习“Python免费学习笔记(深入)”;
语法: [attribute^="prefix_value"]
示例: 如果一个元素的类名是media-story-card__body__3tRWy,我们可以观察到media-story-card__body__这部分是相对稳定的前缀。因此,我们可以使用div[class^="media-story-card__body__"]来选择所有类名以media-story-card__body__开头的div元素。
除了“以...开头”的选择器,还有其他几种属性选择器在不同场景下也很有用:
下面我们将通过一个具体的Python爬虫示例来展示如何应用CSS属性选择器。
原始问题代码(可能失效):
from bs4 import BeautifulSoup
import requests
from rich.pretty import pprint
text = "hello"
url = f"https://www.reuters.com/site-search/?query={text}"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")
# 尝试直接选择完整的动态类名,这很容易失效
results = soup.select("div.media-story-card__body__3tRWy")
for result in results:
pprint(result)
pprint("###############")在上述代码中,div.media-story-card__body__3tRWy这种选择器依赖于完整的动态类名,一旦3tRWy部分发生变化,代码就会失效,无法抓取到任何结果。
优化后的代码(使用属性选择器):
from bs4 import BeautifulSoup
import requests
from rich.pretty import pprint
text = "hello"
url = f"https://www.reuters.com/site-search/?query={text}"
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
soup = BeautifulSoup(response.text, "lxml")
# 使用CSS属性选择器:选择所有类名以"media-story-card__body__"开头的div元素
# 这样即使类名后缀随机变化,只要前缀稳定,也能准确选中
results = soup.select('div[class^="media-story-card__body__"]')
if not results:
print(f"未找到匹配 '{text}' 的结果,请检查选择器或网页结构。")
for i, result in enumerate(results):
print(f"--- 结果 {i+1} ---")
# 这里可以进一步解析每个result,例如提取标题、链接等
# 假设标题在一个a标签内,且其类名也可能部分动态
title_tag = result.select_one('a[class^="media-story-card__heading__"]')
if title_tag:
pprint(f"标题: {title_tag.get_text(strip=True)}")
pprint(f"链接: {title_tag['href']}")
else:
pprint("未找到标题或链接。")
print("###############")代码解析:
面对现代网站中常见的动态CSS类名,直接使用完整的类名进行选择是不可靠的。通过掌握CSS属性选择器,特别是“以...开头”的选择器([attribute^="value"]),我们可以编写出更具鲁棒性的网络爬虫。结合浏览器开发者工具进行细致的分析,选择最稳定的属性前缀,并灵活运用其他选择器,将大大提高爬虫的成功率和维护性。在遇到极端情况时,也应考虑探索API接口或使用无头浏览器等高级策略。
以上就是Python网络爬虫:应对动态CSS类名选择的策略的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号