Python獲取時光網電影數據

来源:https://www.cnblogs.com/sibide/archive/2022/09/03/16652309.html
-Advertisement-
Play Games

C++ 課堂筆記(一) 說明:此筆記是學習於B站黑馬程式員的C++視頻所作的,感謝黑馬程式員的教學;如有什麼不足之處,望各位賜教。僅供學習。 第一個代碼:書寫hello world #include<iostream> using namespace std; int main() { cout < ...


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

從自動化辦公到智能化辦公
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、請求處理參數 1.1 請求參數 @RequestParam 1.1.1 不使用 @RequestParam 註解 請求參數處理,不使用參數註解: 1.如果請求參數名和請求處理的形參名一致,springMvc 框架會自動將你的請求參數名對應的參數值,綁定到請求方法的形參中,方法內就可以直接使用,不 ...
  • 在大多情況下,我們都是用new去實例化對象。但是,有時候有的對象的類別有很多種,又存在著共性,就好比如汽車,有賓士,紅旗,寶馬等品牌,如果是一個一個去創建類,那就需要創建很多,因此就需要用到工廠模式。 ...
  • 序列類型 str 字元型 list 列表 tuple 元組 列表與元組最大的區別就是列表可變,而元組不可變 遍歷 從頭到尾,依次訪問到每一個 range() 包頭不包尾 range(start,end,step) start 開始 end 結束 step 步長(步長可以是負數) 下標(索引) 序列類 ...
  • 前言 Tkinter(即 tk interface) 是 Python 標準 GUI 庫,簡稱 “Tk”;從本質上來說,它是對 TCL/TK 工具包的一種 Python 介面封裝。Tkinter 是 Python 自帶的標準庫,因此無須另行安裝,它支持跨平臺運行,不僅可以在 Windows 平臺上運 ...
  • 編寫一個帶有socket通信功能的插件,x64dbg運行後,用戶點擊鏈接按鈕可直接連接到外部的python中,python作為服務端,當x64dbg內部出現某個事件後,自動將消息推送到外部python腳本上,實現反向傳參的目的。 ...
  • 鑒於有些小伙伴在尋找博客園遷移到個人博客的方案,本人針對博客園實現了一個自動備份腳本,可以快速將博客園中自己的文章備份成Markdown格式的獨立文件,備份後的md文件可以直接放入到hexo博客中,快速生成自己的站點,而不需要自己逐篇文章遷移,提高了備份文章的效率。 ...
  • 阿裡druid-spring-boot-starter 配置,個人整理(之後可能會忘記)。。 現版本其實有大量的預設值都已經配置好了,可以自己去看看源碼 ...
  • 1.準備工作(django連接資料庫) 1.本機電腦下載好mysql資料庫 2.打開django,修改setting.py中的DATABASES配置項 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': ' ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...