网络爬虫项目开发源码级教程:获取高分电影榜单数据

1.项目介绍

项目目的:获取高分电影榜单(TOP100)数据,并保存在 CSV 文件中

  • 数据包括:电影名,年份,上映时间,类型,时长,评分,语言,导演,作者,主演,Slogan,介绍

项目步骤:

  1. 明确网站(The Movie Database (TMDB))的 robots.txt 中的抓取规则
  2. 查看页面的结构,拆解具体的操作步骤,按步骤开发
    1. 获取高分电影列表数据
    2. 遍历电影列表,获取每一部电影的详情信息,并提取电影数据信息
    3. 将电影详情信息保存到 csv 文件中

2.CSV 操作

2.1 CSV 概述

CSV:(Comma-Separated Values,逗号分隔符),是一种简单,通用的文本文件格式,用于存储表格数据,可以直接使用 Excel 打开

2.2 CSV操作

2.2.1 原始操作

使用 python 提供的原始的文件操作:

#读
with open("csv_Data/新建 文本文档.csv","r",encoding="utf-8") as f:
    print(f"原始CSV文件内容:{f.read()}")

print("---------------------------------------------------------")
#写
with open("csv_Data/新建 文本文档.csv","a",encoding="utf-8") as f:
    f.write("小二,男,22,足球\n")#写入数据
    f.write("小四,女,20,篮球\n")
    f.write("小六,男,21,羽毛球\n")

#读
with open("csv_Data/新建 文本文档.csv","r",encoding="utf-8") as f:
    print(f"更新后CSV文件内容:{f.read()}")

结果如下:

2.2.2 使用csv标准库操作

使用 csv 标准库里面提供的操作:

import csv
with open("csv_Data/资源2.csv","r",encoding="utf-8",newline="") as f:
    print(f"原始CSV文件内容:{f.read()}")

