You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何选择动态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

火山引擎 最新活动