跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

从零构建国产电视剧评分数据集:一个爬虫实战记录

这个爬虫项目用 urllib3 下载全集网的电视剧页面,BeautifulSoup 提取标题、评分和主演,最后把 9270 条数据写入 CSV。中间处理了翻页循环、空格换行清洗,并加了延时避免请求过密。完整代码可以直接运行,适合爬虫入门练手。

清心发布于 2026/6/300 浏览
从零构建国产电视剧评分数据集:一个爬虫实战记录

想要一份国产电视剧的数据集来练手?不如直接爬一个。这次的目标是'全集网',它的电视剧列表页面结构清晰,翻页逻辑也直白——改个页码参数就行。最终我们会拿到剧名、评分和主演信息,输出一个 CSV 文件。整个过程覆盖了爬虫的基本环节:下载、提取和保存,代码也都会贴出来,可以直接跑。

全集网国产电视剧分类页面

打开全集网的国产电视剧分类,可以看到页面上已经显示了剧名、评分和主演,这正是我们需要的数据。地址栏的 URL 有个特点:第一页是 vodshow/13--------1---.html,点第二页后,URL 中间的 1 变成了 2。很明显,只要循环改变这个数字,就能访问所有页面。底部也是传统的翻页,没搞什么异步加载,这使得我们的爬虫不用去模拟 XHR,直接用 urllib3 请求即可。

URL 的变化

翻页按钮

第二页的 URL

下载网页

先写两个基础函数:一个下载网页,一个保存到文件。这里沿用之前用过的 urllib3,不引入新依赖。

import urllib3

def download_content(url):
    http = urllib3.PoolManager()
    response = http.request("GET", url)
    response_data = response.data
    html_content = response_data.decode()
    return html_content

def save_to_file(filename, content):
    fo = open(filename, "w", encoding="utf-8")
    fo.write(content)
    fo.close()

单个页面测试一下,下载第一页并保存为 tv1.html:

url = "https://www.fschurun.com/vodshow/13--------1---.html"
html_content = download_content(url)
save_to_file("tvs_html/tv1.html", html_content)

打开保存的 HTML 文件,能看到诸如《藏药令》这样的电视剧信息,说明内容不是动态注入的,urllib3 下载没毛病。

保存的 HTML 中包含电视剧数据

接下来把 137 个页面都下载下来。在循环里每次暂停一秒,别太快给人家服务器添麻烦。文件名按 tv1.html 到 tv136.html 递增(实际有 136 页,我习惯留一页容错,后面提取时处理 1~136)。

import time

for i in range(2, 137):
    url = "https://www.fschurun.com/vodshow/13--------" + str(i) + "---.html"
    print("begin download:", url)
    html = download_content(url)
    filename = "tvs_html/tv" + str(i) + ".html"
    save_to_file(filename, html)
    print("download end")
    time.sleep(1)

执行过程中,控制台会每隔一秒打印进度。跑完后,tvs_html 文件夹里就有了一百多个 HTML 文件。

下载过程控制台输出

下载完成的 HTML 文件

提取数据

现在要从 HTML 里抓出我们需要的信息。用 BeautifulSoup 解析比较省事。先写个函数从文件创建 BeautifulSoup 对象。

from bs4 import BeautifulSoup

def create_doc_from_file(filename):
    fo = open(filename, "r", encoding="utf-8")
    html_content = fo.read()
    fo.close()
    doc = BeautifulSoup(html_content, "html.parser")
    return doc

观察页面结构:每个电视剧是一个 li,外层是一个 div,class 为 ewave-vodlist__box。评分放在 class="ewave-vodlist__thumb lazyload" 的 div 里的 span 下;剧名是 class="ewave-vodlist__detail" 下的 h4;主演是同一个 detail div 里的 p。

页面 HTML 结构

第一次尝试直接提取文本,结果带了一堆换行和多余空格。

提取结果带空格换行

写个正则清理一下:

import re

def remove_extra_spaces(string):
    string = re.sub(' +', ' ', string)
    string = string.strip().replace("\n", " ")
    return string