print("---------------------------------------------------------")
#写操作
with open("csv_Data/资源2.csv","a",encoding="utf-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",encoding="utf-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('//*[@id="page_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("//*[@id='original_header']/div[2]/section/div[1]/h2/a/text()") #获取电影名称
    movie_year = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/h2/span/text()")#获取电影年份
    movie_release_date = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='release']/text()")#获取电影上映时间
    movie_type = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='genres']/a/text()")#获取电影类型
    movie_runtime = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='runtime']/text()")#获取电影时长
    movie_rating = movie_doc.xpath("//*[@id='consensus_pill']/div/div[1]/div/div/@data-percent")#获取电影评分
    movie_language = movie_doc.xpath("//*[@id='media_v4']/div/div/div[2]/div/section/div[1]/div/section[1]/p[3]/text()")#获取电影语言
    movie_director = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/ol/li[1]/p[1]/a/text()")#获取电影导演
    movie_author = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/ol/li[2]/p[1]/a/text()")#获取电影作者
    #获取电影slogan
    movie_slogan = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/h3[1]/text()")
    movie_description = movie_doc.xpath("//*[@id='original_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('//*[@id="page_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("//*[@id='original_header']/div[2]/section/div[1]/h2/a/text()") #获取电影名称
    movie_year = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/h2/span/text()")#获取电影年份
    movie_release_date = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='release']/text()")#获取电影上映时间
    movie_type = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='genres']/a/text()")#获取电影类型
    movie_runtime = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='runtime']/text()")#获取电影时长
    movie_rating = movie_doc.xpath("//*[@id='consensus_pill']/div/div[1]/div/div/@data-percent")#获取电影评分
    movie_language = movie_doc.xpath("//*[@id='media_v4']/div/div/div[2]/div/section/div[1]/div/section[1]/p[3]/text()")#获取电影语言
    movie_director = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/ol/li[1]/p[1]/a/text()")#获取电影导演
    movie_author = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/ol/li[2]/p[1]/a/text()")#获取电影作者
    #获取电影slogan
    movie_slogan = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/h3[1]/text()")
    movie_description = movie_doc.xpath("//*[@id='original_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='', encoding='utf-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('//*[@id="page_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
  • 对当前访问页面进行判断 , 选择相应的 url
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_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("//*[@id='original_header']/div[2]/section/div[1]/h2/a/text()")
    #获取电影年份
    movie_year = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/h2/span/text()")
    #获取电影上映时间
    movie_release_date = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='release']/text()")
    #获取电影类型
    movie_type = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='genres']/a/text()")
    #获取电影时长
    movie_runtime = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='runtime']/text()")
    #获取电影评分
    movie_rating = movie_doc.xpath("//*[@id='consensus_pill']/div/div[1]/div/div/@data-percent")
    #获取电影语言
    movie_language = movie_doc.xpath("//*[@id='media_v4']/div/div/div[2]/div/section/div[1]/div/section[1]/p[3]/text()")
    #获取电影导演
    movie_director = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/ol/li[1]/p[1]/a/text()")
    #获取电影作者
    movie_author = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/ol/li[2]/p[1]/a/text()")
    #获取电影slogan
    movie_slogan = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/h3[1]/text()")
    #获取电影简介
    movie_description = movie_doc.xpath("//*[@id='original_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='', encoding='utf-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,
f"air_date.gte=&air_date.lte=&certification=&certification_country=CN&debug=&first_air_date.gte=&first_air_date.lte=&include_adult=false&include_softcore=false&latest_ceremony.gte=&latest_ceremony.lte=&page={page_num}&primary_release_date.gte=&primary_release_date.lte=&region=&release_date.gte=&release_date.lte=2027-02-17&show_me=everything&sort_by=vote_average.desc&vote_average.gte=0&vote_average.lte=10&vote_count.gte=300&watch_region=CN&with_genres=&with_keywords=&with_networks=&with_origin_country=&with_original_language=&with_watch_monetization_types=&with_watch_providers=&with_release_type=&with_runtime.gte=0&with_runtime.lte=400"
                                     )
        print(f"发送请求,访问第{page_num}页的数据,获取TMDB高分电影榜单数据...")

        #2.解析数据,获取电影列表数据
        doc = html.fromstring(response.text)
        movie_list = doc.xpath(f'//*[@id="page_{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,邮箱为python666@163.com,你记住了吗?'

#正则表达式
print(re.findall(r"188.*",s1)) # .匹配任意字符,*匹配其前面字符0次或多次
print(re.findall(r"188.?",s1)) # .匹配任意字符,?匹配其前面字符至多1次
print(re.findall(r"188.+",s1)) # .匹配任意字符,+匹配其前面字符至少1次

print(re.findall(r"188\d{8}",s1)) # \d匹配任意数字,{8}匹配其前面字符8次
print(re.findall(r"155\d{6,10}",s1)) # \d匹配任意数字,{6,10}匹配其前面字符6到10次
print(re.findall(r"155\d{6,}",s1)) # \d匹配任意数字,{6,}匹配其前面字符6次或更多

print(re.findall(r"1[38]\d{8}",s1)) # 1开头,第2位是3或8,\d匹配任意数字,{8}匹配其前面字符8次
print(re.findall(r"1[^38]\d{8}",s1)) # 1开头,第2位是{3,8}以外的数字,\d匹配任意数字,{8}匹配其前面字符8次
print(re.findall(r"1[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.match(pat,str)只从字符串开头匹配(第一个)Match 对象 / None
re.search(pat,str)从任意位置开始匹配(第一个)Match 对象 / None
re.findall(pat,str)找出全部匹配结果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("//*[@id='original_header']/div[2]/section/div[1]/h2/a/text()")
    #获取电影年份
    movie_year = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/h2/span/text()")
    #获取电影上映时间
    movie_release_date = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='release']/text()")
    #获取电影类型
    movie_type = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='genres']/a/text()")
    #获取电影时长
    movie_runtime = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[1]/div/span[@class='runtime']/text()")
    #获取电影评分
    movie_rating = movie_doc.xpath("//*[@id='consensus_pill']/div/div[1]/div/div/@data-percent")
    #获取电影语言
    movie_language = movie_doc.xpath("//*[@id='media_v4']/div/div/div[2]/div/section/div[1]/div/section[1]/p[3]/text()")
    #获取电影导演
    movie_director = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/ol/li[1]/p[1]/a/text()")
    #获取电影作者
    movie_author = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/ol/li[2]/p[1]/a/text()")
    #获取电影slogan
    movie_slogan = movie_doc.xpath("//*[@id='original_header']/div[2]/section/div[3]/h3[1]/text()")
    #获取电影简介
    movie_description = movie_doc.xpath("//*[@id='original_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='', encoding='utf-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,
                                     f"air_date.gte=&air_date.lte=&certification=&certification_country=CN&debug=&first_air_date.gte=&first_air_date.lte=&include_adult=false&include_softcore=false&latest_ceremony.gte=&latest_ceremony.lte=&page={page_num}&primary_release_date.gte=&primary_release_date.lte=&region=&release_date.gte=&release_date.lte=2027-02-17&show_me=everything&sort_by=vote_average.desc&vote_average.gte=0&vote_average.lte=10&vote_count.gte=300&watch_region=CN&with_genres=&with_keywords=&with_networks=&with_origin_country=&with_original_language=&with_watch_monetization_types=&with_watch_providers=&with_release_type=&with_runtime.gte=0&with_runtime.lte=400"
                                     )
        print(f"发送请求,访问第{page_num}页的数据,获取TMDB高分电影榜单数据...")

        #2.解析数据,获取电影列表数据
        doc = html.fromstring(response.text)
        movie_list = doc.xpath(f'//*[@id="page_{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知识~

🥰支持我,请 点赞 + 好评 + 收藏 三连,带来更多文章~

🥰有需要完整源码的同学可以留言、后台私信我


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值