記錄一個不同的流媒體網站實現方法,和用Python爬蟲爬它的坑

来源:https://www.cnblogs.com/lyj00912/archive/2020/04/04/12630122.html
-Advertisement-
Play Games

今天找到一片電影,想把它下載下來。 先開Networks工具分析一下: 初步分析發現,視頻載入時會拉取TS格式的文件,推測這是一個m3u8的索引,記錄著幾百段TS文件,這樣方便快進時載入。 但是實際分析m3u8文件時,發現這並不是一個有效的索引文件,應該只是載入一個形式,實際的handler在其他地 ...


今天找到一片電影,想把它下載下來。

先開Networks工具分析一下:

初步分析發現,視頻載入時會拉取TS格式的文件,推測這是一個m3u8的索引,記錄著幾百段TS文件,這樣方便快進時載入。

 

 

但是實際分析m3u8文件時,發現這並不是一個有效的索引文件,應該只是載入一個形式,實際的handler在其他地方:

 

 

但這樣分析js太麻煩了。通過幾次嘗試,發現了規律:視頻文件名是由y8TL59oh4680xxx.ts組成的,xxx是序號,這樣就簡單多了!

把之前爬音樂文件的爬蟲改一改,得到這樣一個程式:

import requests
import os
import re
from tkinter import Tk
from tkinter.simpledialog import askinteger, askfloat, askstring
from tkinter.filedialog import askopenfilename, askopenfilenames, asksaveasfilename, askdirectory
from tkinter.messagebox import showinfo, showwarning, showerror

def downloadSong(SongID, FileName):
    headers = {"user-agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"}
    r = requests.get("https://www.mmicloud.com/20190406/I1RrJf8s/2000kb/hls/y8TL59oh" + str(SongID) + ".ts",headers=headers);
    #print("State:")
    #print(r)
    filepath=os.path.join(str(SongID) + ".ts")
    with open(filepath,"wb") as file:
        file.write(r.content)
    print(SongID)

for i in range(4680000, 4680900):
    downloadSong(i, str(i))

這個程式迴圈爬取文件名從y8TL59oh4680000.ts到y8TL59oh4680899.ts的900個視頻文件。

程式中的迴圈最大值之所以定在4680900,是因為我發現影片有860多段,於是就多下載一些,如果下載不了就是下完了,出錯倒也無所謂。

讓他開始運行,看起來工作良好,有在順利的下載文件:

 

 

 於是我就放下手頭的事,先休息去了。過了大約半個小時,他已經下載了300多個文件了:

 

 

我就放下心來,這個爬蟲應該是沒什麼問題了,於是我就用VSCode寫了一些代碼。當我再次看到任務欄時,爬蟲已經不見了!

我再次啟動爬蟲,過了一會又會有同樣的問題!難道是變數i溢出了?試著debug一下,把i的範圍縮小試試:

import requests
import os
import re
from tkinter import Tk
from tkinter.simpledialog import askinteger, askfloat, askstring
from tkinter.filedialog import askopenfilename, askopenfilenames, asksaveasfilename, askdirectory
from tkinter.messagebox import showinfo, showwarning, showerror

def downloadSong(SongID, FileName):
    headers = {"user-agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"}
    r = requests.get("https://www.mmicloud.com/20190406/I1RrJf8s/2000kb/hls/y8TL59oh4680" + str(SongID) + ".ts",headers=headers);
    #print("State:")
    #print(r)
    filepath=os.path.join(str(SongID) + ".ts")
    with open(filepath,"wb") as file:
        file.write(r.content)
    print(SongID)

for i in range(566, 900):
    downloadSong(i, str(i))

經過debug,發現程式應該是沒有問題,只是因為控制台視窗最小化時,爬蟲會被記憶體回收掉,所以導致了程式退出。

折騰了半天!

我換成用IDLE編輯器自帶的Run Modules,有普通視窗的話就不容易被回收掉把:

 

 

過了一陣子,爬蟲終於把文件爬完了。一看文件夾,又出問題了:

 

 

文件名不一致!

還記得之前我們debug的時候把變數i的範圍改小了嗎?這就是原因!

那好吧,選中所有名字長的文件,右鍵,重命名,命名成a,然後文件就可以自動命名為a (1), a (2), a (3), a (4), a (5), ...這樣。

問題。。解決了?

 

我拿著這些命名為a (1), a (2), a (3), a (4), a (5), ...的文件去轉碼,合併,來來回回整了一個小時多。當合併之後,才發現,

文件順序全是亂的!!!

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊天煞的Windows!!!!!!!!!!

 

沒辦法,有氣出不來,只好繼續寫代碼。。。

還好我留了一份沒有重命名過的文件夾,那就用python寫一個批量重命名程式吧:

