
1.项目介绍项目目的获取高分电影榜单TOP100数据并保存在 CSV 文件中数据包括电影名年份上映时间类型时长评分语言导演作者主演Slogan介绍项目步骤明确网站The Movie Database (TMDB)的 robots.txt 中的抓取规则查看页面的结构拆解具体的操作步骤按步骤开发获取高分电影列表数据遍历电影列表获取每一部电影的详情信息并提取电影数据信息将电影详情信息保存到 csv 文件中2.CSV 操作2.1 CSV 概述CSVComma-Separated Values逗号分隔符是一种简单通用的文本文件格式用于存储表格数据可以直接使用 Excel 打开2.2 CSV操作2.2.1 原始操作使用 python 提供的原始的文件操作#读 with open(csv_Data/新建 文本文档.csv,r,encodingutf-8) as f: print(f原始CSV文件内容{f.read()}) print(---------------------------------------------------------) #写 with open(csv_Data/新建 文本文档.csv,a,encodingutf-8) as f: f.write(小二,男,22,足球\n)#写入数据 f.write(小四,女,20,篮球\n) f.write(小六,男,21,羽毛球\n) #读 with open(csv_Data/新建 文本文档.csv,r,encodingutf-8) as f: print(f更新后CSV文件内容{f.read()})结果如下2.2.2 使用csv标准库操作使用 csv 标准库里面提供的操作import csv with open(csv_Data/资源2.csv,r,encodingutf-8,newline) as f: print(f原始CSV文件内容{f.read()}) print(---------------------------------------------------------) #写操作 with open(csv_Data/资源2.csv,a,encodingutf-8,newline) as f: writer csv.DictWriter(f,fieldnames[姓名,性别,年龄,爱好]) writer.writeheader() #写入表头 #写入表格内容 writer.writerow({姓名:王炸,性别:男,年龄:22,爱好:跑步}) writer.writerow({姓名:小红,性别:女,年龄:20,爱好:唱歌}) writer.writerow({姓名:小刚,性别:男,年龄:21,爱好:跳舞}) writer.writerow({姓名:小芳,性别:女,年龄:23,爱好:画画}) #读操作 with open(csv_Data/资源2.csv,r,encodingutf-8,newline) as f: reader csv.DictReader(f) for row in reader: print(row)3.项目实现3.1 获取高分电影列表数据高分电影列表网页结构如下所示获取高分电影列表数据源代码如下:import requests import csv from lxml import html #常量 TMDB_BASE_URL https://www.themoviedb.org/ TMDB_TOP100_URL https://www.themoviedb.org/movie/top-rated def main(): #发送请求获取高分电影榜单数据 response requests.get(TMDB_TOP100_URL) #解析数据获取电影列表数据 doc html.fromstring(response.text) movie_list doc.xpath(//*[idpage_1]/div[1]/div/div)3.2 遍历电影列表提取电影数据信息该阶段要完成遍历电影列表中的电影 , 获取相应电影详情数据:获得各个电影详情的 url获取电影详情函数import requests import csv from lxml import html #常量 TMDB_BASE_URL https://www.themoviedb.org/ TMDB_TOP100_URL https://www.themoviedb.org/movie/top-rated #获取电影详情函数 def get_movie_info(movie_info_url): movie_info {} #字典初始化为空,用来存储电影详情数据 #1.发送请求获取电影详情数据 movie_response requests.get(movie_info_url) print(f发送请求{movie_info_url},获取电影详情数据...) #2.解析数据,获取电影详情 movie_doc html.fromstring(movie_response.text) movie_name movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/h2/a/text()) #获取电影名称 movie_year movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/h2/span/text())#获取电影年份 movie_release_date movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classrelease]/text())#获取电影上映时间 movie_type movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classgenres]/a/text())#获取电影类型 movie_runtime movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classruntime]/text())#获取电影时长 movie_rating movie_doc.xpath(//*[idconsensus_pill]/div/div[1]/div/div/data-percent)#获取电影评分 movie_language movie_doc.xpath(//*[idmedia_v4]/div/div/div[2]/div/section/div[1]/div/section[1]/p[3]/text())#获取电影语言 movie_director movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/ol/li[1]/p[1]/a/text())#获取电影导演 movie_author movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/ol/li[2]/p[1]/a/text())#获取电影作者 #获取电影slogan movie_slogan movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/h3[1]/text()) movie_description movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/div/p/text())#获取电影简介 movie_info { 电影名: movie_name[0].strip() if movie_name else , 年份: movie_year[0].strip((),) if movie_year else , 上映时间: movie_release_date[0].strip() if movie_release_date else , 类型: ,.join(movie_type) if movie_type else , 时长: movie_runtime[0].strip() if movie_runtime else , 评分: movie_rating[0].strip() if movie_rating else , 语言: movie_language[0].strip() if movie_language else , 导演: ,.join(movie_director) if movie_director else , 作者: ,.join(movie_author) if movie_author else , 宣传语: movie_slogan[0].strip() if movie_slogan else , 简介: movie_description[0].strip() if movie_description else } #3.返回电影详情 -- 字典形式 return movie_info def main(): #1.发送请求获取高分电影榜单数据 response requests.get(TMDB_TOP100_URL) #2.解析数据获取电影列表数据 doc html.fromstring(response.text) movie_list doc.xpath(//*[idpage_1]/div[1]/div/div) #3.遍历电影列表获取每部电影详情 all_movies [] for movie in movie_list: movie_url movie.xpath(./div/div/a/href) if movie_url: #电影详情页的url movie_info_url TMDB_BASE_URL movie_url[0] #发送请求,获取电影详情数据 movie_info get_movie_info(movie_info_url) all_movies.append(movie_info)3.3 将电影信息保存在 csv 文件中该阶段要完成将最终的电影信息保存在指定的 csv 文件中:指明存储的 csv 文件路径保存为 csv 文件函数import requests import csv from lxml import html #常量 MOVIE_LIST_FILE csv_Data/movie_list.csv TMDB_BASE_URL https://www.themoviedb.org/ TMDB_TOP100_URL https://www.themoviedb.org/movie/top-rated #获取电影详情函数 def get_movie_info(movie_info_url): movie_info {} #字典初始化为空,用来存储电影详情数据 #1.发送请求获取电影详情数据 movie_response requests.get(movie_info_url) print(f发送请求{movie_info_url},获取电影详情数据...) #2.解析数据,获取电影详情 movie_doc html.fromstring(movie_response.text) movie_name movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/h2/a/text()) #获取电影名称 movie_year movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/h2/span/text())#获取电影年份 movie_release_date movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classrelease]/text())#获取电影上映时间 movie_type movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classgenres]/a/text())#获取电影类型 movie_runtime movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classruntime]/text())#获取电影时长 movie_rating movie_doc.xpath(//*[idconsensus_pill]/div/div[1]/div/div/data-percent)#获取电影评分 movie_language movie_doc.xpath(//*[idmedia_v4]/div/div/div[2]/div/section/div[1]/div/section[1]/p[3]/text())#获取电影语言 movie_director movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/ol/li[1]/p[1]/a/text())#获取电影导演 movie_author movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/ol/li[2]/p[1]/a/text())#获取电影作者 #获取电影slogan movie_slogan movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/h3[1]/text()) movie_description movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/div/p/text())#获取电影简介 movie_info { 电影名: movie_name[0].strip() if movie_name else , 年份: movie_year[0].strip((),) if movie_year else , 上映时间: movie_release_date[0].strip() if movie_release_date else , 类型: ,.join(movie_type) if movie_type else , 时长: movie_runtime[0].strip() if movie_runtime else , 评分: movie_rating[0].strip() if movie_rating else , 语言: movie_language[0].strip() if movie_language else , 导演: ,.join(movie_director) if movie_director else , 作者: ,.join(movie_author) if movie_author else , 宣传语: movie_slogan[0].strip() if movie_slogan else , 简介: movie_description[0].strip() if movie_description else } #3.返回电影详情 -- 字典形式 return movie_info #保存所有电影信息,保存为csv文件函数 def save_all_movies(all_movies): with open(MOVIE_LIST_FILE, w, newline, encodingutf-8) as csvfile: writer csv.DictWriter(csvfile, fieldnames[电影名, 年份, 上映时间, 类型, 时长, 评分, 语言, 导演, 作者, 宣传语, 简介]) writer.writeheader() writer.writerows(all_movies) #写入数据 def main(): #1.发送请求获取高分电影榜单数据 response requests.get(TMDB_TOP100_URL) #2.解析数据获取电影列表数据 doc html.fromstring(response.text) movie_list doc.xpath(//*[idpage_1]/div[1]/div/div) #3.遍历电影列表获取每部电影详情 all_movies [] for movie in movie_list: movie_url movie.xpath(./div/div/a/href) if movie_url: #电影详情页的url movie_info_url TMDB_BASE_URL movie_url[0] #发送请求,获取电影详情数据 movie_info get_movie_info(movie_info_url) all_movies.append(movie_info) #4.将电影详情保存到csv文件 print(f获取到所有电影详情,保存所有电影数据到{MOVIE_LIST_FILE}文件...) save_all_movies(all_movies)3.4 获取分页数据由于之前代码只实现的 page_1 页面的数据获取 , 无法完成获取 TOP100 热门电影的需求,因此需要获取多页数据:对 1,2,3 阶段使用 for 循环进行页面 1-5 的循环数据提取给出第 2 页之后的高分电影榜单的 url对当前访问页面进行判断 , 选择相应的 urlimport requests import csv from lxml import html #常量 MOVIE_LIST_FILE csv_Data/movie_list.csv TMDB_BASE_URL https://www.themoviedb.org/ TMDB_TOP100_URL1 https://www.themoviedb.org/movie/top-rated #高分电影榜单的url(第1页) TMDB_TOP100_URL2 https://www.themoviedb.org/discover/movie/items #高分电影榜单的url(第2页之后) #获取电影详情函数 def get_movie_info(movie_info_url): #1.发送请求获取电影详情数据 movie_response requests.get(movie_info_url) print(f发送请求{movie_info_url},获取电影详情数据...) #2.解析数据,获取电影详情 movie_doc html.fromstring(movie_response.text) movie_info {} #获取电影名称 movie_name movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/h2/a/text()) #获取电影年份 movie_year movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/h2/span/text()) #获取电影上映时间 movie_release_date movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classrelease]/text()) #获取电影类型 movie_type movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classgenres]/a/text()) #获取电影时长 movie_runtime movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classruntime]/text()) #获取电影评分 movie_rating movie_doc.xpath(//*[idconsensus_pill]/div/div[1]/div/div/data-percent) #获取电影语言 movie_language movie_doc.xpath(//*[idmedia_v4]/div/div/div[2]/div/section/div[1]/div/section[1]/p[3]/text()) #获取电影导演 movie_director movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/ol/li[1]/p[1]/a/text()) #获取电影作者 movie_author movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/ol/li[2]/p[1]/a/text()) #获取电影slogan movie_slogan movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/h3[1]/text()) #获取电影简介 movie_description movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/div/p/text()) movie_info { 电影名: movie_name[0].strip() if movie_name else , 年份: movie_year[0].strip() if movie_year else , 上映时间: movie_release_date[0].strip() if movie_release_date else , 类型: ,.join(movie_type) if movie_type else , 时长: movie_runtime[0].strip() if movie_runtime else , 评分: movie_rating[0].strip() if movie_rating else , 语言: movie_language[0].strip() if movie_language else , 导演: ,.join(movie_director) if movie_director else , 作者: ,.join(movie_author) if movie_author else , 宣传语: movie_slogan[0].strip() if movie_slogan else , 简介: movie_description[0].strip() if movie_description else } #3.返回电影详情 -- 字典形式 return movie_info #保存所有电影信息,保存为csv文件函数 def save_all_movies(all_movies): with open(MOVIE_LIST_FILE, w, newline, encodingutf-8) as csvfile: writer csv.DictWriter(csvfile, fieldnames[电影名, 年份, 上映时间, 类型, 时长, 评分, 语言, 导演, 作者, 宣传语, 简介]) writer.writeheader() writer.writerows(all_movies) #写入数据 #主程序 def main(): all_movies [] #保存所有电影的数据 for page_num in range(1,6): #1.发送请求获取高分电影榜单数据 if page_num 1 : response requests.get(TMDB_TOP100_URL1 ) else: response requests.post(TMDB_TOP100_URL2, fair_date.gteair_date.ltecertificationcertification_countryCNdebugfirst_air_date.gtefirst_air_date.lteinclude_adultfalseinclude_softcorefalselatest_ceremony.gtelatest_ceremony.ltepage{page_num}primary_release_date.gteprimary_release_date.lteregionrelease_date.gterelease_date.lte2027-02-17show_meeverythingsort_byvote_average.descvote_average.gte0vote_average.lte10vote_count.gte300watch_regionCNwith_genreswith_keywordswith_networkswith_origin_countrywith_original_languagewith_watch_monetization_typeswith_watch_providerswith_release_typewith_runtime.gte0with_runtime.lte400 ) print(f发送请求,访问第{page_num}页的数据,获取TMDB高分电影榜单数据...) #2.解析数据获取电影列表数据 doc html.fromstring(response.text) movie_list doc.xpath(f//*[idpage_{page_num}]/div[1]/div/div) #3.遍历电影列表获取每部电影详情 for movie in movie_list: movie_url movie.xpath(./div/div/a/href) if movie_url: #电影详情页的url movie_info_url TMDB_BASE_URL movie_url[0] #发送请求,获取电影详情数据 movie_info get_movie_info(movie_info_url) all_movies.append(movie_info) #4.将电影详情保存到csv文件 print(f获取到所有电影详情,保存所有电影数据到{MOVIE_LIST_FILE}文件...) save_all_movies(all_movies) if __name__ __main__: main()4 正则表达式4.1 定义正则表达式是一种由特定语法规则组成的文本模式用来描述匹配字符串中符合特定规则的字符序列。相当于一种模式匹配工具允许用户通过简洁的语法进行复杂文本的搜索匹配提取和替换工作re 模块是 Python 自带的正则表达式模块其作用是按规则批量查找、提取、替换、清洗文本数据清洗最常用工具之一4.2 语法正则表达式的写法多种多样具体的语法如下代码示例如下:import re s1 18809090000是我的手机号你记住了吗我的另一个手机号是18800008888两个QQ号分别是15500008888 和 13809091293821邮箱为python666163.com,你记住了吗 #正则表达式 print(re.findall(r188.*,s1)) # .匹配任意字符*匹配其前面字符0次或多次 print(re.findall(r188.?,s1)) # .匹配任意字符?匹配其前面字符至多1次 print(re.findall(r188.,s1)) # .匹配任意字符匹配其前面字符至少1次 print(re.findall(r188\d{8},s1)) # \d匹配任意数字{8}匹配其前面字符8次 print(re.findall(r155\d{6,10},s1)) # \d匹配任意数字{6,10}匹配其前面字符6到10次 print(re.findall(r155\d{6,},s1)) # \d匹配任意数字{6,}匹配其前面字符6次或更多 print(re.findall(r1[38]\d{8},s1)) # 1开头,第2位是3或8,\d匹配任意数字{8}匹配其前面字符8次 print(re.findall(r1[^38]\d{8},s1)) # 1开头,第2位是{3,8}以外的数字,\d匹配任意数字{8}匹配其前面字符8次 print(re.findall(r1[3-9]\d{8},s1)) # 1开头,第2位是3-9之间的数字,\d匹配任意数字{8}匹配其前面字符8次 print(re.findall(r^1[3-9]\d{9},s1)) # ^匹配字符串开头为1,第2位是3-9之间的数字,\d匹配任意数字{9}匹配其前面字符9次 print(re.findall(r^1[3-9]\d{9}$,s1)) # ^匹配字符串开头为1,第2位是3-9之间的数字,\d匹配任意数字{9}匹配其前面字符9次,$匹配字符串结尾 print(re.findall(r\w\w\.\w,s1,)) #\w匹配任何单词字符(a-z,A-Z,0-9,_,其他语言字符),\.转义字符只表示匹配. print(re.findall(r\w\w\.\w,s1,re.ASCII)) #re.ASCII限制只匹配ASCII中字符 s2 现在的时间是2026-08-18 19:06:10,今天的天气还可以,气温是28度 print(re.findall(r\d{4}-\d{2}-\d{2},s2)) print(re.findall(r(\d{4})-(\d{2})-(\d{2}),s2)) #封装元组小结:4.3 re库基本操作函数作用返回值re.matchpatstr只从字符串开头匹配第一个Match 对象 / Nonere.searchpatstr从任意位置开始匹配第一个Match 对象 / Nonere.findallpatstr找出全部匹配结果list 列表pat正则表达式str文本字符串代码示例如下5.程序优化程序优化对于电影年份上映时间时长进行数据处理然后存储起来电影年份去除括号上映时间去除国家时长统一换算为min处理后结果为需要进行的操作有导入 re 库获取电影年份函数获取上映时间函数获取时间函数import requests import csv from lxml import html import re #常量 MOVIE_LIST_FILE csv_Data/movie_list2.csv TMDB_BASE_URL https://www.themoviedb.org/ TMDB_TOP100_URL1 https://www.themoviedb.org/movie/top-rated #高分电影榜单的url(第1页) TMDB_TOP100_URL2 https://www.themoviedb.org/discover/movie/items #高分电影榜单的url(第2页之后) #获取电影年份函数 def get_movie_year(movie_year): year movie_year[0].strip() if movie_year else return re.findall(r\d,year)[0] #获取电影上映时间函数 def get_movie_release_date(movie_release_date): release_date movie_release_date[0].strip() if movie_release_date else return re.findall(r\d{4}-\d{2}-\d{2},release_date)[0] #获取电影运行时间函数 def get_movie_runtime(movie_runtime): minutes 0 runtime movie_runtime[0].strip() if movie_runtime else hour re.search(r(\d)h,runtime) minute re.search(r(\d)m,runtime) h int(hour.group(1)) if hour else 0 m int(minute.group(1)) if minute else 0 minutes h * 60 m return minutes #获取电影详情函数 def get_movie_info(movie_info_url): #1.发送请求获取电影详情数据 movie_response requests.get(movie_info_url) print(f发送请求{movie_info_url},获取电影详情数据...) #2.解析数据,获取电影详情 movie_doc html.fromstring(movie_response.text) movie_info {} #获取电影名称 movie_name movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/h2/a/text()) #获取电影年份 movie_year movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/h2/span/text()) #获取电影上映时间 movie_release_date movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classrelease]/text()) #获取电影类型 movie_type movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classgenres]/a/text()) #获取电影时长 movie_runtime movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[1]/div/span[classruntime]/text()) #获取电影评分 movie_rating movie_doc.xpath(//*[idconsensus_pill]/div/div[1]/div/div/data-percent) #获取电影语言 movie_language movie_doc.xpath(//*[idmedia_v4]/div/div/div[2]/div/section/div[1]/div/section[1]/p[3]/text()) #获取电影导演 movie_director movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/ol/li[1]/p[1]/a/text()) #获取电影作者 movie_author movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/ol/li[2]/p[1]/a/text()) #获取电影slogan movie_slogan movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/h3[1]/text()) #获取电影简介 movie_description movie_doc.xpath(//*[idoriginal_header]/div[2]/section/div[3]/div/p/text()) movie_info { 电影名: movie_name[0].strip() if movie_name else , 年份: get_movie_year(movie_year), 上映时间: get_movie_release_date(movie_release_date), 类型: ,.join(movie_type) if movie_type else , 时长: get_movie_runtime(movie_runtime), 评分: movie_rating[0].strip() if movie_rating else , 语言: movie_language[0].strip() if movie_language else , 导演: ,.join(movie_director) if movie_director else , 作者: ,.join(movie_author) if movie_author else , 宣传语: movie_slogan[0].strip() if movie_slogan else , 简介: movie_description[0].strip() if movie_description else } #3.返回电影详情 -- 字典形式 return movie_info #保存所有电影信息,保存为csv文件函数 def save_all_movies(all_movies): with open(MOVIE_LIST_FILE, w, newline, encodingutf-8) as csvfile: writer csv.DictWriter(csvfile, fieldnames[电影名, 年份, 上映时间, 类型, 时长, 评分, 语言, 导演, 作者, 宣传语, 简介]) writer.writeheader() writer.writerows(all_movies) #写入数据 pass def main(): all_movies [] #保存所有电影的数据 for page_num in range(1,6): #1.发送请求获取高分电影榜单数据 if page_num 1 : response requests.get(TMDB_TOP100_URL1 ) else: response requests.post(TMDB_TOP100_URL2, fair_date.gteair_date.ltecertificationcertification_countryCNdebugfirst_air_date.gtefirst_air_date.lteinclude_adultfalseinclude_softcorefalselatest_ceremony.gtelatest_ceremony.ltepage{page_num}primary_release_date.gteprimary_release_date.lteregionrelease_date.gterelease_date.lte2027-02-17show_meeverythingsort_byvote_average.descvote_average.gte0vote_average.lte10vote_count.gte300watch_regionCNwith_genreswith_keywordswith_networkswith_origin_countrywith_original_languagewith_watch_monetization_typeswith_watch_providerswith_release_typewith_runtime.gte0with_runtime.lte400 ) print(f发送请求,访问第{page_num}页的数据,获取TMDB高分电影榜单数据...) #2.解析数据获取电影列表数据 doc html.fromstring(response.text) movie_list doc.xpath(f//*[idpage_{page_num}]/div[1]/div/div) #3.遍历电影列表获取每部电影详情 for movie in movie_list: movie_url movie.xpath(./div/div/a/href) if movie_url: #电影详情页的url movie_info_url TMDB_BASE_URL movie_url[0] #发送请求,获取电影详情数据 movie_info get_movie_info(movie_info_url) all_movies.append(movie_info) #4.将电影详情保存到csv文件 print(f获取到所有电影详情,保存所有电影数据到{MOVIE_LIST_FILE}文件...) save_all_movies(all_movies) if __name__ __main__: main()6.更多干货关注我 学习更多AI知识~支持我请 点赞 好评 收藏 三连带来更多文章~有需要完整源码的同学可以留言、后台私信我