
用 Python 打造 IMDB 电影信息爬虫Movie Information Scraper 源码解析与实战指南【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址: https://gitcode.com/gh_mirrors/py/python-mini-projects本指南围绕 python-mini-projects 仓库中的 Movie Information Scraper 项目完整讲解如何仅用requests与beautifulsoup4两个库从 IMDB 抓取电影的片名、年份、评分、时长、上映日期、类型、导演、编剧、主演与剧情简介等十余项元数据。读完本文你将掌握「搜索页 → 详情页 → 剧情摘要页」的三段式抓取思路、BeautifulSoup 选择器在真实页面中的落地写法以及一套可复用的容错处理范式。一、项目概述这个脚本能做什么Movie Information Scraper 是 python-mini-projects 仓库projects/目录下的一个命令行电影信息抓取脚本核心文件为 movieInfoScraper.py。它解决的问题非常具体用户只输入一个电影名脚本自动在 IMDB 上定位到该电影并返回一份结构化信息清单典型输出包括片名Name与年份YearIMDB 评分Rating与片长Runtime上映日期Release Date与类型Genres导演Director、编剧Writer、主演Cast剧情简介Plot Summary脚本的入口逻辑简单直白movieInfoScraper.py交互式读取电影名 → 调用核心函数getMovieDetails()→ 若未找到则提示No movie of this name found !!!!!并退出否则按字段逐行打印结果。整个流程无需浏览器、无需 API Key只依赖两个外部库。二、运行环境与依赖安装按项目 README 的说明脚本只有两个外部依赖均声明在 requirements.txt 中beautifulsoup4 requests2.23.0安装方式为标准的 pip 批量安装pip install -r requirements.txt使用前提Python 3 环境README 中的运行命令为python3可正常访问 IMDB 的网络环境requests2.23.0是仓库锁定的版本beautifulsoup4未锁版本按实际环境解析安装即可。若本机已有较新的requests直接使用亦可但复现仓库原样时建议遵循requirements.txt的版本约束。三、快速上手命令行用法在项目目录下直接执行python3 movieInfoScraper.py脚本会提示Enter the movie name whose details are to be fetched输入电影名无需区分大小写空格会被自动处理例如avengers infinity war回车后即可看到完整的电影信息输出。以下是 README 附带的运行效果截图所展示的完整输出示例Avengers: Infinity War (2018) Rating: 8.4 Runtime: 2h 29m Release Date: 27 April 2018 (India) Genres: Action, Adventure, Sci-Fi Director: Anthony Russo, Joe Russo Writer: Christopher Markus, Stephen McFeely Cast: Robert Downey Jr., Chris Hemsworth, Mark Ruffalo Plot Summary: The Avengers and their allies must be willing to sacrifice all in an attempt to defeat the powerful Thanos before his blitz of devastation and ruin puts an end to the universe.同一张截图中还演示了异常输入的处理当输入不存在的电影名如kfjgkfjk23423时脚本输出No movie of this name found !!!!并退出不会抛出堆栈异常——这正是下文要讲的容错设计在起作用。四、源码级解析三段式抓取架构虽然脚本看起来只有一个函数但getMovieDetails()movieInfoScraper.py内部实际完成了三次 HTTP 请求、三个不同页面的接力解析这是理解整个项目价值的关键。4.1 第一段构造搜索请求定位电影url https://www.imdb.com query /search/title?title movienamequery query .join(movieName.strip().split( )) html requests.get(url movienamequery title_typefeature)这段代码将用户输入按空格拆分成单词、再用连接得到 IMDB 标题搜索的查询串。例如输入avengers infinity war时实际请求的 URL 为https://www.imdb.com/search/title?titleavengersinfinitywartitle_typefeature其中title_typefeature参数把搜索范围限定在电影长片feature film从而避免混入剧集TV series、短片等类型这是搜索结果准确性的一大保障。之后用 BeautifulSoup 解析页面并只取搜索结果中的第一条result bs.find(h3, {class: lister-item-header}) if result is None: return None movielink url result.a.attrs[href] movieDetails[name] result.a.text如果搜索列表中没有lister-item-header元素说明查无此片函数直接返回None由主程序兜底提示并退出。一旦找到就提取该条目的相对链接href拼接出电影详情页的完整地址。4.2 第二段解析详情页抽取主体字段拿到详情页地址后再次请求并解析movieInfoScraper.py各字段的提取方式如下字段页面选择器提取方式异常兜底Yearspan#titleYear取其内a标签文本Not availableGenresdiv.subtext取所有title属性为空的a标签文本—Ratingdiv.ratingValue取其内span文本Not yet ratedRuntimediv.subtext取time标签文本并strip()Not availableRelease Datediv.subtext取titleSee more release dates的a文本—Directorsdiv.credit_summary_item第一个取其中所有a标签文本—Writersdiv.credit_summary_item第二个取href含name的a文本见下方异常处理Castdiv.credit_summary_item第三个取href含name的a文本复用 Writers 兜底值得注意的两个细节类型与人员的过滤技巧提取类型时用{title: None}排除掉「See more release dates」这类带title属性的链接提取编剧与主演时用name in i.attrs[href]只保留指向影人主页/name/...的链接从而天然过滤掉「See full cast crew」等无关入口。这种「利用链接特征做语义过滤」的手法在真实爬虫中非常实用。Credit 区域的结构性假设脚本假定credit_summary_item依次为 Director、Writers、Cast 三块直接按下标[0]、[1]、[2]取值因此对页面结构有较强依赖这也是异常处理集中于此的原因。4.3 第三段补抓剧情简介独立的 AJAX 请求剧情简介是该项目实现上最有代表性的一个点源码注释movieInfoScraper.py写得很清楚IMDB 详情页 HTML 中并不包含剧情文本它由页面后续的 AJAX 调用加载。因此脚本直接对详情页地址追加plotsummary后缀发起第三次请求html requests.get(movielink plotsummary) bs BeautifulSoup(html.text, html.parser) movieDetails[plot] bs.find(li, {class: ipl-zebra-list__item}).p.text.strip()即在详情页 URL 后拼上plotsummary得到独立的剧情摘要页面再定位到li.ipl-zebra-list__item中的段落文本作为剧情简介。这种「页面数据不全就寻找它对应的独立接口页」的思路是绕过动态加载数据的通用做法之一。4.4 数据结构一个字典装下全部字段所有抓取结果被统一装进movieDetails字典其中genres、directors、writers、cast为列表其余为字符串。主程序打印时对列表做, .join()拼接输出movieInfoScraper.py。这种「函数返回统一结构体、调用方只负责展示」的设计让后续改造成 API 返回 JSON、或接入 GUI 都非常容易。五、异常处理与边界情况源码在三个典型边界上做了防御体现了小型爬虫脚本应有的稳健性查无此片搜索列表为空时返回None主程序打印No movie of this name found !!!!!并quit()不会继续解引用空对象。字段缺失AttributeError年份、评分、时长分别用try/except AttributeError包裹缺失时降级为Not available/Not yet rated保证整段流程不中断。人员信息不完整IndexError部分电影的详情页没有独立的 Cast 区块导致creditSummary[2]越界。源码的处理是将原本属于 Writers 的列表回填给cast再把writers置为Not foundmovieInfoScraper.py保证输出结构始终完整。六、注意事项与局限性使用本项目时需要了解以下几点以避免误用强依赖 IMDB 页面结构所有选择器如lister-item-header、ratingValue、credit_summary_item都基于脚本编写时的 IMDB HTML 结构。IMDB 改版后选择器可能失效属于网页爬虫的固有风险脚本本身未内置 User-Agent、代理或重试机制长时间高频请求易被目标站点限制建议仅用于学习与低频个人用途。无缓存与限流脚本对每个输入电影都会发起 23 次实时请求批量抓取时应自行加入延时与去重。适用范围该脚本是命令行交互式工具README 给出的运行方式即python3 movieInfoScraper.py若需批量处理可直接 import 其中的getMovieDetails函数并循环调用返回值即为可直接序列化的字典。七、小结Movie Information Scraper 用约 80 行代码完整演示了「搜索定位 → 详情解析 → 补抓 AJAX 数据」的经典爬虫链路requests负责三次请求BeautifulSoup负责选择器解析字典统一承载结果try/except兜底三种真实边界。对于想入门网页抓取的开发者它是一个结构清晰、可读性极佳的最小范本在此基础上你可以进一步扩展多结果选择、翻页抓取、结果导出 CSV/JSON 等能力。相关完整实现请查阅 movieInfoScraper.py 与 requirements.txt。【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址: https://gitcode.com/gh_mirrors/py/python-mini-projects创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考