前言
今天的這個案例,是一位同學的面試題,人在國外,月薪25~30K
本來以為是難度很大的反爬、逆向或者演算法之類的,誰知道,就是一個很簡單的爬蟲
劃重點,10分鐘就寫出來了




案例介紹
是一個看美劇的網站,從電影界面這里就可以知道視頻內容是m3u8的視頻格式

什么是m3u8?
m3u8是蘋果公司推出的視頻播放標準,是m3u8的一種,只是編碼格式采用的是UTF-8,
現在的視頻網站采用的是流媒體傳輸協議,就是將一段視頻切成無數個小段,這幾個小段就是ts格式的視頻檔案,一段一段的網站上播放,這樣做的好處是觀看更加流暢,因為他會根據網路狀況自動切換視頻的清晰度,在網路狀況不穩定的情況下,對保障流暢播放非常有幫助,
網站分析
通過開發者工具抓包分析找尋資料來源

可以通過開發者工具搜索ts檔案 找到m3u8的url地址, 或者直接搜索m3u8也可以找到相應的資料包


如果想要批量爬取電影內容的話, 還需要繼續找尋這個m3u8的url地址是從哪里可以獲取的

和上面的方法一樣, 在開發者工具里面進行搜索,找尋相應的資料內容, 找到資料來源之后, 還需要去分析headers里面的請求url地址 以及請求方式 請求頭…
-
確定請求url地址

-
確定請求方式

-
請求頭引數

以上是爬取一個視頻內容的分析, 如果想要爬取多個視頻內容, 還要繼續分析 這個請求引數里面URL地址可以從哪里獲取

代碼
實作的基本步驟
- 發送請求, 對于視頻播放詳情頁面發送請求
- 獲取資料, 獲取回應體文本資料
- 決議資料, 提取視頻標題以及資料包的引數url
- 發送請求, 對于找尋的資料包發送請求
- 獲取資料, 獲取回應體文本資料
- 決議資料, 提取m3u8的url地址
- 發送請求, 對于m3u8的url地址發送請求
- 獲取資料, 獲取回應體文本資料
- 決議資料, 提取所有ts檔案
- 保存資料, 把視頻內容保存本地
完整代碼
link_url = 'https://www.imeiju.pro/Play/7483-0-0.html' headers = { 'Host': 'www.imeiju.pro', 'Referer': 'https://www.imeiju.pro/js/player/baiduyun.html', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36' } response = requests.get(url=link_url, headers=headers) response.encoding = response.apparent_encoding # 自動識別編碼 # print(response.text) title = re.findall("var playn = '(.*?)'", response.text)[0] # 標題 video_info = re.findall('第(\d+)集\$(.*?)\$', response.text) print(title) print(video_info) for num, index in video_info: print(title, num, index) url = 'https://www.imeiju.pro/ckplayerx/m3u8.php' # 請求網址 # 請求引數 字典資料型別 data =https://www.cnblogs.com/qshhl/archive/2022/03/09/ { 'url': index, 'f': 'ck_m3u8' } # 最后用response變數接識訓傳資料 response = requests.get(url=url, params=data, headers=headers) # url: '(.*?)' (.*?) 表示你想要資料內容 m3u8_url = re.findall("url: '(.*?)'", response.text)[0] print(m3u8_url) m3u8_data = requests.get(url=m3u8_url).text # ? 非貪婪匹配模式 split() 分割 回傳串列 m3u8_data = https://www.cnblogs.com/qshhl/archive/2022/03/09/re.sub('#E.*', '', m3u8_data).split() print(m3u8_data) for link in m3u8_data: # for 遍歷 把串列元素一個一個提取出來 ts_url = 'https://fangao.stboda.com/concat/20210609/fb22f65d884d47238f75ea8aed8cf249/cloudv-transfer/' + link ts_content = requests.get(url=ts_url).content # b二進制 w寫入(會覆寫的) a追加寫入(不會覆寫) with open(title + num + '.mp4', mode='ab') as f: f.write(ts_content) print(ts_url)
對于本篇文章有疑問的同學可以加【資料白嫖、解答交流群:910981974】
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/440381.html
標籤:其他
上一篇:最適合初學者的SpringBoot入門教程——動力節點王鶴
下一篇:Spring注解簡析
