Python获取时光网电影数据

Python获取时光网电影数据

一、前言

有时候觉得电影真是人类有史以来最伟大的发明,我喜欢看电影,看电影可以让我们增长见闻,学习知识。从某种角度上而言,电影凭借自身独有的魅力大大延长了人类的”寿命”。
一部电影如同一本故事书,我可以沉迷到其中,来的一个新的世界,跟着电影主角去经历去感悟。而好的电影是需要慢慢品尝的,不仅提供了各种视觉刺激和情感体验,更能带来思考点,也让我可以懂得在现实生活中穷尽一生也无法明白的道理。电影比书本更直接、更有趣、更精彩。
好的电影可以在潜移默化中塑造我们的三观,在电影中我们可以获得平静、满足和温和,学会坚强、勇气和努力。电影延展了无聊单调、枯燥又稀松平常的生活,让我可以在对现实生活厌倦或失望时至少有一个地方可以逃离。
正因为电影有诸多好处,并且比书本和说教能更好的塑造三观,因此,家长们可以陪同小孩看电影,鼓励孩子从电影中学会坚强和勇敢等优良品质。
既然要看看电影,就要去看优秀的作品,时光网是一个电影各方面素材都比较全面的网站,本次的项目就是要从该网站上获取到指定年份的所有电影数据,并导出成excel表格以供参考。
注意:请勿使用该技术获取网络上敏感、隐私、非公开等数据。
电影推荐(爱情类):
假如爱有天意:缘,妙不可言,或许一切早已注定。
灵魂摆渡·黄泉:为情甘愿赴死,为爱执守千年。
你的名字:世上所有的相遇都是久别重逢。
电影推荐(亲子类):
机器人总动员:孩子看到的是友情,大人看到的是爱情。很有爱的一部动画片。
寻梦环游记:死亡并不是终点,被人忘却才是真正的死亡
电影推荐(悬疑类):
小岛惊魂
异次元骇客
恐怖游轮

二、准备

2.1 安装库

requests:网络数据请求并获取,安装方式:pip install requests
threading:多线程处理(数据量比较大),Python自带库,无需安装。
json:数据处理,Python自带库,无需安装。
pandas:将数据导出成excel表格,安装方式:pip install pandas

2.2 原理介绍

1、先通过requests库,通过时光网自带的电影数据API接口,获取到指定的电影数据。
2、将获取到的数据经过简单的加工,通过pandas库存入到excel表格中。

三、实例

3.1 完整代码

# Encoding: utf-8
# Author: furongbing
# Date: 2021-11-19 20:54
# Project name: FrbPythonFiles
# IDE: PyCharm
# File name: Mtime
import requests
import pandas as pd
from threading import Thread
import time
import json

# 模块说明:
"""
从时光网上按年代获取指定年份电影的数据
"""
# 更新日志:
"""
1、2021-11-19:
    a、完成初版
"""
# 待修改:
"""
"""
# 请求头数据
headers = {"Accept": "application/json, text/plain, */*",
           "Accept-Encoding": "gzip, deflate",
           'Accept-Language': 'zh-CN,zh;q=0.9',
           'Connection': 'keep-alive',
           'Content-Type': 'application/x-www-form-urlencoded',
           'Cookie': '_tt_=FB8A3FAD4704D42543B7EC121C2565AA; __utma=196937584.1082595229.1637326918.1637326918.1637326918.1; __utmz=196937584.1637326918.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); Hm_lvt_07aa95427da600fc217b1133c1e84e5b=1637241042,1637326637,1637374129; Hm_lpvt_07aa95427da600fc217b1133c1e84e5b=1637374170',
           'Host': 'front-gateway.mtime.com',
           'Origin': 'http://film.mtime.com',
           'Referer': 'http://film.mtime.com/',
           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
           }
pagesize = 20  # todo 获取的每页数据条数,一般建议成默认的20就可以了,设置的太大,每页包含的数据量就大,某一条电影数据出错会导致其它数据也被抛弃。
data = []
error = []


