跳到主要内容 Python 爬虫实战:爬取国产电视剧信息并构建评分数据集 | 极客日志
Python 算法
Python 爬虫实战:爬取国产电视剧信息并构建评分数据集 本文通过 Python 爬虫技术抓取国产电视剧数据,涵盖网页下载、HTML 解析及数据存储三个核心环节。首先分析目标网站结构,确定翻页机制;接着使用 urllib3 批量下载 HTML 文件,利用 BeautifulSoup 提取剧名、评分和主演信息,并通过正则处理文本格式;最后将清洗后的数据保存为 CSV 文件,完成数据集构建。整个过程展示了从需求分析到代码实现的全流程,适合初学者掌握网络爬虫的基本方法。
清心 发布于 2025/2/6 更新于 2026/4/20 1 浏览在前面几篇文章中,我们了解了 Python 爬虫技术的三个基础环节:下载网页、提取数据以及保存数据。
这一篇文章,我们通过实际操作来将三个环节串联起来,以国产电视剧为例,构建我们的电视剧评分数据集。
1、需求描述 收集目前国产电视剧的相关数据,需要构建国产电视剧和评分的数据集。
2、需求说明 收集国产电视剧的数据,越全越好,至少收集评分、电视剧名称、主演信息三个信息。之后将数据存储在一个 csv 表中,表头如下:
title,代表电视剧名称
rating,代表电视剧评分
stars,代表电视剧主演
3、初步分析 在基于 Python 技术来构建数据集的方式中,首当其冲要做的事情就是选择要抓取的网站。选择的标准一般主要看网站是否具备我们想要的信息,以及是否方便抓取。
这次我们要抓取的电视剧信息中,还有一个重要的考量因素就是是否方便抓取多个页面 ,毕竟一个网页一般都无法包含全部的电视剧信息。
我们在下载 HTML 页面的环节往往需要下载多个页才能获取完整的数据。
通过在搜索引擎搜索有电视剧列表的网站,我们决定下载'全集网'中的电视剧信息。
4、全集网主页分析 通过观察以上页面,可以发现该网页我们想要的字段:标题、评分和主演信息在页面上都有显示,只要显示就说明我们可以通过爬虫拿到。
现在我们来考察它的加载方式,拉到底部,可以看到该网页提供的是传统的翻页操作。如下所示:
我们点击第二页,发现跳转到了一个新的页面,该页面的 URL 和我们一开始访问的差不多,只是其中有一个数据的值变成了 2。
这说明我们可以通过不断改变 URL 中的 页码 参数的值,来访问第二页之后的内容。这样在后续写代码中,我们只需要写针对一个页面的抓取代码,然后用一个循环来不断执行该方法,并每次叠加 page 的值就能实现将所有电视剧的内容抓取下来。
综上所述,全集网的页面更符合我们本次抓取的任务需求,我们后续就将该网页作为我们的抓取目标。
5、数据获取 - 下载所需网页 全集网的电视剧比较多,我们本次下载的 html 网页也会很多,所以可以在电脑上新建一个文件夹,在文件夹中新建我们的程序文件,将下载的网页保存在同级文件夹即可。(创建文件夹可以手动创建,无需通过程序,大家自行创建吧!)
创建完文件夹和程序文件后,先编写下载网页和保存文件的代码。
不想写的可以直接把前面文章中的网页下载代码和数据保存到文件的代码复制过来。
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()
运行以上代码后,我们就可以使用这两个函数来下载网页了。
(1)单个网页下载
url = "https://www.fschurun.com/vodshow/13--------1---.html"
html_content = download_content(url)
save_to_file("tvs_html/tv1.html" ,html_content)
接下来,我们点击 tv1.html 打开,来查看是否有我们需要的电视剧信息。回过头去看我们上文中发的截图,有个电视剧的名称是《藏药令》。
说明电视剧网的内容不是动态生成的,可以用 urllib3 进行下载。
(2)多个网页下载 现在第一个网页已经下载成功了。我们目标是下载 137 个网页的内容,所以剩余的可以通过一个循环来下载。在我们之前的分析中,下载第二页和之后的内容只需要修改 URL 中的 page 的值即可。
另外,在我们通过循环来批量下载内容的时候,还有一个很重要的注意事项,一般都会在每次下载之后等待几百毫秒的时间,再进行下一次下载,这样可以避免短时间内对网站发起大量的下载请求,浪费网站的带宽资源。
在今天这个案例中,我们每次下载之后等待一秒再进行下一次下载。在 Python 中,我们可以通过 time 模块的 sleep 方法来使程序暂停固定的时间。
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 );
执行上述程序,可以看到程序每隔一秒钟输出一行信息,如下所示。
执行完毕后,我们在侧边栏打开 htmls 文件夹,可以看到我们的 137 个 html 文件已经保存成功。
6、数据提取 我们前面的需求分析已经提到了,需要电视剧的名称、评分和主演信息。那我们就开始分析网页,找到我们需要的数据所在的标签。
电视剧列表是用 ul 布局,每个 li 代表一个电视剧。
在 li 里面,又有两个 div,第一个 div 来展示电视剧评分。第二个 div 来展示电视剧名称和主演信息。
具体的内容又以 span 标签、h4 标签或 p 标签来展示。
获取所有 class=ewave-vodlist__box 的 div 标签对象。
针对每一个标签对象,都尝试:
查找 div,class 为 ewave-vodlist__thumb lazyload 下面的 span 标签的值,作为评分数据。
查找 div,class 为 ewave-vodlist__detail 下面的 h4 标签的值,作为电视剧名称。
查找 div,class 为 ewave-vodlist__detail 下面的 p 标签的值,作为主演数据
(1)提取单个 HTML 的所有电视剧信息 接下里,我们按照上面的数据提取思路,来编写获取单个 HTML 文件电视剧信息的代码。单个文件处理完之后,扩展到多个文件的数据处理就简单了。代码如下:
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);
return doc;
doc = create_doc_from_file("tvs_html/tv1.html" );
box_list = doc.find_all("div" ,class_="ewave-vodlist__box" );
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;
print (title, rating, stars)
执行之后,输出如下(截取了部分日志)。可以看到我们想要的信息是有了,但是却好像带了很多没必要的空格和换行。
针对抽取的结果出现空格和换行的问题,我们可以使用正则表达式来处理。创建一个格式处理的函数:
import re
def remove_extra_spaces (string ):
string = re.sub(' +' ,' ' ,string);
string = string.strip().replace("\n" ," " );
return string;
在我们上面打印语句中,主演的数据中调用一下这个函数,就可以按规则去掉空格和换行。
doc = create_doc_from_file("tvs_html/tv1.html" );
box_list = doc.find_all("div" ,class_="ewave-vodlist__box" );
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;
print (title, rating, remove_extra_spaces(stars))
(2)提取多个 HTML 的内容 通过上述代码,我们已经可以将 tv1.html 文件中的所有电视剧信息给打印出来。但我们这次一共有一百多个 html 文件,要怎么实现处理多个 html 文件呢?
因为这一百个 HTML 文件虽然电视剧内容不一样,但是标签结构却是基本一样的(在电视剧网翻页的时候,可以看到每一页的样子都是一样的)。所以我们只需要将上面的代码放在循环中循环运行,然后每次循环都处理不同的 html 文件即可。
为了让代码更加清晰,我们先将上面的处理单个文件的代码改写为函数,参数就是要处理的 html 文件名,函数则命名为:get_tv_from_html。
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" );
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;
print (title, rating, remove_extra_spaces(stars))
get_tv_from_html("tvs_html/tv2.html" )
可以看到,我们成功用我们写的函数来从 tv2.html 中提取了电视剧的信息。这样要实现从一百多个文件中抽取信息,只需要写一个循环,来每次传给 get_tv_from_html 函数不同的文件名即可。【这里就不再放循环代码了,新手小伙伴可以试试自己来写,如果有问题可以联系。】
截止到现在,我们已经把网页下载下来了,并且把我们需要的内容抽取出来了,剩下的一步就是写到 CSV 中。
7、数据保存 - 将数据保存到 CSV 中 要将数据保存为 csv 的记录,我们首先需要将每一行数据保存为字典,然后以一个字典列表的形式传递给 csv 模块的 DictWriter。
(1)准备保存到 CSV 的函数 为了让后续代码更简洁,我们先将把字典列表保存到 csv 文件的操作写成一个函数。
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()
(2)创建电视剧字典列表
(3)改造 get_tv_from_html 函数
def get_tv_from_html (html_file_name ):
doc = create_doc_from_file(html_file_name);
tv_list = [];
box_list = doc.find_all("div" ,class_="ewave-vodlist__box" );
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' ] = stars;
tv_list.append(tv_dict)
return tv_list
tv_list = get_tv_from_html("tvs_html/tv2.html" )
print (tv_list)
(4)获取所有文件的电视剧信息 目前,我们通过 get_tv_from_file 函数,已经可以获取单个 html 的电视剧列表,现在我们需要通过一个循环,去处理所有的 html。对于每一个 html 文件,获取字典列表之后,都把列表添加到我们的总列表:all_tv_dict 中。这样,在循环执行结束后,all_tv_dict 变量中就包含了所有电视剧的信息。
for i in range (1 , 136 ):
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))
因为要用 BeautifulSoup 处理一百多个文件,这里执行会有点慢。需要耐心等一下,执行完毕后输出结果为 9270。
(5)保存结果到 csv 文件中 在需求说明中,已经明确了要保存的 csv 文件名为:tv_rating.csv,表头为:title, rating, stars。
现在,我们所有电视剧的信息都已经存储在 all_tv_dict 总列表中,现在我们只需要调用存储到 csv 的函数将其保存到 csv 文件即可。
write_dict_list_to_file(all_tv_dict, "tv_rating.csv" , ["title" , "rating" , "stars" ]);
执行之后,没有内容输出,但是可以看到在源代码文件夹下已经生成了 tv_rating.csv 文件。
使用 Excel 打开该 csv 文件,可以看到我们的表头已经正确写入,表头对应的内容也已经正确写入。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
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