前言:爬蟲的一些基本概念:對于爬蟲來說,沒有道德(比如,某些爬蟲上w的并發(fā),那么,一些小站可能就會崩潰,其實爬蟲也是可以作為網(wǎng)絡(luò)攻擊的,假設(shè)有需要攻擊的網(wǎng)站,上w甚至上百萬的并發(fā)爬蟲持續(xù)攻擊,這個網(wǎng)站可能開不了),沒有知識產(chǎn)權(quán)(爬蟲行為本來就是無視知識產(chǎn)權(quán)的,例如,爬取特權(quán)類視頻,音樂,文章),沒有網(wǎng)站安全這些規(guī)則(通常,爬蟲一旦開始,除非快速的自動封禁,例如,封IP,否則無法停止),也就是說,對于任何資源都可以借助爬蟲來獲取,爬蟲只是一個么得感情的機(jī)器,但有些東西是不能看,不能摸的,例如,國家機(jī)密,個人隱私(那有的人說,我看看怎么了?確實沒什么,但是只要讓人發(fā)現(xiàn)了,那么牢門基本也就開了,所以有人說Python是面向牢獄編程,其實說的也就是Python里的爬蟲技術(shù)) 因此,爬蟲是一個需要比較全面的技術(shù)的,需要對于網(wǎng)站,網(wǎng)站結(jié)構(gòu),網(wǎng)站的規(guī)則,網(wǎng)站加解密,數(shù)據(jù)清理(爬取的數(shù)據(jù)可能會有冗余的東西在里面),正則表達(dá)式,js編程和加解密 等等非常熟悉才可以(技術(shù)全面才可以萬物皆可爬,否則爬取的范圍會比較狹窄)。 注:爬蟲的爬取對象簡單分類 根據(jù)對象的種類來說,通常可以簡單分為音視頻類和文字信息類,例如,爬取某個網(wǎng)站的音視頻,這個和爬取58的租房信息(文字信息類)是截然不同的。主要是音視頻基本是不需要太多數(shù)據(jù)清理的,爬取的成果基本是可以直接使用的。而文字信息類需要做大量的清洗工作,比如,爬取某個招聘網(wǎng)站的招聘信息,可能還需要將爬取結(jié)果分析后圖形化展示,而不是簡單的僅僅把招聘信息爬取下來就完了。 OK,以上是對爬蟲的一個簡單介紹,可能會有些地方寫的不對,不過這些不是關(guān)鍵,關(guān)鍵的是本文將結(jié)合實際案例來講解如何爬取某個視頻網(wǎng)站,并將爬取下來的ts格式的文件碎片合并成一個可用的視頻。 一,爬取流程介紹1,觀察網(wǎng)站結(jié)構(gòu) 例如,網(wǎng)站的資源是flv,還是ts,還是mp4,還是mpeg?data?AVI?rm? 2,判斷資源存放情況,是否有加密 基本上9成的音視頻是使用js技術(shù)加密 3,Python爬取數(shù)據(jù)(資源) 這個沒什么好說的,選擇合適的工具爬取就行了 4,清洗數(shù)據(jù)(資源),數(shù)據(jù)本地化存放 例如,ts格式的音視頻,需要利用VLC或者FFmpeg這些工具做格式轉(zhuǎn)換或者合并,通常不做格式轉(zhuǎn)換。 二, 本例是爬取電影,為了減少不必要的麻煩,本文將對相關(guān)網(wǎng)站信息做一個隱藏 OK,該網(wǎng)站是js加密的視頻網(wǎng)站,至少說明了它的前端是js 下載下來的m3u8文件內(nèi)容大體如下: #注 m3u8是加密的索引文件,視頻整個是由打散的ts文件組成,播放順序什么的依賴于此文件內(nèi)的定義。 #EXT-X-KEY:METHOD=AES-128,URI="/GC9085SGN/hls/key.key 這一段表示視頻是采用aes-128加密算法加密的,并且?guī)в衚ey,key 的存放地址是網(wǎng)站首頁+/GC9085SGN/hls/key.key ts文件是沒有辦法直接看的,因為,有key加密,如果沒有加密,那么也僅僅是一個小片段而已。 OK,目前的任務(wù)就是通過m3u8這個索引文件將該文件內(nèi)定義的所有ts文件(也就是視頻碎片文件)爬取下來,并將所有ts文件合并,合并后的文件就是解密出來的可以直接看的視頻文件了。 那么,保存有整個m3u8文件信息的就是以下鏈接了,也就是說獲取ts文件是從這個鏈接開始: 三, Python編程,根據(jù)m3u8文件,爬取ts文件: GC5498WCU是js加密的sn,這個每一個視頻都是不同的,因此,代碼里要和URL里的一致,總共是三個地方涉及。auth_key 是ID號, import requests import re import os def ts_long(): headers = { "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "keep-alive", "sec-ch-ua": "\" Not;A Brand\";v=\"99\", \"Google Chrome\";v=\"97\", \"Chromium\";v=\"97\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "cross-site", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36" } url = 'https://xxxxx/GC5498WCU/hls/index.m3u8?auth_key=1683086690-3uw3vaj5c3kityoxiuapmegw8ywv7clg-0-259993e937aa27591a3907a3a92b07fd' resp = requests.get(url) data = resp.textprint(data) print("1111111111") print(len(data),type(data)) indexs_list = re.findall(r'/GC5498WCU/hls/(.*)', data) #indexs_key = re.findall(r'1682852153(.*?)',data) print(indexs_list,len(indexs_list)) for i in range(0, len(indexs_list)): print(i) print(indexs_list[i]) thisname = re.findall(r'.*.ts', indexs_list[i]) print(thisname,type(thisname)) name = ''.join(thisname) print(name,type(name)) uri = 'https:///GC5498WCU/hls/{}'.format(indexs_list[i]) print(uri)res = requests.get(uri, headers=headers) data1 = res.content f_path = '\123' with open(f_path + name, 'wb') as fp: fp.write(data1) print(name,'下載完成??!') ts_long()
代碼運(yùn)行的樣子是這樣的: 四, FFmpeg合并ts文件 FFmpeg下載地址: Builds - CODEX FFMPEG @ gyan.dev https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-2023-04-30-git-e7c690a046-full_build.7z FFmpeg合并ts文件有兩種方式,一種方式是網(wǎng)絡(luò),直接通過m3u8的網(wǎng)絡(luò)地址下載合并,大體命令如下: E:\新桌面\ffmpeg-2023-04-30-git-e7c690a046-full_build\ffmpeg-2023-04-30-git-e7c690a046-full_build\bin\ffmpeg.exe -allowed_extensions ALL -protocol_whitelist "file,http,crypto,https,tcp,tls" -i https:///GC9093CRU/hls/index.m3u8?auth_key=1683208754-gp2c9xsv9nay1wgcjwtc6xc9ifnypeyg-0-5ffb80c2f15da85c32b0a643ffb0677d E:\新桌面\xxxx\4444.mp4 大概輸出是這樣的: 第二種方式比較麻煩,但是速度十分的快,也就是本地的ts文件合并,由于ts文件是加密的,因此,需要key.key 文件,m3u8文件,并對m3u8文件做修改(ts文件路徑修改為本地路徑): (文件修改比較麻煩,不過有宏錄制還算比較簡單的吧,如何批量修改見我的博文:vim的宏錄制和應(yīng)用實例(文本編輯飛一般的感覺)_錄制宏的例子_晚風(fēng)_END的博客-CSDN博客) C:\Users\adminsss\PycharmProjects\untitled\venv\ 這個路徑是我的Python跑的路徑,前面下載的ts文件,不知道什么原因都加了一個S,因此,還是使用宏處理掉,key.key的路徑也是本地的,ts文件也是修改為本地的,由于是本地合并,因此,合并出來的文件十分清晰,沒有音視不同步的情況。 #EXTM3U#EXT-X-VERSION:3#EXT-X-TARGETDURATION:8#EXT-X-PLAYLIST-TYPE:VOD#EXT-X-MEDIA-SEQUENCE:0#EXT-X-KEY:METHOD=AES-128,URI="C:\\Users\\adminsss\\Desktop\\key.key"#EXTINF:5.067,C:\Users\adminsss\PycharmProjects\untitled\venv\SvMNMI3F0.ts#EXTINF:8.333,C:\Users\adminsss\PycharmProjects\untitled\venv\S1CGCFR76.ts#EXTINF:8.333,C:\Users\adminsss\PycharmProjects\untitled\venv\SWOYtWIYD.ts#EXTINF:8.333,C:\Users\adminsss\PycharmProjects\untitled\venv\SnqD9lyW7.ts#EXTINF:8.333,。。。。略略略 然后打開cmd,輸入以下命令即可: 也就是 ffmpeg.exe -allowed_extensions ALL -protocol_whitelist "file,http,crypto,https,tcp,tls" -i index.m3u8 -c copy 12323.mp4 上面的例子里,我都是用的絕對路徑,m3u8 文件存放在桌面了,-allowed_extensions ALL -protocol_whitelist "file,http,crypto,https,tcp,tls" 這些必須要有,否則會報錯,成功合并的樣子: 由于cmd是在system32目錄下,因此,合并出來的文件也在這個目錄下,當(dāng)然,你可以指定輸出的路徑,我偷懶了而已。 OK,ts文件合并就暫時介紹到這里。 筆記摘錄原址:https://blog.csdn.net/alwaysbefine/article/details/130477778 ffpmeg合并命令實際操作筆記: ffmpeg.exe -allowed_extensions ALL -protocol_whitelist "file,http,crypto,https,tcp,tls" -i m3u8 文件所在路徑\index.m3u8 -c copy 合并后音視頻文件保存路徑\12323.mp4
|
|