[Python] 下載證交所影音檔

由於家裡網路真的很慢,看了總是卡得要死根本看不下去,

所以想要把影片抓下來看,但又沒辦法直接下載,

所以拖了很久都沒有看,不過這些天突然想到爬蟲應該會有幫助,

所以就找了些教學,雖然跟證交所的方法不同,

但這個教學還是對我來說非常有用:大數學堂

我透過 影片 -> 右鍵 檢查 -> Network 去看封包,

才發現現在根本直接這樣就可以看封包,好像不需要Wireshark呢,

由於他的影片被切成非常非常多的小片段,

我要這樣一個一個下載也真的太麻煩

http://webprovod.twse.com.tw/vod/_definst_/A3/E1/93EBE39C8605-5ECDEA97-CDE7-11E4-A3E1/93EBE39C8605-5ECDEA97-CDE7-11E4-A3E1_ATM.mp4/media_n.ts?memberId=

這是從 Network 看到的實際影音檔的URL,切成 n 個小檔,

先試著透過 python 抓回檔案,就參考這篇

但我不知道怎麼把 blob 的網址用 python 轉成直接可以下載的位置,

只好退而求其次找出總共切成多少個檔案,

透過迴圈抓再把全部都 append 在一起,

看到很多個 list 檔案就都下載回來看看,

發現 chunklist 就是所有 .ts 檔的 list,

於是就先抓 list 再從中找到最後的 .ts 數字,

再全部接在一起變成一個檔案,

只是檔名我是用檔案的順序數字當檔名,

還要再手動把影片改成相對應的檔名,

而 list.txt 是所有我要下載的檔案的 chunklist URL,

list.txt:

http://webprovod.twse.com.tw/vod/_definst_/83/84/EDD960F18933-B65C93CC-87CA-11E2-8384/EDD960F18933-B65C93CC-87CA-11E2-8384_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/83/84/EDD960F18933-0E727C6D-87CF-11E2-8384/EDD960F18933-0E727C6D-87CF-11E2-8384_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/83/84/EDD960F18933-A18D5F0E-87D0-11E2-8384/EDD960F18933-A18D5F0E-87D0-11E2-8384_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/83/84/EDD960F18933-4674F5BF-87D5-11E2-8384/EDD960F18933-4674F5BF-87D5-11E2-8384_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/97/A8/793F3CEAC1CA-3654196E-8B7D-11E2-97A8/793F3CEAC1CA-3654196E-8B7D-11E2-97A8_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/83/84/EDD960F18933-4EC1FE51-8A27-11E2-8384/EDD960F18933-4EC1FE51-8A27-11E2-8384_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/83/84/EDD960F18933-89FF6612-8A27-11E2-8384/EDD960F18933-89FF6612-8A27-11E2-8384_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/86/68/697D81F4E645-B3B54F04-B4B9-11E3-8668/697D81F4E645-B3B54F04-B4B9-11E3-8668_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/86/68/697D81F4E645-8E3C1AA5-B4C4-11E3-8668/697D81F4E645-8E3C1AA5-B4C4-11E3-8668_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/86/68/697D81F4E645-CB0E8367-B54A-11E3-8668/697D81F4E645-CB0E8367-B54A-11E3-8668_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/86/68/697D81F4E645-13B56099-B558-11E3-8668/697D81F4E645-13B56099-B558-11E3-8668_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/86/68/697D81F4E645-5EE1795C-B576-11E3-8668/697D81F4E645-5EE1795C-B576-11E3-8668_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/A9/54/D357CDC6DA76-0E31956A-16CB-11E4-A954/D357CDC6DA76-0E31956A-16CB-11E4-A954_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/A9/54/D357CDC6DA76-0F51D27B-16CB-11E4-A954/D357CDC6DA76-0F51D27B-16CB-11E4-A954_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/A9/54/D357CDC6DA76-157C09ED-16CB-11E4-A954/D357CDC6DA76-157C09ED-16CB-11E4-A954_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/A9/54/D357CDC6DA76-16F144CE-16CB-11E4-A954/D357CDC6DA76-16F144CE-16CB-11E4-A954_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/A3/E1/93EBE39C8605-5ECDEA97-CDE7-11E4-A3E1/93EBE39C8605-5ECDEA97-CDE7-11E4-A3E1_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/BD/99/195AEC8E3B81-132F3247-2A92-11E5-BD99/195AEC8E3B81-132F3247-2A92-11E5-BD99_ATM.mp4/chunklist.m3u8?memberId=
http://webprovod.twse.com.tw/vod/_definst_/BD/99/195AEC8E3B81-30F62EA9-2A92-11E5-BD99/195AEC8E3B81-30F62EA9-2A92-11E5-BD99_ATM.mp4/chunklist.m3u8?memberId=

Get_Video.py:

# -*- coding:utf-8 -*-
# file: Get_Video.py
#

import urllib.request as request

name = 0
# 透過播放影片 -> 右鍵 檢查 -> Network -> 找到 chunklist
# 把要抓的影片的 chunklist URL 全部加入 list.txt 中
for line in open("list.txt",'rU'): # 一次讀一行
    # fake user agent of Safari
    fake_useragent = 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25'
    req_list = request.Request(line, headers={'User-Agent': fake_useragent})
    list_file = request.urlopen(req_list)
    # 從 chunk list 裡面抓出切割的影音檔個數
    end_num = int(str(list_file.read()).split("media_")[-1].split(".")[0])
    for index in range(0, end_num + 1):
        # 從 chunk list 的 Request URL 轉成要下載的多個 .ts 檔案 URL
        url = "/".join(line.split("/")[:-1]) + "/media_" + str(index) + ".ts?memberId="
        print(url)
        req = request.Request(url, headers={'User-Agent': fake_useragent})
        video_file = request.urlopen(req)
        # 把多個 .ts 最終存成一個 .mp4
        with open(str(name) + ".mp4",'ab') as file:
            file.write(video_file.read())
    # 檔名用數字替代 下載完需手動改
    name += 1

而最後會下載成 0.mp4, 1.mp4.....等等,

就是照 list.txt 的順序,還要手動改檔名,

應該可以更簡單的自動列出 list.txt,

只是我只有要看這麼幾部 mp4,

只要可以自動下載回 local 端就已經解決我的需求了,

所以就沒有再細究下去了