Python爬虫实战:requests+BeautifulSoup抓取影视公开榜单(附代码) Python 爬虫实战用 requests BeautifulSoup 抓取影视公开榜单信息附完整代码做技术开发久了你会发现“手动复制粘贴网页上的数据”是一件非常低效的事情。比如业务上需要定期整理一批电影的片名、年份、评分或者想做一个简单的“本周热门电影榜单”数据看板如果全靠人工一个个打开页面去复制既浪费时间又容易出错。用 Python 爬虫可以把这部分工作自动化几秒钟就能完成一个页面的数据采集。这篇文章会从零开始围绕“影视公开信息”这个场景拆解 Python 爬虫的完整落地过程。内容包括环境搭建、requests 请求、BeautifulSoup 解析、CSV 数据保存、pandas 可视化以及常见反爬应对与排错思路。无论你是刚接触 Python 的新手还是想快速写一个数据采集脚本的开发同学都可以跟着实操一遍。需要提前说明的是本文所有案例都基于合法、公开的数据源绝不涉及破解付费会员、绕过版权保护、盗取 VIP 资源等内容。写爬虫一定要遵守目标网站的 robots 协议和服务条款只采集允许公开访问的数据这是技术从业者必须守住的基本底线。1. 理解网络爬虫的边界哪些数据可以爬接触爬虫的第一件事不是写代码而是搞清楚“爬虫到底能碰什么”。很多人看到爬虫就觉得是抓视频、抓付费资源这种理解是片面的。网络爬虫本质上是“模拟浏览器自动访问网页并提取信息”的程序它的应用场景非常广泛比如搜索引擎、舆情监控、商品价格对比、学术资料整理、公开影视数据收集等。1.1 爬虫与盗版资源的边界很多平台提供的电影、综艺、电视剧是受版权保护和付费墙限制的内容。用户如果想在未付费、未授权的情况下批量获取这些资源会涉及破坏技术保护措施、侵犯著作权等问题。这类行为不仅违背平台服务条款也触碰法律红线。作为技术教程我们应该把爬虫关注点放在公开、可访问的数据上。比如影视评分网站的公开榜单信息。视频平台对外展示的标题、封面、简介。影评网站允许公开访问的评论摘要。各地影院公开的排片信息。开放 API 提供的影视资料库数据。这些数据本身没有版权问题或者版权方明确允许访问。爬虫只是帮你把这些散落的信息结构化保存下来提升工作效率。1.2 合法爬虫的四个基本条件如果要判断一个爬虫项目是否靠谱可以看下面四个条件条件说明公开可访问数据不需要登录、不需要付费、不需要特殊权限即可浏览遵守 robots 协议目标网站 robots.txt 没有明确禁止抓取相关路径控制抓取频率不要对服务器造成压力设置合理间隔和超时不用于商业侵权采集的数据不用于未经授权的商业用途或侵犯他人权益在后面的实战案例中我们会直接用本地 HTML 文件作为测试数据源。这样做的好处是零风险、可复现同时把代码逻辑完整跑通。等到你真正需要采集某个公开网站时只需要替换 URL 和选择器即可。2. 环境准备与工具清单开始写代码之前先把开发环境准备好。这里以 Windows 系统为例macOS / Linux 的差异不大后面会单独说明。2.1 Python 安装与环境变量配置如果你还没有安装 Python可以到 Python 官网下载对应系统的安装包。安装时一定要勾选“Add Python to PATH”选项这样后续才能直接在命令行中使用python和pip命令。安装完成后打开命令行工具输入python --version如果输出类似Python 3.12.x说明安装成功。如果提示“python 不是内部或外部命令”通常是环境变量没有配置好。解决方案是在系统环境变量 PATH 中加入 Python 安装目录例如C:\Users\你的用户名\AppData\Local\Programs\Python\Python312\ C:\Users\你的用户名\AppData\Local\Programs\Python\Python312\Scripts\配置完成后重新打开命令行工具再次执行python --version验证即可。2.2 安装项目依赖本文需要用到的第三方库有requests发送 HTTP 请求。beautifulsoup4解析 HTML 页面。lxmlHTML 解析加速器。pandas数据清洗与保存。matplotlib数据可视化。在命令行中执行pip install requests beautifulsoup4 lxml pandas matplotlib如果 pip 下载速度较慢可以使用国内镜像源比如清华镜像pip install requests beautifulsoup4 lxml pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后可以写一条简单的导入语句验证import requests import bs4 import pandas as pd print(依赖安装成功)2.3 推荐开发工具写 Python 爬虫推荐使用 VS Code 或者 PyCharm。如果你刚开始学习VS Code 轻量且配置简单非常适合入门。在 VS Code 中建议安装以下扩展PythonPylanceJupyter如果是 VS Code 新手可以先创建一个工作目录然后在终端中运行code .打开当前目录。这样后续生成的代码文件和 CSV 文件都可以集中在同一个目录下便于管理。3. 核心基础requests 请求与 BeautifulSoup 解析在进入实战之前先掌握两个最核心的库requests 和 BeautifulSoup。它们是整个爬虫脚本的左右手。3.1 发送 GET 请求requests 库最常用的方法是requests.get()它的作用是模拟浏览器访问一个网址并获取响应内容。来看一个最简单的例子import requests url https://example.com response requests.get(url) print(response.status_code) print(response.text[:200])这里有几个关键点response.status_code表示 HTTP 状态码200 表示请求成功。response.text返回网页的文本内容。有的网站会拦截没有浏览器标识的请求所以需要额外设置 headers。更规范的写法是携带 User-Agent 请求头模拟真实浏览器访问import requests url https://example.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 } response requests.get(url, headersheaders, timeout10) print(response.status_code)这里的timeout10表示超过 10 秒没有响应就主动放弃避免程序卡住。实际项目中这三个参数基本是标配。3.2 BeautifulSoup 解析页面拿到 HTML 文本之后需要用 BeautifulSoup 把页面解析成可操作的对象。BeautifulSoup 支持多种解析器推荐使用lxml速度和容错性都不错。基本用法from bs4 import BeautifulSoup html htmlbodyh1 classtitle测试标题/h1/body/html soup BeautifulSoup(html, lxml) title soup.select_one(.title) print(title.text)select_one()是 CSS 选择器语法 .title 表示选择 class 为 title 的元素。text属性则取出标签内部的纯文本。3.3 提取链接、标题、评分等字段实际电影榜单页面中通常每条电影信息包含标题、年份、评分、地区等多个字段。使用 BeautifulSoup 可以这样提取items soup.select(ul.movie-list li.movie-item) for item in items: title item.select_one(.title).text year item.select_one(.year).text rating item.select_one(.rating).text print(title, year, rating)如果你需要获取超链接地址可以这样写link item.select_one(a).get(href)以上就是爬虫最常用的三步请求页面、解析页面、提取数据。接下来我们用这个基础逻辑完成一个完整的影视数据采集案例。4. 完整实战案例抓取影视公开榜单信息为了让案例可以稳定复现这里使用一个本地 HTML 页面作为数据源。你可以先把下面的 HTML 内容保存为movies.html文件然后通过本地 HTTP 服务访问再编写爬虫抓取。这样既不会因为目标网站改版而失败也能帮助你完全理解爬虫运行机制。4.1 创建项目结构先在本地创建一个项目目录例如movie_spider目录结构如下movie_spider/ ├── data/ │ └── movies.html ├── output/ │ └── (自动生成 movies.csv) ├── spider_movies.py └── analyze_movies.py创建好目录后在data/movies.html文件中写入以下内容。!DOCTYPE html html langzh-CN head meta charsetUTF-8 title影视公开榜单示例/title /head body h1本周热门电影公开示例数据/h1 ul classmovie-list li classmovie-item>python -m http.server 8000 --directory data启动成功后会显示类似以下信息Serving HTTP on :: port 8000 (http://localhost:8000/) ...此时在浏览器中访问http://localhost:8000/movies.html就能看到页面内容。这个本地服务是安全的只是为了测试爬虫脚本。4.3 编写核心爬虫代码创建一个spider_movies.py文件完整代码如下# 文件路径movie_spider/spider_movies.py import csv import requests from bs4 import BeautifulSoup def fetch_movies(url): 请求页面并解析电影榜单信息。 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 } response requests.get(url, headersheaders, timeout10) response.encoding utf-8 if response.status_code ! 200: print(f请求失败状态码{response.status_code}) return [] soup BeautifulSoup(response.text, lxml) # 定位所有电影条目 items soup.select(ul.movie-list li.movie-item) movie_list [] for item in items: title item.select_one(.title).text.strip() year item.select_one(.year).text.strip() rating item.select_one(.rating).text.strip() movie_list.append({ title: title, year: year, rating: rating, }) return movie_list def save_to_csv(movie_list, output_path): 将电影数据保存到 CSV 文件。 fieldnames [title, year, rating] with open(output_path, modew, encodingutf-8-sig, newline) as f: writer csv.DictWriter(f, fieldnamesfieldnames) writer.writeheader() writer.writerows(movie_list) print(f数据已保存到{output_path}) if __name__ __main__: target_url http://localhost:8000/movies.html movies fetch_movies(target_url) if movies: print(f共抓取到 {len(movies)} 条电影数据) for movie in movies: print(movie) save_to_csv(movies, output/movies.csv) else: print(未抓取到任何数据)这段代码的逻辑很清晰fetch_movies(url)负责请求页面并解析数据。通过 CSS 选择器提取每个条目的标题、年份、评分。save_to_csv()将结构化数据保存到output/movies.csv。使用encodingutf-8-sig写入 CSV避免 Excel 打开中文乱码。4.4 运行与验证运行脚本之前确保本地 HTTP 服务已经在运行。然后打开另一个命令行窗口进入movie_spider目录执行python spider_movies.py如果一切正常输出结果类似共抓取到 5 条电影数据 {title: 流浪地球2, year: 2023, rating: 8.3} {title: 满江红, year: 2023, rating: 7.0} {title: 奥本海默, year: 2023, rating: 8.9} {title: 蜘蛛侠纵横宇宙, year: 2023, rating: 8.5} {title: 孤注一掷, year: 2023, rating: 7.2} 数据已保存到output/movies.csv打开output/movies.csv你会看到类似下面的表格titleyearrating流浪地球220238.3满江红20237.0奥本海默20238.9蜘蛛侠纵横宇宙20238.5孤注一掷20237.2至此一个最简单的影视公开数据爬虫已经跑通了。4.5 结果说明这个案例虽然只是本地数据但核心思路和线上爬虫完全一致用 requests 获取 HTML 文本。用 BeautifulSoup 解析页面结构。用 CSS 选择器提取结构化字段。用 CSV 保存结果。当你以后需要爬取某个公开网站时只需要把target_url替换成真实地址把select中的选择器调整为目标页面对应的结构即可。不过替换之前一定要确认目标网站允许爬取。5. 处理常见的反爬与异常很多爬虫新手在抓取公开网站时会遇到请求能发出去但返回内容为空或者直接被拒绝访问的情况。这通常是目标网站设置了反爬机制。下面针对几种常见场景给出解决办法。5.1 User-Agent 伪装部分网站会检查请求头中的User-Agent如果是 Python 默认的标识可能会直接拒绝服务。解决办法就是伪造一个真实浏览器的 User-Agent。headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 }除了 User-Agent还可以补充Accept-Language、Referer等请求头让请求更像真实用户。5.2 请求频率与超时设置如果爬虫请求速度太快会给服务器造成压力也很容易被封 IP。建议在循环请求时加入随机延时import random import time time.sleep(random.uniform(1, 3))这种方式可以模拟真实用户的访问节奏降低被封风险。同时所有请求都要设置timeoutresponse requests.get(url, headersheaders, timeout10)如果不设置超时网络异常时脚本可能会一直卡住。5.3 页面编码和动态加载问题中文网站经常出现编码问题。如果打开页面是中文但解析结果乱码可以手动指定编码response.encoding utf-8或者使用 response 自带的编码判断response.encoding response.apparent_encoding对于使用 JavaScript 动态渲染的页面requests 只能拿到初始 HTML无法获取动态加载的数据。这时可以考虑查找页面背后的公开 JSON API。使用 Selenium 或 Playwright 驱动真实浏览器渲染。但要注意动态加载不等于可以绕过权限。如果接口需要登录或付费授权依然不能非法访问。6. 扩展用 pandas 和 matplotlib 分析影视数据爬虫只是数据采集的第一步。在实际业务中我们往往还需要对数据做统计分析。比如抓取到一堆电影评分后可以用 pandas 读取 CSV用 matplotlib 画一张评分分布图。6.1 用 pandas 读取 CSV 文件创建一个analyze_movies.py文件代码如下# 文件路径movie_spider/analyze_movies.py import pandas as pd df pd.read_csv(output/movies.csv) df[rating] df[rating].astype(float) print(df.describe()) print(df.sort_values(rating, ascendingFalse))df.describe()会输出评分的统计数据包括计数、均值、最小值、最大值等。sort_values()可以按评分降序排列。6.2 制作评分分布图接着用 matplotlib 绘制横向条形图直观展示每部电影的评分# 文件路径movie_spider/analyze_movies.py import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False df pd.read_csv(output/movies.csv) df[rating] df[rating].astype(float) df_sorted df.sort_values(rating, ascendingTrue) plt.figure(figsize(10, 6)) plt.barh(df_sorted[title], df_sorted[rating], color#4C72B0) plt.xlabel(评分) plt.title(电影评分分布) plt.tight_layout() plt.show()注意Windows 下如果没有设置中文字体图表中的中文可能显示为方框所以需要配置font.sans-serif。macOS / Linux 可以选择SimHei、WenQuanYi等可用字体。7. 常见问题与排查思路即使是本地爬虫案例也可能会遇到各种小问题。下面整理了一张排查表供你参考。问题现象常见原因解决思路请求本地服务失败本地 HTTP 服务没有启动在项目目录执行python -m http.server 8000 --directory data爬虫返回 404URL 路径写错检查movies.html文件名和端口是否匹配解析结果为空CSS 选择器写错在浏览器开发者工具中复制对应的选择器逐一核实写入 CSV 后 Excel 打开乱码编码方式不正确使用encodingutf-8-sig中文标题解析成乱码页面编码识别错误手动设置response.encoding utf-8请求第三方网站被拒绝缺少请求头或触发反爬补充 User-Agent、Referer降低请求频率如果你在运行本地案例时发现No module named requests是因为当前 Python 环境没有安装依赖。回到命令行执行pip install requests beautifulsoup4 lxml pandas matplotlib然后再运行脚本即可。8. 最佳实践与工程建议写爬虫和写业务代码一样也需要考虑代码的健壮性、可维护性和合规性。分享一下我常用的几条工程建议。8.1 明确数据来源的合法性每次启动爬虫项目前先检查目标网站的robots.txt。例如在浏览器访问https://example.com/robots.txt确认你要抓取的路径是否被允许。遵守 robots 协议是最基本的职业道德。如果目标页面明确禁止爬取或者数据需要登录、付费才能访问就不要强行抓取。8.2 隔离采集逻辑与解析逻辑不要把请求、解析、存储全部堆在一个函数里。建议拆分成类似我们上面写的fetch_movies()、save_to_csv()这样的独立函数。这样做的好处是请求逻辑变化时只改请求函数。选择器变化时只改解析函数。存储格式变化时只改保存函数。代码可读性也会大幅提升。8.3 重视异常处理网络请求非常不稳定脚本必须考虑各种异常情况try: response requests.get(url, headersheaders, timeout10) response.raise_for_status() except requests.RequestException as e: print(f请求异常{e})raise_for_status()会在状态码不是 200-399 时抛出异常这样你可以及时发现请求失败的问题。8.4 数据抽取使用稳定的属性HTML 页面中最容易变化的是 CSS 类名尤其是很多网站迭代后 class 可能改掉。相比之下>title item.get(data-title)当然这取决于目标页面的具体结构。如果页面没有 data 属性就只能使用其他选择器同时在代码中注释清楚方便后续维护。8.5 采集数据后的合规处理即使采集的是公开数据保存到本地后也不能随意用于商业用途。如果要用在正式项目中建议明确数据来源并保留版权信息。尽可能使用官方 API。不要二次传播未经授权的影视资源。在对外展示时注明数据来源和采集时间。这一点尤其在影视相关领域要特别注意因为片名、剧照、简介等内容都可能涉及版权。9. 总结与下一步学习路线通过这篇文章你从零完成了一个 Python 爬虫实战项目掌握了 requests 发送请求、BeautifulSoup 解析 HTML 的方法。理解了爬虫合法性的边界知道哪些数据可以采集、哪些不能碰。完成了本地影视公开数据的抓取、CSV 保存和可视化分析。学会了常见反爬问题的排查思路和工程化写法。接下来可以继续学习的方向深入学习 XPath 和 CSS Selector提高定位效率。学习 Scrapy 框架构建分布式爬虫。学习 Selenium / Playwright解决动态渲染页面的采集问题。学习 pandas 数据清洗和数据分析从“抓到数据”走向“用好数据”。研究公开 API 的使用方法这是最稳定、最合规的数据获取方式。Python 爬虫是一条非常实用的技能路径。只要你遵守法律的边界尊重数据的来源它就能成为你在信息收集、数据分析和自动化办公中的得力工具。最后给你留一个练习把本文的案例改造成抓取你所在城市公开影院排片信息或者抓取你喜欢的电影资讯站点的公开标题列表。改的时候先看 robots.txt再写代码跑通之后你会对爬虫有一个全新的理解。如果本文对你有帮助欢迎收藏备用也欢迎在评论区分享你的爬虫踩坑经历。