基本步驟與準備工作
調試環境:
pycharm+python3
需要庫:
- urllib.
- request
- re
(http.cookiejar 後續爬蟲進場會使用到的庫,本項目反爬不涉及所以可以不添加)
如果import過程顯示沒有上述庫,可以通過文件→設置→projet interpreter中右側點擊+來添加(如果您使用anaconda或者python也可以直接運行本項目,通過cmd→pip install添加)
2.在本文中我們通過python對於在線的短視頻進行爬取,下載存儲。基本步驟如下(可以寫註釋梳理思路):
(1)分析頁面URL和視頻文件URL特徵 (2)獲取網頁源代碼HTML,解決反爬機制 (3)批量下載視頻存儲
分析頁面URL與文件URL特徵
1.分析網頁URL
通過網頁網址:http://www.budejie.com/video/1,我們可以發現針對不同頁碼變化的知識網址最後一個數值,而這個數值代表了頁數,所以只需要改變為固定網址+變量的形式批量獲取該站的網址URL
2.分析文件名URL
通過對於網頁當中的mp4的文件名進行分析,發現文件的URL是明文顯示的,所以通過re的正則可以匹配獲取。
批量獲取URL,並從中提取視頻的URL
import urllib.request
import re
for page in range (1,20):
req = urllib.request.Request("http://www.budejie.com/video/%s" % page)
html = urllib.request.urlopen(req).read()
html = html.decode('UTF-8')
print(html)
1.批量爬取網頁URL
這裡我們page變量代表頁面的編碼,從這裡我們暫時先爬取前20頁。
(1)req獲取網頁反饋 (2)html通過函數獲取網頁的元代碼 (3)通過對於源代碼UTF-8編碼恢復中文的顯示。
但是通過上述代碼的執行發現錯誤顯示http Error 403,因為網頁的反爬機制不能獲取。
2.通過頁面增加頭文件
我們通過谷歌瀏覽器訪問頁面,按F12並切換到Network,刷新界面觀察訪問進程,可以從進程文件中選取一個查看頭文件,添加到代碼中,(這裡選取的baisibudejie.js)修改代碼如下,可以正常爬取界面。
for page in range (1,20):
req = urllib.request.Request("http://www.budejie.com/video/%s" % page)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
html = urllib.request.urlopen(req).read()
html = html.decode('UTF-8')
print(html)
批量下載視頻,並建立文件名存儲
1.建立循環結構批量命名
建立循環結構之後,需要保留文件名下載,i.split("/")[-1]的含義是將i進行分割,以‘/’為分割符,保留最後一段,即MP4文件名。
2.批量下載
還是需要加一句顯示的輸出語句,來表示進程,也符合一個程序的交互性,也就是下載到那個視頻的時候顯示一下進度,最後下載到一個mp4的文件夾內
for i in re.findall(reg, html):
filename = i.split("/")[-1] # 以‘/ ’為分割f符,保留最後一段,即MP4的文件名
print('正在下載%s視頻' % filename)
urllib.request.urlretrieve(i, "mp4/%s" % filename)
1.建立完整程序
作為一名合格的程序員,需要梳理程序,添加註釋,便於理解和後續的修改
import urllib.request
import re
def getVideo(page):
req = urllib.request.Request("http://www.budejie.com/video/%s" %page)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
html = urllib.request.urlopen(req).read()
html = html.decode('UTF-8')
reg = r'data-mp4="(.*?)"'
for i in re.findall(reg,html):
filename = i.split("/")[-1]#以‘/ ’為分割f符,保留最後一段,即MP4的文件名
print ('正在下載%s視頻' %filename)
urllib.request.urlretrieve(i,"mp4/%s"%filename)
for i in range (1,20):
獲取方式:請大家轉發本文+關注並私信小編 “ 資料 ”,即可獲取。
獲取方式:請大家轉發本文+關注並私信小編 “ 資料”,即可獲取。
閱讀更多 言熙編程導師 的文章