如何选择动态CSS选择器?批量爬取TMDB电影标题及流派咨询
嘿,这个问题我刚好碰到过,给你拆解成两部分来解决:
一、处理动态变化的CSS选择器
别盯着那些随机生成的类名(比如.7、.9)死磕,核心是找它们的共同特征:
- 锚定固定的父/祖先元素:比如所有电影标题都嵌套在一个带有固定类名的容器里(比如
.movie-grid),那可以用.movie-grid > div > h3(根据实际页面层级调整)来选中所有标题,完全不用管子元素的动态类名。 - 用属性选择器匹配规律:如果动态类名有固定前缀/后缀(比如都是
title-开头),可以用[class^="title-"]匹配前缀,[class$="-movie"]匹配后缀,一次性选中所有符合的元素。 - 利用伪类定位:如果每个电影项里的标题都是第一个
<h3>标签,直接用article h3:first-child就能选中所有标题,不用依赖类名。 - 注意动态渲染的情况:如果是JS加载的内容,浏览器里要等
DOMContentLoaded事件触发后再选择;爬虫工具里要用等待机制(比如Selenium的WebDriverWait)确保元素加载完成。
二、TMDB爬取电影标题+流派的解决方案
针对你遇到的随机类名问题,核心思路是跳过随机类,抓固定的结构特征:
步骤1:批量获取所有电影标题和详情页链接
在TMDB的列表页(比如热门电影页),先定位所有电影项的共同容器:
- 打开浏览器控制台,用
document.querySelectorAll()测试,比如先找所有电影卡片(通常是<article>或<div>,带有固定类名比如.card)。 - 遍历这些卡片,提取标题和详情页链接:
这样就能一次性拿到所有标题和对应的详情页链接,完全不用管每个标题的随机类名。// 示例代码(根据实际页面结构调整) const movieCards = document.querySelectorAll('article.card.movie'); const movieList = []; movieCards.forEach(card => { // 提取标题:找卡片里的标题元素(比如h3、span.title) const title = card.querySelector('h3').textContent.trim(); // 提取详情页链接:找卡片里的<a>标签 const detailUrl = card.querySelector('a').href; movieList.push({ title, detailUrl }); }); console.log(movieList);
步骤2:遍历详情页提取流派信息
拿到每个电影的详情页链接后,逐个访问页面,提取流派:
- TMDB详情页的流派通常在固定位置,比如带有
.genres类的容器里,里面的<a>标签就是各个流派:// 在详情页执行的代码 const genres = Array.from(document.querySelectorAll('.genres a')).map(genre => genre.textContent.trim()); console.log(genres);
更靠谱的替代方案:用TMDB官方API
爬网页容易因为页面结构变化失效,而且可能违反网站规则。TMDB提供了免费的官方API,调用起来更稳定合法:
- 先调用
/discover/movie或/movie/popular接口,获取电影列表(包含标题、电影ID)。 - 再用每个电影的ID调用
/movie/{movie_id}接口,返回的结果里直接有genres字段,不用费劲爬页面。
内容的提问来源于stack exchange,提问作者user3656280