import os
PROJECT_DIR_PATH = os.path.dirname(os.path.abspath(os.path.abspath(__file__)))
DIR_PATH = os.path.join(PROJECT_DIR_PATH, 'data')
files = os.listdir(DIR_PATH)
for filename in files:
    name, suffix = os.path.splitext(filename)
    new_name = os.path.join(DIR_PATH, name[4:7])
    old_name = os.path.join(DIR_PATH, filename)
    os.rename(old_name, new_name)

把文件目錄改成這樣,就可以使用上面的程式了:

 

爽爽快快的運行完程式,發現命名是成功了,但尾碼名沒有了。。。

 

 

失誤失誤!再寫一個補救程式:

import os
PROJECT_DIR_PATH = os.path.dirname(os.path.abspath(os.path.abspath(__file__)))
DIR_PATH = os.path.join(PROJECT_DIR_PATH, 'data')
files = os.listdir(DIR_PATH)
for filename in files:
    name, suffix = os.path.splitext(filename)
    new_name = os.path.join(DIR_PATH, filename + ".ts")
    old_name = os.path.join(DIR_PATH, filename)
    os.rename(old_name, new_name)

心驚膽戰的運行完,目錄終於正常了:

 

然後又是轉碼、合併,又是一個多小時。最後,總算拿到了勝利的果實:

 

 

 太難了!

 

下載這篇電影花費了我一整天的時間。上午和中午找片源,下午寫代碼+寫爬蟲+爬資源,晚上還得操心重命名和轉碼的問題,這中間都夠我看6-7片電影了。ε=(´ο`*)))唉。。。

不多說了,電影只能明天看了。各位,晚安!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 01. 聊 啥 關註“一猿小講”的都知道,我們之前分享過應用架構、應用監控、日誌歸集以及程式員日常內心的那些小揪揪,幾乎成了小講、雜談的一畝三分地。 說實話,挺神奇,我也不知道每次會給大家帶來什麼驚喜。 今天的分享也不例外,你們肯定也意想不到,今天我分享的主題居然是:矛與盾,如何做好系統之盾;說人話 ...
  • 默默在看新機會的你,是不是面試的時候,偶爾被問起“能不能簡單介紹一下項目的應用系統架構”? 沉迷於業務開發的你們,有沒有考慮過“用戶訪問到你開發的業務功能,到底經過了哪些環節”? 今天我將結合這些年的一些認知理解,開壇設法給大家講一講應用系統架構的從 0 到 1。 01. 如何造一個大泥球? 產品汪 ...
  • 基本定義 裝飾者模式屬於 結構型模式 ,它可以 動態的 將新功能 附加到對象上 ,同時又 不改變其結構 。在對象功能擴展方面,它比繼承更有彈性,裝飾者模式也體現了開閉原則(OCP)。 模式結構 裝飾者和被裝飾者有 相同的超類型 ,因為裝飾者和被裝飾者必須是一樣的類型, 利用繼承是為了達到類型的匹配, ...
  • 基於觀察者模式,構建自己的一套事件分發系統。由常見的引用耦合問題,引出觀察者模式,進而利用觀察者模式的最佳實踐,事件分發系統來解決耦合問題。文章詳細解讀了事件分發系統的實現步驟,以及需要註意的一些坑。 ...
  • 1. 新建項目 IDEA中新建Maven項目,使用Maven Archetype原型:maven archetype webapp 新建項目結構為: 2. 新建包目錄 新建Java代碼目錄:src.main.java 下新建分層模型package,帶上項目的 (僅供參考) :存放全局變數,公共枚舉等 ...
  • 作為一名程式員,io知識是必不可少,其實一直在和io打交道,要麼顯示要麼隱含給了操作系統,故做下關於io的記錄。說io之前呢,先介紹什麼叫同步非同步丶阻塞非阻塞 1. 同步非同步丶阻塞非阻塞 1.1 同步是指發出一個請求,在沒有得到結果之前該請求就不返回結果,請求返回時,也就得到結果了。比如我經常用燒水 ...
  • 昨天有同事問 UserService、XxxService 都會調用 Dao 的 insert、update ... ...,這些重覆的代碼,有沒有辦法變得靈活一些? 巧了,和咱們分享的主題剛好碰上,賣個關子,先不談解決方案,就當啥事沒有發生,重新引入今天的話題(捂嘴笑)。 想蛻變的研發人員,偶爾會 ...
  • 記錄一些方法,關於 VBScript 中,動態 Array 的實現 ,也適用於 VBA, 很久以前,寫 VBA 的時候,就覺得使用 Array 很不方便,因為大小固定, 當時想的是,要是 Array 可以像 Python 里的 list 一樣好用該多好啊, 那麼下麵,就記錄一些方法,能讓 Array ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...