妙哇又到了一年一度的讓人詩興大發的季節
有不少小夥伴們此時此刻頗想吟詩一首:
啊!大海!全都是水!
啊!夏天!全都是腿!在這樣一個適合曬腿的季節裏,“老司機”帶你用 Python 爬取一個都是小姐姐的視頻網站~~~
莫問視頻平臺哪家強!存在自己硬盤才最香!
目錄
1 項目簡介
1.1 項目名稱
直播平臺小視頻爬取
1.2 項目介紹
本項目將運用Python爬蟲技術,爬取直播間海量小姐姐短視頻。
平臺播放能力再強也抵不過視頻存到自己硬盤中香。
1.3 項目亮點
- 動態數據抓包
- json數據解析方法
- 視頻數據保存
1.4 適合人羣
- Python零基礎、對爬蟲感興趣的
- 對妹子圖片、視頻感興趣的
- 晚上睡不着覺的
1.5 環境介紹
- Python環境:3.8.2
- python編譯器:JetBrains PyCharm 2018.1.2 x64
- 第三方庫及模塊:requests庫、json庫、re模塊
2 項目實現
2.1 思路詳解
首先,找到目標網站:
爬取以前,有必要先對爬蟲大致思路做一介紹:
- 1.分析網頁:確定爬取url路徑,headers參數
- 2.發送請求:requests庫,模擬瀏覽器發送請求,獲取響應數據
- 3.解析數據:json模塊,把json字符串轉化成python可交互的數據類型
- 4.保存數據:保存在目標文件夾中
按照這一思路,輕輕鬆鬆,就不愁小姐姐爬不到啦
值得注意的是,拉倒頁面最下方動態加載出下一頁的內容的形式叫異步加載
在進行 F12 鍵“檢查”時,異步加載數據包內容具體在 Network 中的 XHR 中
具體每個數據包中是什麼內容呢?是否是我們想要的目標呢?與當前頁面對應數據是否一致呢?
這些問題只需點擊每個數據包,在其中的 Preview 和 Response 中查看即可
下面從結構化的展示中隨便點開一個,可以看到視頻題目和作者暱稱與頁面視頻是一致的,所以這個就是我們接下來要處理的包
上面提到,爬蟲第一步確定目標的url,前期準備了這麼長時間就是一直在反覆確定該數據包是不是我們想要的那個,既然前面已經確定了,也就意味着目標的url確定了,具體在這個位置找到目標的url以及其對應的headers參數(瀏覽器標識):
OK,準備差不多了,開始擼代碼
1.分析網頁:確定爬取url路徑,headers參數(這裏注意headers是字典格式【鍵值對】)
# 獲取 URL 地址
url = '這裏填上圖中的Requests URL'
# headers 參數確定
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'
}
2.發送請求:requests庫,模擬瀏覽器發送請求,獲取響應數據
這裏用到requests第三方庫,先導庫
import requests
接下來模擬瀏覽器發送請求並打印檢查一下是否獲取到了數據
# 模擬瀏覽器發送 URL 地址請求
response = requests.get(url, headers=headers)
# 去除 response 響應對象中的文本數據
response_data = response.text
print(response_data)
我們發現打印運行結果與瀏覽器中Response結果是一致的
3.解析數據:json模塊,把json字符串轉化成python可交互的數據類型
因爲解析數據要用到json模塊,所以先導庫
import json
解析數據第一步:轉換數據類型(字典類型)
# 轉換數據類型
dict_data = json.loads(response_data)
print(dict_data)
解析數據第二步:解析數據(所得值爲列表形式)
在這一步,需要提前確定json數據中我們想要的信息,這裏推薦一個網站:http://json.cn/(可對json格式數據轉換)
或者乾脆從這個位置看也行
通過上圖轉換我們發現,我們想要的信息在content的list中
具體而言,視頻名稱:content中的list中的title;作者名稱:content中的list中的alias。
# 數據解析
data_list = dict_data['content']['list']
print(data_list)
在這裏我們發現有好多字典類型的數據,都在列表中,那麼怎麼取出呢?遍歷它
# 遍歷
for data in data_list:
print(data)
進行到這裏,始終不要忘了我們的目的,爬取視頻
這時分析字典中的數據,我們發現,“鍵”playurl的“值”就是視頻的url鏈接地址
當然這裏也可以給每個爬取到的視頻添加其原本的視頻名稱及作者暱稱等信息(在title和alias中)
# 遍歷
for data in data_list:
# print(data)
video_title = data['title'] # 視頻文件名
video_alias = data['alias'] # 視頻作者名
video_playurl = data['playurl'] # 視頻 url
print('視頻:', video_title, '作者:', video_alias, 'url地址:', video_playurl)
與前面類似,接下來再模擬瀏覽器發送視頻的 URL 請求
# 發送視頻 URL 請求
video = requests.get(video_playurl, headers=headers).content
4.保存數據:保存在目標文件夾中
保存文件這裏用 with open 方法
# 保存數據
with open(r'F:\Beautiful Girl Video\\' + video_title + '_' + video_alias + '.mp4', 'wb') as video_file:
video_file.write(video)
嘶~~啊~~真香
那麼上面是爬取了一頁的小姐姐視頻,那麼2頁,3頁……怎樣把辣麼多小姐姐全部獲取到呢?
接下來就分析小姐姐視頻數據包的url地址有什麼規律了
……
很容易發現,所有的url地址就一處地方不同,1代表第一頁,2代表第二頁……
這裏直接用for循環即可
for page in range(1, 5):
這裏還有一個問題,若視頻名稱有“[”、“]”、“_”等出現會報錯,那麼在這裏需要另外設計一下替換非法字符
def change_title(title):
# 替換非法字符
pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|]")
new_title = re.sub(pattern, "_", title)
return new_title
2.2 總觀代碼
import requests
import json
import re
def change_title(title):
# 替換非法字符
pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|]")
new_title = re.sub(pattern, "_", title)
return new_title
# 示例爬取5頁數據
for page in range(1, 5):
print('---------------正在爬取第{}頁小姐姐視頻-------------------'.format(page))
# 獲取 URL 地址
url = 'https://******/minivideo/getlist.php?act=recommend&page={}&pagesize=20'.format(page)
# headers 參數確定
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'
}
# 模擬瀏覽器發送 URL 地址請求
response = requests.get(url, headers=headers)
# 去除 response 響應對象中的文本數據
response_data = response.text
# print(response_data)
# 轉換數據類型
dict_data = json.loads(response_data) # 字典
# print(dict_data)
# 數據解析
data_list = dict_data['content']['list'] # 列表
# print(data_list)
# 遍歷
for data in data_list:
# print(data)
video_title = data['title'] # 視頻文件名
video_alias = data['alias'] # 視頻作者名
video_playurl = data['playurl'] # 視頻 url
# print('視頻:', video_title, '作者:', video_alias, 'url地址:', video_playurl)
print('正在下載視頻:', video_title)
new_title = change_title(video_title)
# 發送視頻 URL 請求
video = requests.get(video_playurl, headers=headers).content
# 保存數據
with open(r'F:\Beautiful Girl Video\\' + new_title + '_' + video_alias + '.mp4', 'wb') as video_file:
video_file.write(video)
print('視頻下載成功…… \n')
print('---------------第{}頁小姐姐視頻爬取完畢-------------------'.format(page))
2.3 運行效果
……
再看一下文件夾
哈哈,騷年們!你們要的小姐姐至此爬取完畢啦啦啦啦~~~
3 項目聲明
版權聲明:本專欄全部爲CSDN博主「IT_change」的原創文章,遵循 CC 4.0 BY-SA 版權協議。
轉載請附上原文出處鏈接及本聲明。
感謝閱讀!感謝支持!感謝關注!
更多原創文章請點擊我的→主頁
END