You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用BeautifulSoup爬取IMDB Top250遇异常:返回JS包而非HTML求解

问题分析
  • 核心问题是:requests库仅能获取静态初始HTML内容,无法执行页面中的JavaScript代码。当前IMDB Top250页面采用动态渲染技术,初始返回的HTML只是页面骨架,电影榜单数据需要通过后续JS请求加载并渲染到页面中。
  • 本地浏览器打开保存的HTML能显示完整内容,是因为浏览器会自动解析并执行页面内的JS,完成数据填充和页面渲染。
解决方案

方案1:使用支持JS渲染的爬虫工具(推荐)

借助Selenium或Playwright这类模拟真实浏览器行为的工具,它们能执行页面JS并获取渲染后的完整HTML。

示例代码(Selenium)

先安装依赖:

pip install selenium

需同时安装对应浏览器的驱动(如ChromeDriver,版本需与本地Chrome匹配),再编写代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

URL = 'https://www.imdb.com/chart/top/'

# 配置无头模式(不弹出浏览器窗口)
chrome_options = Options()
chrome_options.add_argument('--headless=new')
chrome_options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36')

driver = webdriver.Chrome(options=chrome_options)
driver.get(URL)

# 获取渲染后的完整页面源码
soup = BeautifulSoup(driver.page_source, 'html.parser')
print(soup.prettify())

driver.quit()

示例代码(Playwright)

Playwright自带浏览器驱动,更轻量:

pip install playwright
playwright install chrome

代码实现:

from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup

URL = 'https://www.imdb.com/chart/top/'

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
    page.goto(URL)
    # 等待榜单元素加载完成
    page.wait_for_selector('li.ipc-metadata-list-summary-item')
    
    soup = BeautifulSoup(page.content(), 'html.parser')
    print(soup.prettify())
    
    browser.close()

方案2:直接调用IMDB的API接口

通过浏览器开发者工具(F12)抓包,找到页面加载榜单时的API请求接口,直接用requests请求该接口获取JSON格式数据,效率更高。

示例(接口可能随IMDB更新变化,需自行抓包确认):

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Accept': 'application/json'
}
# 需自行抓包获取有效接口,部分公开API可能需要注册密钥
API_URL = 'https://imdb-api.com/en/API/Top250Movies/YOUR_API_KEY'
response = requests.get(API_URL, headers=headers)
print(response.json())
注意事项
  • 频繁爬取IMDB可能触发反爬机制,建议添加请求间隔(如time.sleep(2)),避免IP被封禁。
  • 需遵守IMDB的Robots协议和服务条款,不要过度爬取或滥用数据。

内容的提问来源于stack exchange,提问作者Ya.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:22:41