def get_data(p_year=1987):  # 按照年份获取当年度所有的电影数据
    url = 'http://front-gateway.mtime.com/mtime-search/search/unionSearch2'  # 请求的url
    params = {'year': p_year, 'pageSize': pagesize, 'pageIndex': 1, 'searchType': 0}  # 请求的表单数据
    # 获取当年度所有的电影的数量,继而计算要获取多少页
    try:
        r = requests.get(url=url, params=params, headers=headers, timeout=10)
        r.encoding = r.apparent_encoding
        all_data = json.loads(r.text)
        moviesCount = all_data['data']['moviesCount']
        pages = round(moviesCount / pagesize)
    except Exception:
        moviesCount = 1000
        pages = round(moviesCount / pagesize)

    # 定义变量
    来源 = '时光网'
    年代 = p_year
    ID, 中文名, 英文名, 类型, 形式, 海报url, 评分, 导演, 主演, 详情, 可播放, 国家地区, 上映日期, 片长, 票房, 观看日期 = [''] * 16

    for page in range(pages):  # todo 一共要获取多少页
        if page % 10 == 0:  # 每10页输出一次进度
            print(f'已完成 {100 * page / pages:.2f}%')
        pageindex = page + 1
        params = {'year': p_year, 'pageSize': pagesize, 'pageIndex': pageindex, 'searchType': 0}  # 请求的表单数据
        try:  # 获取指定页的电影数据
            r = requests.get(url=url, params=params, headers=headers, timeout=10)
            r.encoding = r.apparent_encoding
            all_data = json.loads(r.text)
            movies = all_data['data']['movies']
            # 获取电影具体信息
            for movie in movies:
                ID = movie['movieId']
                中文名 = movie['name']
                英文名 = movie['nameEn']
                类型 = movie['movieType']
                形式 = movie['movieContentType']
                海报url = movie['img']
                其它译名 = movie['titleOthersCn']
                评分 = movie['rating']
                导演 = movie['directors']
                主演 = movie['actors']
                详情 = movie['href']
                可播放 = movie['canPlay']
                国家地区 = movie['locationName']
                上映日期 = movie['realTime']
                片长 = movie['length']
                info = [来源, 年代, ID, 中文名, 英文名, 类型, 形式, 海报url, 其它译名, 评分, 导演, 主演, 详情, 可播放, 国家地区, 上映日期, 片长, 票房, 观看日期]
                data.append(info)
        except Exception as err:
            er_year, er_pagesize, er_pageindex, er_msg = p_year, pagesize, pageindex, err
            error.append([er_year, er_pagesize, er_pageindex, er_msg])
            print(f"出错啦,出错年份:{p_year},pagesize:{pagesize},page:{pageindex},出错原因:{er_msg}")
            continue


if __name__ == '__main__':
    begin = time.perf_counter()
    threads = []
    for year in range(2020, 2021):  # todo 此处可以自定义要获取的年份
        t = Thread(target=get_data, args=(year,))
        threads.append(t)
        t.start()
    for t in threads:
        t.join()

    with open('error.txt', 'w', encoding='utf-8') as f:
        f.write(str(error))

    data.insert(0, ['来源', '年代', 'ID', '中文名', '英文名', '类型', '形式', '海报url', '其它译名', '评分', '导演', '主演', '详情', '可播放', '国家地区', '上映日期', '片长', '票房', '观看日期'])
    df = pd.DataFrame(data)
    df.to_excel(excel_writer=r'film.xlsx', sheet_name='sheet1', index=None, header=False)  # todo film.xlsx为最后保存的文件名

    end = time.perf_counter()
    runtime = end - begin
    print(f'运行时长:{runtime:.3f}秒。') 

输出结果:

已完成 0.00%
已完成 11.63%
已完成 23.26%
已完成 34.88%
已完成 46.51%
已完成 58.14%
已完成 69.77%
已完成 81.40%
已完成 93.02%
运行时长:27.906秒。

虽然示例中获取的是2020年的数据,但是由于代码中采用的是多线程,所以如果是获取一段时间的数据时耗费的时间也和这个差不多。
最后保存到excel中的数据如下:

