
本文介绍如何使用 selenium 模拟用户点击 imdb 剧集页的“30 more”按钮,突破初始仅加载 50 集的限制,完整抓取全部 80 集的标题与链接,避免静态请求无法触发动态加载的问题。
本文介绍如何使用 selenium 模拟用户点击 imdb 剧集页的“30 more”按钮,突破初始仅加载 50 集的限制,完整抓取全部 80 集的标题与链接,避免静态请求无法触发动态加载的问题。
IMDb 剧集页面(如《La Casa de Papel》S1:tt5189554)默认仅渲染前 50 集,剩余剧集需通过点击「30 more」按钮动态加载——该操作由前端 JavaScript 触发,无法通过单纯 requests + BeautifulSoup 实现,因为其依赖 DOM 交互与异步内容注入。
推荐方案是使用 Selenium WebDriver 模拟真实浏览器行为,精准定位并点击分页按钮,等待新内容加载后解析完整 HTML。以下是可直接运行的专业级实现:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time
# 初始化 Chrome WebDriver(需提前安装 chromedriver 并确保在 PATH 中)
driver = webdriver.Chrome()
try:
# 访问指定季的剧集页(务必带 ?season=1 参数以确保结构稳定)
driver.get('https://www.imdb.com/title/tt5189554/episodes/?season=1')
# 显式等待「30 more」按钮可点击(更可靠 than time.sleep)
wait = WebDriverWait(driver, 10)
load_more_btn = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '.ipc-see-more__button'))
)
# 使用 JavaScript 点击(绕过可能的遮罩层或滚动问题)
driver.execute_script("arguments[0].click();", load_more_btn)
# 等待新剧集 DOM 元素渲染完成(建议用显式等待替代固定 sleep)
wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'article.episode-item-wrapper')))
# 解析完整页面源码
soup = BeautifulSoup(driver.page_source, 'html.parser')
episodes = []
for item in soup.select('article.episode-item-wrapper'):
title_elem = item.select_one('h4')
link_elem = item.select_one('a')
if title_elem and link_elem:
episodes.append({
'title': title_elem.get_text(strip=True),
'link': 'https://www.imdb.com' + link_elem.get('href', '')
})
print(f"成功获取 {len(episodes)} 集数据")
for ep in episodes[:3]: # 示例输出前3条
print(f"- {ep['title']} → {ep['link']}")
finally:
driver.quit() # 关键:务必关闭浏览器释放资源✅ 关键要点说明:
-
必须使用
?season=1参数:避免 IMDb 重定向或响应结构不一致; -
优先选用
WebDriverWait而非time.sleep():提升稳定性与执行效率; -
用
execute_script(...click())替代click():规避元素被遮挡、未滚动到视口等常见异常; -
注意反爬策略:生产环境应添加随机 User-Agent、设置合理延迟,并遵守
robots.txt; - 替代方案提示:若需高频、大规模采集,强烈建议转向官方 IMDb Developer API(需申请 Key),其提供结构化、稳定、合规的数据接口。
⚠️ 注意:Selenium 会启动真实浏览器,适合中低频任务;如需无头部署,可添加 options.add_argument('--headless') 启用无界面模式。

