下面函数从一个 HTML 文件解析出所有电视剧的信息,返回字典列表。注意评分那个 span 有两个 class,我们用 find 定位。

def get_tv_from_html(html_file_name):
    doc = create_doc_from_file(html_file_name)
    box_list = doc.find_all("div", class_="ewave-vodlist__box")
    tv_list = []
    for box in box_list:
        rating = box.find("div", class_="ewave-vodlist__thumb lazyload").find("span", class_="pic-tag pic-tag-h").text
        title = box.find("div", class_="ewave-vodlist__detail").find("h4", class_="title text-overflow").text
        stars = box.find("div", class_="ewave-vodlist__detail").find("p", class_="text text-overflow text-muted hidden-xs text-actor").text
        tv_dict = {}
        tv_dict['title'] = title
        tv_dict['rating'] = rating
        tv_dict['stars'] = remove_extra_spaces(stars)
        tv_list.append(tv_dict)
    return tv_list

用 tv1.html 试一下,打印出来干净多了:

清洗后的数据

再测试一下第二个文件,确认函数没问题:

tv_list = get_tv_from_html("tvs_html/tv2.html")
print(tv_list)

从 tv2.html 提取的数据

生成的字典列表也符合预期:

字典列表结构

处理所有页面并保存 CSV

现在遍历所有本地文件,把结果汇总到一个大列表。

all_tv_dict = []
for i in range(1, 136):  # 注意我们下载了 tv1~tv136
    filename = "tvs_html/tv" + str(i) + ".html"
    dict_list = get_tv_from_html(filename)
    all_tv_dict = all_tv_dict + dict_list
print(len(all_tv_dict))

一共抓到了 9270 条电视剧记录。

最终记录数量

最后一步,写入 CSV。表头用 title、rating、stars。

import csv

def write_dict_list_to_file(dict_list, filename, headers):
    fo = open(filename, "w", newline="", encoding="utf-8")
    writer = csv.DictWriter(fo, headers)
    writer.writeheader()
    writer.writerows(dict_list)
    fo.close()

write_dict_list_to_file(all_tv_dict, "tv_rating.csv", ["title", "rating", "stars"])

代码运行完,当前目录就生成了 tv_rating.csv。

生成的 CSV 文件

用 Excel 打开看看,9270 行数据整整齐齐。

CSV 在 Excel 中的预览

这样,一份国产电视剧评分数据集就搞定了。从选目标、下载多页、提取清洗到保存 CSV,全流程跑通。如果你有自己的目标网站,调整选择器和翻页逻辑就行,剩下的代码基本可以复用。

  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 汉诺塔问题的递归与非递归 C++ 解法
  • 7款国内AI助手横评:豆包、元宝、千问、Kimi、DeepSeek、MiniMax、GLM
  • 2026 算法求职:为什么我劝你深耕多模态大模型
  • 2023年网络安全趋势观察:十个绕不开的方向
  • 用 MGeo 和 Neo4j 搭建中文地址语义知识图谱
  • 在飞书里用 Openclaw 运行多个机器人:配置与分工实践
  • 金仓 KES 迁移适配实测:从 Oracle 到 SQL Server 的兼容性验证
  • 用LangChain手搓一个数学Agent:工具、执行器与边界控制
  • 代码中介翻译:从语言模型蒸馏视觉推理数据的探索
  • C++ 字符串操作实战:std::string 的常用接口、迭代器与内存管理
  • OpenClaw 对接飞书:让聊天框变成电脑遥控器
  • Python接口自动化测试:从零封装到可维护框架
  • Java 网络通信实战:Socket 编程与 MINA 框架上手
  • 三种 AI 编程助手的真实上手体验:Copilot、Cursor 与 JetBrains
  • 微搭低代码:手机号登录与RBAC路由控制
  • 深入 Llama:从技术架构看开源大模型的崛起
  • WorkBuddy 上手实录:从安装到微信接管个人 AI 工作台
  • 用 Docker 部署 Web-Check 并通过 cpolar 实现远程网站诊断
  • 鸿蒙Flutter下借助wasm_ffi加载WebAssembly的经验整理
  • pycdc 上手指南:从 .pyc 还原 Python 源码

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online