image

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python获取时光网电影数据 - Python技术站

(0)
上一篇 2023年4月2日 下午5:04
下一篇 2023年4月2日

相关文章

  • 行走的数字

    一、前言 有一定数学基础的同学们都知道,如果两个正整数相除之后得到的结果,要么能除尽,要么就是一个循环小数。假如结果是循环小数,那么小数的每一位取值是0-9,且存在循环节点。如果我们用小数的每一位进行画图,每位小数用固定的线段表示,而每位小数的大小则用角度(1代表36度,2代表72度,以此类推)表示,这样的话我们就可以看到画图板上有一条线段在行走一样。示例:…

    2023年4月2日
    00
  • 常用库

    2.4 常用库 2.4.1 time 时间的访问和转换 该模块提供了各种与时间相关的函数。相关功能还可以参阅 datetime 和 calendar 模块。 2.4.2 datetime 基本日期和时间类型 datetime 模块提供用于处理日期和时间的类。 2.4.3 calendar 日历相关函数 这个模块让你可以输出像 Unix cal 那样的日历,它…

    Python开发 2023年4月2日
    00
  • 类和类的定义

    6.2 类和类的定义 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如学生类,而实例是根据类创建出来的一个个具体的对象,每个对象都拥有相同的方法,但各自的数据可能不同。 6.2.1 什么是类 当你在马路上看到一辆飞驰的奥迪汽车时,这辆奥迪车就是汽车类的一个实例。汽车就是一个类,每辆车都是汽车类的一个实例。可以将…

    Python开发 2023年3月31日
    00
  • 扑克玩法:9点半–数据分析

    扑克玩法:9点半–数据分析一、前言又是新的一年,在这里先给各位读者大大们拜个晚年。祝大家新年快乐,万事如意,阖家欢乐。过年拜年是中国的传统习俗,在春节期间人们会互相拜访并送上祝福。拜年不仅是一项重要的社交活动,也是一次难忘的旅程。它让我们感受到了团圆与温暖,同时也增强了彼此之间的联系。小编每年大年初一都会去祖母那儿拜年,一起去的还有我的叔叔、堂兄弟们。我们…

    Python开发 2023年3月31日
    00
  • Python特性

    3.1 Python特性 Python是为可读性设计的,与英语有一些相似之处,并受到数学的影响。比如: Python使用新行来完成命令,而不像通常使用分号或括号的其他编程语言。 Python依赖缩进,使用空格来定义范围;例如循环、函数和类的范围。其他编程语言通常使用花括号或关键字来实现此目的。 Python中没有单个字符,单字符被认为是1个字符的字符串。 对…

    Python开发 2023年4月2日
    00
  • Python内置函数

    5.6 Python内置函数 Python自带的所有内置函数如下:Python函数以上为Python3.10中所有的内置函数,其中绝大部分在前面的学习当中都已经接触过了。这里在补充介绍下没有提到或学习到的函数。 5.6.1 callable(object) 描述如果参数 object 是可调用的就返回 True,否则返回 False。 如果返回 True,调…

    2023年3月31日
    00
  • 类属性和对象属性

    6.3 类属性和对象属性 在类定义中,属性按照归属分为对象属性、类属性。按照调用的私密性分为一般属性和私有属性。 6.3.1 类属性和对象属性 对象属性是最常用到的一种属性。即使我们对上面的类:MyClass1实例化了一个mc的对象,mc对象也不能进行有实质的操作。因为mc对象的类:MyClass1中既没有定义属性也没有定义方法。在定义类时还能定义类属性。接…

    Python开发 2023年3月31日
    00
  • 类型转换及相关函数

    4.11 类型转换及相关函数 在Python中,不同的数据类型是可以相互转换的,下面列举一些之前没有介绍但是比较常见的数据类型转换及相关函数,以供参考。 4.11.1 进制转换类 4.11.1.1 bin(x) 描述将整数转变为以“0b”前缀的二进制字符串。示例>>> bin(3)>>> bin(-10) ‘0b11”-…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部