Python電影爬蟲之身體每況愈下

airenLe發表於2020-05-23

1.一時興起

我們平常線上看視訊時,有的時候會想下載到本地繼續觀看,但是苦於頁面上找不到下載按鈕,那麼我們如何自己實現這個功能呢?
在這裡插入圖片描述

2.躍躍欲試

不要著急,我們開啟瀏覽器f12開發者模式,點選如下:
在這裡插入圖片描述
可以看到下面這個帶編號的ts檔案,我們點開000號檔案看看
在這裡插入圖片描述
可以看到,000號檔案請求了一個網址,我們新開一個視窗,看看裡面有什麼
在這裡插入圖片描述
可以看到,在網址欄輸入這個地址,它給我們下載下來了000.ts檔案,我們開啟該檔案觀察一下
在這裡插入圖片描述
開啟一看,是一個5s的短視訊,場景怎麼如此熟悉,這不正是我們開頭所見的那一幕嗎。
有了有了,原來我們線上觀看的視訊是瀏覽器一次一次請求的ts檔案拼接而來的,第一個檔案真是正是000.ts,那麼,我們可不可以找到這個編號的規律,自己一次性去請求這些地址從而拿到視訊呢,答案是肯定的,因為這個規律實在是太過簡單
在這裡插入圖片描述
這不正是10以內的加減法嗎,我們直接快進到視訊結束,可以看到
在這裡插入圖片描述
最後一個ts檔案的編號正是721,ok。那麼開始編碼吧

import requests
import os
import time
from multiprocessing import Pool

def run(i):
    url = 'https://v-cntv-cn.com/20181001/8645_8bbbbc35/800k/hls/96c5332c236%03d.ts'%i
    print("開始下載:"+url)
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36"}
    r = requests.get(url, headers = headers)
    with open('./download/{}'.format(url[-10:]),'wb') as f:
        f.write(r.content)

def merge(t,cmd):
    time.sleep(t)
    res=os.popen(cmd)
    print(res.read())


if __name__ == '__main__':
    # 建立程式池,執行10個任務
    pool = Pool(10)
    for i in range(722):
        pool.apply_async(run, (i,)) #執行任務
    pool.close()
    pool.join()
    #呼叫合併
    merge(0,"copy /b download\\*.ts download\\movie.mp4")
    print('ok!處理完成')

for迴圈生成順序數傳入run函式,啟動10個執行緒同時下載。
下載完成之後我們再呼叫merge函式將這700多個ts檔案拼接成一個mp4檔案。
執行主函式:
在這裡插入圖片描述

3.大功告成

在這裡插入圖片描述
可以看到,download目錄下生成了一些奇奇怪怪的ts檔案,資料夾開啟,也可以看到出現了一些奇奇怪怪的片段
在這裡插入圖片描述
等待程式執行完成,我們的download目錄下會生成一個合併後的檔案,點開播放之,時長吻合
在這裡插入圖片描述

4.索然無味

索然無味

相關文章