Python 爬虫实战:影视网站影片信息与影评抓取全解析
前言
影视行业线上内容体量持续增长,影片基础信息、观众影评、评分数据不仅是影视爱好者参考内容,也是影视行业市场分析、舆情研判、内容热度统计的重要数据源。依靠人工逐页整理影片资料与用户评论,不仅耗时耗力,还无法实现海量数据的统一汇总与长期跟踪。借助 Python 爬虫技术,可自动化完成影视站点影片名录、海报信息、上映时间、主演阵容、剧情简介、用户评分、短评、长影评等多维度数据的批量抓取,搭配数据解析与持久化方案,构建完整的影视信息数据集。
本文围绕影视网站爬虫项目展开实战讲解,结合静态页面解析、多级页面联动抓取、评论分页处理、数据清洗存储等核心环节,搭配完整可运行代码与底层原理拆解,同时针对影视站点常见反爬策略给出落地解决方案。整套方案兼顾实用性与扩展性,适配主流影视资讯、视频播放类站点的数据采集场景。
本文所用核心第三方库及官方文档链接如下,可直接跳转查阅安装与使用细则:
- Requests 库(HTTP 请求交互)
- BeautifulSoup4 库(HTML 结构化解析)
- Re 正则库(文本数据清洗与提取)
- JSON 库(结构化数据解析)
- OpenPyXL 库(Excel 数据归档)
- SQLite3 库(轻量本地数据存储)
一、项目整体规划与技术选型
1.1 项目采集目标
结合影视网站页面结构与实际使用需求,本次爬虫明确两级采集目标,分为影片基础数据与影评数据两大模块,具体采集字段如下:
- 影片基础信息:影片名称、上映年份、影片类型、地区、主演、导演、片长、综合评分、评分人数、剧情简介、影片封面链接、影片详情页链接;
- 用户影评数据:评论用户昵称、用户评分、评论发布时间、评论内容、点赞数、回复数、评论类型(短评 / 长影评);
- 附加功能:支持影片列表分页抓取、影评分页遍历、无效数据过滤、数据本地文件存储与轻量数据库存储。
1.2 页面结构分析
主流影视网站分为列表页、影片详情页、影评分页页三级页面,页面逻辑如下: 列表页集中展示多部影片的精简信息,每一条影片条目均附带独立详情页链接;进入详情页可获取影片完整介绍、演职人员、剧情梗概等内容;影评区域单独划分板块,多数站点将影评分为多页展示,部分站点影评数据通过接口异步加载。本次项目同时覆盖静态 HTML 渲染影评与简易接口影评两种场景,提升代码适配性。
1.3 技术栈选型说明
结合影视站点页面特征、数据格式与运维成本,确定整套技术方案,下表为各组件用途与选型依据:
表格
| 组件名称 | 核心功能 | 选型优势 |
|---|---|---|
| Python 3.8+ | 主体开发语言 | 生态完善,爬虫相关第三方库丰富,语法简洁易维护,跨平台运行稳定 |
| Requests | 发送 HTTP/HTTPS 请求 | 支持自定义请求头、超时设置、会话保持,适配网页与数据接口请求 |
| BeautifulSoup4 | 解析静态 HTML 页面 | 标签定位精准,语法简单,高效提取页面内文本、链接、属性数据 |
| re 正则表达式 | 文本清洗、零散数据提取 | 针对无固定标签的零散文本、特殊字符、数字类数据完成精准匹配 |
| json | 解析接口返回 JSON 数据 | 影视站点异步影评多采用 JSON 格式,该库可直接完成字典转换与字段提取 |
| SQLite3 | 本地轻量数据库存储 | Python 内置库,无需额外安装配置,单文件存储,适合中小型数据集归档 |
| OpenPyXL | Excel 表格写入汇总 | 支持 xlsx 格式读写,兼容各类办公软件,便于非技术人员查看与统计数据 |
| time | 请求延时控制 | 原生标准库,实现访问间隔模拟,规避基础反爬拦截 |
二、运行环境搭建与初始化配置
2.1 基础环境校验
本项目基于 Python 3.8 及以上版本开发,环境配置完成后,在终端执行以下命令校验版本:
bash
运行
python --version若正常输出版本号,则代表 Python 基础环境可用。Windows、Linux、macOS 全平台通用该校验方式。
2.2 第三方库安装
除 Python 内置库外,其余依赖库通过 pip 工具在线安装,依次执行以下安装命令:
bash
运行
pip install requests pip install beautifulsoup4 pip install openpyxl安装完成后,可执行pip list查看已安装包列表,确认无缺失后进入开发环节。
2.3 SQLite 数据库初始化
SQLite 为文件型数据库,无需单独启动服务,直接通过代码即可创建数据库文件与数据表。结合采集字段,设计两张数据表,分别存储影片基础信息与影评信息,实现数据分类存储,避免字段混乱。
数据表设计规范:字段命名贴合采集内容,文本类型设置合理长度,主键自增保证数据唯一性,统一字符编码防止中文乱码。
sql
-- 影片信息表 CREATE TABLE IF NOT EXISTS movie_info ( id INTEGER PRIMARY KEY AUTOINCREMENT, movie_name TEXT NOT NULL, release_year TEXT, movie_type TEXT, region TEXT, director TEXT, actor TEXT, duration TEXT, score TEXT, score_count TEXT, intro TEXT, cover_url TEXT, detail_url TEXT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 影片影评表 CREATE TABLE IF NOT EXISTS movie_comment ( id INTEGER PRIMARY KEY AUTOINCREMENT, movie_name TEXT NOT NULL, user_name TEXT, user_score TEXT, comment_time TEXT, comment_content TEXT, like_num TEXT, reply_num TEXT, comment_type TEXT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP );两张数据表通过movie_name字段建立关联关系,可后续根据影片名称联合查询影片与对应影评数据。
三、爬虫核心技术原理详解
3.1 多级页面抓取逻辑原理
本次项目属于典型的多级联动爬虫,执行流程分为三层递进式抓取,也是影视类爬虫的核心逻辑: 第一步,爬虫向影片列表页地址发送 HTTP 请求,获取列表页完整 HTML 源码,通过解析库提取每一部影片的名称、精简信息以及详情页链接;第二步,遍历所有详情页链接,逐个发起二次请求,进入影片详情页,解析导演、主演、剧情简介等深度数据;第三步,在详情页中定位影评板块链接或异步接口地址,分页请求影评数据,完成评论内容采集。
整个流程遵循 “列表页→详情页→评论页” 的层级顺序,每一级页面的数据都是下一级抓取的前置条件,代码中通过循环遍历链接实现自动化跳转,无需人工干预页面切换。
3.2 静态页面数据解析原理
影视网站绝大多数基础信息通过静态 HTML 标签渲染展示,BeautifulSoup4 的解析本质是将 HTML 字符串转换为 DOM 文档树结构。DOM 树以标签为节点,存在明确的父子、兄弟层级关系。开发者通过标签名、class 属性、id 属性、标签层级组合等方式,定位目标数据所在节点,再调用文本提取、属性提取方法,剥离 HTML 标签,保留有效文本内容。
对于页面中格式混乱、夹杂换行符、空格、特殊符号的文本数据,结合正则表达式完成清洗,匹配有效字符并剔除无效占位符,保证入库数据整洁统一。
3.3 异步接口影评解析原理
部分影视站点为提升页面加载速度,不会将全部影评直接嵌入 HTML 页面,而是在页面加载完成后,通过 JavaScript 向后端接口发起请求,动态加载影评数据,接口返回数据格式普遍为 JSON。
JSON 是轻量级结构化数据格式,本质为键值对组合。Python 内置 json 库可将 JSON 字符串直接转换为 Python 字典或列表,开发者根据接口文档或抓包获取的字段名,直接读取对应评论内容、用户信息等字段,该方式相比解析 HTML 标签,效率更高、定位更简单。
3.4 影视站点反爬机制与应对原理
影视类网站流量较大,普遍部署基础反爬策略,常见拦截方式及应对逻辑如下: 第一,请求头校验。服务器会检测请求来源的身份标识,无浏览器标识的请求会直接返回 403 状态码。应对方式为在请求中配置标准 User-Agent,模拟主流浏览器身份。 第二,高频请求拦截。短时间内大量请求会被判定为恶意爬虫,触发 IP 临时限制。应对方式为在每一次请求后添加固定延时,模拟人工浏览的访问节奏。 第三,字符编码与页面跳转。部分站点会对响应编码做特殊处理,未正确设置编码会出现中文乱码,需动态识别网页编码并配置。 第四,链接校验。部分详情页、评论页链接存在格式限制,需基于列表页相对链接拼接完整绝对链接,否则会出现请求失败。
整体反爬应对思路以 “模拟人工行为” 为核心,不使用高频并发、不伪造非法请求参数,保证爬虫稳定运行。
3.5 数据持久化存储原理
本项目采用双存储方案,SQLite 数据库用于结构化数据长期归档,支持查询、筛选、联合统计;Excel 文件用于可视化汇总,方便日常查阅。
数据库存储原理:代码建立程序与数据库文件的连接,通过执行 SQL 语句,将内存中的字典、列表数据逐条写入数据表,执行事务提交完成数据落地,操作结束后关闭连接释放资源。Excel 存储原理:借助 OpenPyXL 创建工作簿与工作表,先写入表头,再遍历数据集逐行填充内容,最终将内存中的表格数据保存为本地文件。
四、完整代码实现与逐段原理解析
4.1 全局配置与库导入模块
该模块统一管理所有全局参数、请求头、数据库配置、基础路径,实现参数解耦,后续修改站点地址、延时时间、爬取页数时无需改动业务逻辑代码。
python
运行
# 导入全部依赖库 import requests from bs4 import BeautifulSoup import re import json import sqlite3 import openpyxl import time from datetime import datetime # ===================== 全局配置项 ===================== # 请求头配置,模拟浏览器访问 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", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9" } # 目标站点基础地址,根据实际影视网站修改 BASE_DOMAIN = "https://www.example-movie.com" # 影片列表页地址,分页参数预留 MOVIE_LIST_URL = "https://www.example-movie.com/list?page={}" # 影评接口地址(异步加载影评使用) COMMENT_API_URL = "https://www.example-movie.com/api/comment?movie_id={}&page={}" # 爬取配置 MAX_LIST_PAGE = 3 # 列表页最大爬取页数 MAX_COMMENT_PAGE = 2 # 单部影片影评最大爬取页数 REQUEST_DELAY = 1.5 # 单次请求延时,单位:秒 # 文件与数据库配置 DB_FILE = "movie_data.db" EXCEL_SAVE_PATH = "影视影片及影评数据.xlsx"代码原理:集中式全局配置是工程化开发的基础规范。请求头中User-Agent为核心反爬字段,用于伪装浏览器身份;域名、URL、页数、延时等参数单独定义,适配不同影视站点时仅需修改对应配置项,代码复用性大幅提升。延时参数统一设置,全局控制访问频率。
4.2 数据库通用操作模块
封装 SQLite 数据库的连接、关闭、数据插入通用函数,分为影片数据插入、影评数据插入两个独立方法,同时增加异常捕获与事务处理,保证数据写入稳定性。
python
运行
def get_db_conn(): """创建SQLite数据库连接""" try: conn = sqlite3.connect(DB_FILE) # 设置游标 cur = conn.cursor() return conn, cur except Exception as e: print(f"数据库连接失败:{str(e)}") return None, None def close_db_conn(conn, cur): """关闭数据库连接与游标""" if cur: cur.close() if conn: conn.close() def insert_movie_data(conn, cur, movie_dict): """插入单条影片基础信息至数据库""" insert_sql = """ INSERT INTO movie_info (movie_name, release_year, movie_type, region, director, actor, duration, score, score_count, intro, cover_url, detail_url) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """ try: cur.execute(insert_sql, ( movie_dict["movie_name"], movie_dict["release_year"], movie_dict["movie_type"], movie_dict["region"], movie_dict["director"], movie_dict["actor"], movie_dict["duration"], movie_dict["score"], movie_dict["score_count"], movie_dict["intro"], movie_dict["cover_url"], movie_dict["detail_url"] )) conn.commit() print(f"影片【{movie_dict['movie_name']}】基础信息入库成功") except Exception as e: conn.rollback() print(f"影片【{movie_dict['movie_name']}】数据入库失败:{str(e)}") def insert_comment_data(conn, cur, comment_list, movie_name): """批量插入单部影片影评数据""" insert_sql = """ INSERT INTO movie_comment (movie_name, user_name, user_score, comment_time, comment_content, like_num, reply_num, comment_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?) """ try: for comment in comment_list: cur.execute(insert_sql, ( movie_name, comment["user_name"], comment["user_score"], comment["comment_time"], comment["comment_content"], comment["like_num"], comment["reply_num"], comment["comment_type"] )) conn.commit() print(f"影片【{movie_name}】{len(comment_list)}条影评入库成功") except Exception as e: conn.rollback() print(f"影评数据入库失败:{str(e)}")代码原理:sqlite3采用占位符?传递参数,可有效规避注入风险。数据库操作遵循 “连接 - 执行 - 提交 - 关闭” 标准流程,异常场景下执行rollback事务回滚,避免脏数据写入。影片数据单条插入,影评数据批量循环插入,兼顾逻辑区分与执行效率。
4.3 通用网页请求模块
封装统一的 HTTP 请求函数,支持普通网页请求与接口请求,内置状态码判断、编码自动识别、异常捕获,所有页面请求统一调用该函数,减少重复代码。
python
运行
def send_request(url): """通用请求函数,返回页面源码或接口数据""" try: response = requests.get(url, headers=HEADERS, timeout=12) # 判断请求状态 if response.status_code == 200: # 自动适配编码,解决中文乱码 response.encoding = response.apparent_encoding return response.text else: print(f"请求异常,状态码:{response.status_code},地址:{url}") return None except requests.exceptions.Timeout: print(f"请求超时:{url}") return None except Exception as e: print(f"网络请求错误:{str(e)},地址:{url}") return None finally: # 全局延时,控制访问频率 time.sleep(REQUEST_DELAY)代码原理:该函数为整个爬虫的请求入口,统一处理超时、网络异常、状态码异常三类常见问题。response.apparent_encoding自动识别网页原始编码,彻底解决影视站点常见的中文乱码问题。finally语句保证无论请求成功或失败,都会执行延时操作,严格控制请求间隔。
4.4 影片列表页解析模块
遍历影片列表分页,解析每一条影片条目,提取影片名称、封面链接、详情页链接等基础数据,为后续详情页抓取提供数据源。
python
运行
def parse_movie_list(html): """解析影片列表页,返回影片信息列表""" movie_list = [] if not html: return movie_list # 初始化解析器 soup = BeautifulSoup(html, "html.parser") # 定位所有影片条目容器,根据实际页面class修改 movie_items = soup.find_all("div", class_="movie-item") for item in movie_items: movie_data = {} # 提取影片名称 name_tag = item.find("h3", class_="movie-name") movie_data["movie_name"] = name_tag.get_text(strip=True) if name_tag else "未知影片" # 提取详情页相对链接,拼接完整地址 detail_a = name_tag.find("a") if name_tag else None if detail_a: relative_url = detail_a.get("href", "") if relative_url.startswith("/"): movie_data["detail_url"] = BASE_DOMAIN + relative_url else: movie_data["detail_url"] = relative_url else: movie_data["detail_url"] = "" # 提取封面图片链接 cover_img = item.find("img", class_="movie-cover") movie_data["cover_url"] = cover_img.get("src", "") if cover_img else "" # 提取评分 score_tag = item.find("span", class_="movie-score") movie_data["score"] = score_tag.get_text(strip=True) if score_tag else "暂无评分" movie_list.append(movie_data) return movie_list代码原理:利用find_all批量获取所有影片容器标签,再逐层嵌套定位子标签。影视站点链接多为相对路径,代码中增加路径判断逻辑,自动拼接域名生成完整绝对链接,防止后续请求地址失效。所有标签提取均做空值判断,避免因页面元素缺失导致程序崩溃。
4.5 影片详情页解析模块
进入单部影片详情页,解析导演、主演、上映年份、影片类型、剧情简介等深度数据,同时使用正则表达式清洗文本中的多余换行、空格等无效字符。
python
运行
def parse_movie_detail(html): """解析影片详情页,补充完整影片信息""" detail_data = { "release_year": "未知", "movie_type": "未知", "region": "未知", "director": "未知", "actor": "未知", "duration": "未知", "score_count": "0", "intro": "暂无简介" } if not html: return detail_data soup = BeautifulSoup(html, "html.parser") # 上映年份、地区、类型 info_box = soup.find("div", class_="movie-basic-info") if info_box: info_text = info_box.get_text(strip=True) # 正则提取年份 year_res = re.search(r"(\d{4})", info_text) if year_res: detail_data["release_year"] = year_res.group(1) # 分割文本提取类型与地区 info_split = re.split(r"[\s/]", info_text) detail_data["movie_type"] = "、".join([i for i in info_split if len(i) < 6]) # 导演与主演 star_box = soup.find("div", class_="movie-star") if star_box: star_text = star_box.get_text(strip=True) director_res = re.search(r"导演[::](.*?)主演", star_text, re.S) actor_res = re.search(r"主演[::](.*?)$", star_text, re.S) if director_res: detail_data["director"] = director_res.group(1).strip() if actor_res: detail_data["actor"] = actor_res.group(1).strip() # 片长 time_tag = soup.find("span", class_="movie-time") if time_tag: detail_data["duration"] = time_tag.get_text(strip=True) # 评分人数 count_tag = soup.find("span", class_="score-num") if count_tag: detail_data["score_count"] = count_tag.get_text(strip=True) # 剧情简介,正则清洗换行与空格 intro_tag = soup.find("div", class_="movie-intro") if intro_tag: raw_intro = intro_tag.get_text() # 清洗无效字符 clean_intro = re.sub(r"\s+", "", raw_intro) detail_data["intro"] = clean_intro return detail_data代码原理:详情页数据分布零散,部分信息无独立标签,因此结合正则表达式完成精准提取。正则re.S参数开启单行匹配模式,支持跨行文本检索。re.sub替换所有连续空白字符,完成剧情简介的标准化清洗。函数预设默认值,保证即使页面元素缺失,字典字段依然完整。
4.6 影评数据解析模块
分为静态 HTML 影评解析与 JSON 接口影评解析两套逻辑,适配不同影视站点的加载方式,自动区分短评与长影评类型。
python
运行
def parse_comment_html(html, comment_type="短评"): """解析静态页面影评数据""" comment_list = [] if not html: return comment_list soup = BeautifulSoup(html, "html.parser") comment_items = soup.find_all("div", class_="comment-item") for item in comment_items: comment = {} # 用户名 user_tag = item.find("span", class_="user-name") comment["user_name"] = user_tag.get_text(strip=True) if user_tag else "匿名用户" # 用户评分 user_score = item.find("span", class_="user-score") comment["user_score"] = user_score.get_text(strip=True) if user_score else "无评分" # 评论时间 time_tag = item.find("span", class_="comment-time") comment["comment_time"] = time_tag.get_text(strip=True) if time_tag else "未知时间" # 评论内容 content_tag = item.find("p", class_="comment-content") comment["comment_content"] = content_tag.get_text(strip=True) if content_tag else "" # 点赞、回复数 like_tag = item.find("span", class_="like-num") reply_tag = item.find("span", class_="reply-num") comment["like_num"] = like_tag.get_text(strip=True) if like_tag else "0" comment["reply_num"] = reply_tag.get_text(strip=True) if reply_tag else "0" # 评论类型 comment["comment_type"] = comment_type comment_list.append(comment) return comment_list def parse_comment_json(json_str): """解析JSON接口返回的影评数据""" comment_list = [] try: data = json.loads(json_str) comment_arr = data.get("data", []) for item in comment_arr: comment = {} comment["user_name"] = item.get("username", "匿名用户") comment["user_score"] = item.get("score", "无评分") comment["comment_time"] = item.get("createtime", "未知时间") comment["comment_content"] = item.get("content", "") comment["like_num"] = str(item.get("likenum", 0)) comment["reply_num"] = str(item.get("replynum", 0)) # 区分评论类型 c_type = "长影评" if item.get("is_long", 0) == 1 else "短评" comment["comment_type"] = c_type comment_list.append(comment) except Exception as e: print(f"JSON数据解析失败:{str(e)}") return comment_list代码原理:静态影评依靠标签遍历提取数据,接口影评通过json.loads转换为字典后直接读取键值。代码根据接口返回字段is_long自动划分短评与长影评,分类存储。两套解析函数相互独立,使用者可根据目标站点技术架构灵活选用。
4.7 Excel 数据导出模块
读取 SQLite 数据库中全部影片与影评数据,分工作表写入 Excel 文件,实现数据可视化汇总。
python
运行
def export_data_to_excel(): """将数据库数据导出至Excel""" # 创建工作簿 wb = openpyxl.Workbook() # 删除默认工作表 wb.remove(wb.active) # 新建影片信息工作表 sheet1 = wb.create_sheet("影片基础信息") movie_header = ["序号", "影片名称", "上映年份", "影片类型", "地区", "导演", "主演", "片长", "综合评分", "评分人数", "剧情简介", "封面链接", "详情链接", "采集时间"] sheet1.append(movie_header) # 新建影评信息工作表 sheet2 = wb.create_sheet("用户影评数据") comment_header = ["序号", "影片名称", "用户名", "个人评分", "评论时间", "评论内容", "点赞数", "回复数", "评论类型", "采集时间"] sheet2.append(comment_header) # 读取数据库数据 conn, cur = get_db_conn() if not conn: return try: # 写入影片数据 cur.execute("SELECT * FROM movie_info") movie_rows = cur.fetchall() for row in movie_rows: sheet1.append(row) # 写入影评数据 cur.execute("SELECT * FROM movie_comment") comment_rows = cur.fetchall() for row in comment_rows: sheet2.append(row) # 保存文件 wb.save(EXCEL_SAVE_PATH) print(f"Excel数据导出完成,文件路径:{EXCEL_SAVE_PATH}") except Exception as e: print(f"Excel导出失败:{str(e)}") finally: close_db_conn(conn, cur)代码原理:使用多工作表区分不同类型数据,结构清晰便于查阅。先定义表头,再逐行遍历数据库查询结果完成写入。文件保存前捕获异常,避免文件损坏或写入失败。
4.8 主调度函数
整合所有功能模块,按照 “分页爬取列表→遍历详情页→采集影评→数据入库→导出 Excel” 的完整流程执行,是程序入口核心逻辑。
python
运行
def main(): print("========== 影视网站影片及影评爬虫启动 ==========") # 初始化数据库连接 conn, cur = get_db_conn() if not conn: return # 循环爬取影片列表分页 for page in range(1, MAX_LIST_PAGE + 1): print(f"\n正在爬取第{page}页影片列表...") list_url = MOVIE_LIST_URL.format(page) list_html = send_request(list_url) movie_list = parse_movie_list(list_html) if not movie_list: print(f"第{page}页无影片数据,跳过") continue # 遍历单页所有影片 for movie in movie_list: movie_name = movie["movie_name"] detail_url = movie["detail_url"] print(f"开始采集影片:{movie_name}") # 爬取并解析详情页 detail_html = send_request(detail_url) detail_info = parse_movie_detail(detail_html) # 合并完整影片数据 full_movie_data = {**movie, **detail_info} # 影片数据入库 insert_movie_data(conn, cur, full_movie_data) # 分页爬取影评(JSON接口方式) for c_page in range(1, MAX_COMMENT_PAGE + 1): comment_api = COMMENT_API_URL.format(movie_name, c_page) comment_json = send_request(comment_api) comment_data = parse_comment_json(comment_json) if comment_data: insert_comment_data(conn, cur, comment_data, movie_name) # 关闭数据库连接 close_db_conn(conn, cur) # 导出Excel文件 export_data_to_excel() print("\n========== 爬虫全部任务执行完成 ==========") if __name__ == "__main__": main()代码原理:采用双层循环结构,外层循环遍历影片列表分页,内层循环遍历单页内所有影片。通过字典合并整合列表页与详情页数据,保证字段完整。影评部分同样开启分页循环,实现多页评论采集。程序执行完毕后自动触发 Excel 导出,实现全流程自动化。
五、代码适配、运行规范与合规说明
5.1 站点适配修改要点
本代码为通用模板,对接不同影视网站时,核心修改集中在页面标签与 URL 地址两部分:
- 打开浏览器开发者工具,定位影片条目、影片基础信息、评论条目对应的
class属性,替换代码中find_all、find方法内的类名; - 根据目标站点实际分页规则、影评接口地址,修改全局配置中的
MOVIE_LIST_URL与COMMENT_API_URL; - 若站点仅使用静态 HTML 展示影评,将影评抓取逻辑切换为
parse_comment_html函数。
5.2 运行操作步骤
- 完成环境搭建与依赖库安装,确认 SQLite 数据库文件可正常创建;
- 根据目标影视网站页面结构,修改标签名称、URL、分页参数等配置;
- 直接运行 Python 文件,控制台会实时输出爬取日志、入库状态;
- 程序运行结束后,在同级目录下查看
movie_data.db数据库文件与 Excel 汇总文件。
5.3 合规与风险提示
本项目仅用于编程学习、技术研究场景,使用过程中必须遵守目标网站用户协议与《网络安全法》相关规定。禁止大规模高频爬取、批量倒卖影视数据与用户评论信息;不得绕过站点权限限制抓取付费内容、隐私信息。合理设置请求延时,避免对目标服务器造成负载压力。
5.4 常见问题排查
- 页面解析数据为空:检查标签 class 名称是否与目标页面一致,核对 URL 地址是否有效,打印 HTML 源码确认页面是否正常返回;
- JSON 影评解析失败:抓包确认影评接口地址、请求方式、请求参数是否变更,检查接口返回数据格式;
- 中文乱码:优先使用代码中自动编码逻辑,若仍存在乱码,可手动指定编码为
utf-8或gbk; - 文件无法保存:检查文件路径权限,关闭已打开的 Excel 与数据库文件,避免文件被占用。
六、项目优化与功能扩展方向
6.1 功能扩展
- 增加图片下载功能:基于影片封面链接,使用 Requests 实现图片批量下载,分类保存至本地文件夹;
- 关键词筛选爬取:增加影片类型、地区、评分筛选逻辑,仅抓取指定条件的影片数据;
- 评论情感分析:结合分词与情感分析库,对影评内容做正负向情感判定,实现舆情分析;
- 增量爬取:记录上一次爬取时间,仅采集新增影片与新增评论,减少重复请求。
6.2 性能与稳定性优化
- 会话保持:使用
requests.Session创建持久会话,复用连接,提升连续请求效率; - 代理 IP 配置:针对存在 IP 限制的站点,增加代理池逻辑,轮换 IP 地址;
- 多线程异步抓取:针对海量影片场景,使用多线程拆分任务,在控制并发数的前提下提升爬取速度;
- 日志系统:集成 logging 库,分级记录运行日志、异常日志,便于长期运维与问题定位。
七、项目总结
本文完成了一套完整的影视网站多级爬虫项目,覆盖列表页、详情页、评论页三级页面抓取,同时兼容静态 HTML 与 JSON 接口两种主流数据加载方式,搭配 SQLite 与 Excel 双方案完成数据持久化。整套代码采用模块化设计,功能拆分清晰,注释完善,具备较强的通用性与可维护性。
通过本项目可系统掌握多级联动爬虫开发、HTML 与 JSON 混合解析、正则文本清洗、轻量数据库操作、反爬基础应对等核心技能。影视类爬虫是互联网数据采集领域的经典场景,其页面层级结构、数据格式特征具备行业代表性,所学逻辑可快速迁移至资讯、动漫、综艺等同类站点的采集开发工作中。在实际落地使用时,始终以合规为前提,结合站点规则灵活调整爬取策略,保障爬虫长期稳定运行。
