使用BeautifulSoup爬取IMDb剧情梗概板块代码失效问题求助
IMDb剧情梗概爬取失败排查与修复方案
核心失败原因
运行原代码会返回空列表[],拿不到目标内容,核心是两个问题:
- 直接用
requests默认请求头访问IMDb会触发基础反爬:默认请求的User-Agent标识为python-requests/xx版本,IMDb会直接拦截这类非浏览器请求,返回的要么是人机验证页,要么是未加载动态内容的空页面骨架,根本不存在你要查找的data-testid='storyline-plot-summary'节点。 - 你已经导入了
imdb(即IMDbPy第三方库)但完全没用到它的封装能力,手写页面解析逻辑不仅容易被反爬拦截,后续IMDb前端改版时也很容易失效。
可用修复方案
方案1:修正requests请求参数(保留原有页面解析逻辑)
给请求加上模拟真实浏览器的请求头,绕过基础反爬校验即可拿到正常页面内容,修复后代码如下:
import requests from bs4 import BeautifulSoup def get_summary(url): # 加入浏览器请求头,模拟普通用户访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "Accept-Language": "en-US,en;q=0.9" } r = requests.get(url=url, headers=headers) r.encoding = "utf-8" soup = BeautifulSoup(r.text, 'html.parser') summ = soup.find_all("div", attrs = {'data-testid': 'storyline-plot-summary'}) # 提取纯文本内容,过滤HTML标签 summary_text = [item.get_text(strip=True) for item in summ] print(summary_text) return summary_text get_summary("https://www.imdb.com/title/tt0114709/")
注意:如果短时间内爬取频次过高还是会被IP封禁,需要加随机请求间隔、搭配代理池使用。
方案2:调用imdb库封装方法(稳定性更高)
你已经导入的IMDbPy库已经封装好了全量影视元数据的获取逻辑,不需要自己写页面解析规则,不会因为IMDb前端改版失效,代码更简洁:
from imdb import IMDb ia = IMDb() def get_summary(tt_id): # 传入影片tt号,即链接中tt后面的数字部分 movie = ia.get_movie(tt_id) # 直接获取剧情梗概列表 plot_list = movie.get("plot", []) print(plot_list) return plot_list # 玩具总动员的tt号为0114709 get_summary("0114709")
内容的提问来源于stack exchange,提问作者subhamiiita
相关产品推荐
相关产品推荐

