Python爬蟲下載視頻
前言
這兩天我一時興起想學習 PS ,於是去我的軟件寶庫中翻出陳年已久的 PhotoshopCS6 安裝,結果發現很真流暢誒!
然后去搜索學習視頻,網上的視頻大多浮躁,收費,突然想到了我入門編程時學習的網站, 我要自學網 ,尋找當時非常喜歡的易語言編程視頻,很可惜,沒有了。而且發現網站似乎不那么好用了QAQ。
找啊找,找啊找,找到了一個同類型,界面很古老的學習網站, 51視頻學院(禁不住好奇,似乎很多那個時候的網站都喜歡51開頭,比如吾愛論壇,51巔峰閣...) ,發現上面的ps視頻還可以,但是我家的網速是不是老卡,所以想一下子都下載完,然后就慢慢本地看啦!不再受網絡的影響。 想到這種事情,就立馬想到了Python。

Python搞起!
分析
-
尋找視頻地址
右鍵網頁點擊檢查,先刷新一下網頁,然后點擊網絡選項卡。
這個網站屬於比較老啦,哈哈,我這樣的爬蟲小白白都能爬,直接點擊媒體,我們就能發現視頻的請求地址啦,也就是下載地址。
啊哈,果不其然,復制鏈接后打開就可以下載視頻了!
-
獲取視頻地址
這就是我們尋找到的視頻地址啦,但是怎么知道其他視頻的地址呢?注意看紅色方框的內容
這個時候,讓我們回到這個課程的目錄頁看看
欸欸欸?是不是看到了點東西?沒錯,相信眼光敏銳的你已經看到啦,視頻地址的后面的1-1就是課程的章節序號啦!
那我們去試幾個,發現也是可行的!
所以我們從目錄網頁上獲取那個章節序號就好啦,順便把后面的文字也獲取了,當成文件名。不然都不知道視頻的內容是什么。
總而言之,流程大致為從目錄獲取章節序號->下載視頻->保存到本地。
寫代碼!
-
獲取章節序號及內容
這里用到了XPath,不會的 點我看看, 很簡單的。
代碼:
import requests from lxml import etree list_url = "http://www.51shiping.com/list-657-1.html" headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"} response = requests.get(list_url,headers=headers) text = response.text # 解析 html = etree.HTML(text) titles = html.xpath("//div[@align='left']/a/text()") for title in titles: print(title)
結果:
完美!第一步大功告成
但是,在編寫下面是發現一個隱藏的坑點,那就是 空格是'\ax0',你輸出titles就知道我說的什么意思了 ,下圖是titles數組實際存的內容:
所以下面分割字符串時候要以\ax0分割。
-
試下載一頁的視頻
import requests from lxml import etree list_url = "http://www.51shiping.com/list-657-1.html" v_url = "http://www.51shiping.com/uploadfiles/jiaochen/pscs7/mp9/" # 視頻地址,用於拼接 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"} response = requests.get(list_url,headers=headers) text = response.text # 解析 html = etree.HTML(text) titles = html.xpath("//div[@align='left']/a/text()") # 下載 for title in titles: #unicodedata.normalize('NFKC', titles[i]) # 去掉\xa0這樣的空白字符 file_dir = 'E:/PSVideo/{}.mp4'.format(title) # 保存的路徑和文件名 order = title.split('\xa0')[0] # 每節的編號 video_url = v_url+order.split('.')[0]+'-'+order.split('.')[1]+'.mp4' # 拼接視頻下載地址 print(title+'正在下載中...請耐心等待'); # 下載視頻 with open(file_dir,'wb') as f: f.write(requests.get(video_url,headers=headers).content) f.flush() print(video_url) print(file_dir+' 已經下載成功!');
結果:
我這里網速可能還是有點慢,(同時我也懷疑是它的服務器太老啊哈哈)。
-
-
下載所有頁的視頻
import requests from lxml import etree def getVideo(n): # 訪問目錄網頁,n為目錄的頁數 list_url = "http://www.51shiping.com/list-657-{}.html".format(n) v_url = "http://www.51shiping.com/uploadfiles/jiaochen/pscs7/mp9/" # 視頻地址,用於拼接 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"} response = requests.get(list_url,headers=headers) text = response.text # 解析 html = etree.HTML(text) titles = html.xpath("//div[@align='left']/a/text()") # 下載 for title in titles: #unicodedata.normalize('NFKC', titles[i]) # 去掉\xa0這樣的空白字符 file_dir = 'E:/PSVideo/{}.mp4'.format(title) # 保存的路徑和文件名 order = title.split('\xa0')[0] # 每節的編號 video_url = v_url+order.split('.')[0]+'-'+order.split('.')[1]+'.mp4' # 拼接視頻下載地址 print(title+'正在下載中...請耐心等待'); # 下載視頻 with open(file_dir,'wb') as f: f.write(requests.get(video_url,headers=headers).content) f.flush() print(video_url) print(file_dir+' 已經下載成功!'); if __name__ == "__main__": for n in range(1,7): getVideo(1)
這個結果我就不再演示啦,(網速慢的我)
總結
該項目利用了requests+XPath知識實現,不是很難,我是一個初學爬蟲的小白,都能實現,更何況你呢~
如果能給你正在寫的項目一點啟發,那更是好啦!哈哈,如果覺得還可以,記得給我點個贊哦~你的贊就是對我最大的鼓勵!