前言
大家早好丐一、午好、晚好吖~
環(huán)境使用:
Python 3.8
Pycharm
模塊使用:
- import requests >>> pip install requests
內(nèi)置模塊 你安裝好python環(huán)境就可以了
import re
import json
模塊安裝問(wèn)題:
如果安裝python第三方模塊:
win + R 輸入 cmd 點(diǎn)擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車(chē)
在pycharm中點(diǎn)擊Terminal(終端) 輸入安裝命令
安裝失敗原因:
-
<font color =red >失敗一: pip 不是內(nèi)部命令</font>
解決方法: 設(shè)置環(huán)境變量
-
<font color =red >失敗二: 出現(xiàn)大量報(bào)紅 (read time out)</font>
解決方法: 因?yàn)槭蔷W(wǎng)絡(luò)鏈接超時(shí), 需要切換鏡像源
清華:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:https://mirrors.aliyun.com/pypi/simple/
中國(guó)科技大學(xué) https://pypi.mirrors.ustc.edu.cn/simple/
華中理工大學(xué):https://pypi.hustunique.com/
山東理工大學(xué):https://pypi.sdutlinux.org/
豆瓣:https://pypi.douban.com/simple/例如:pip3 install -i https://pypi.doubanio.com/simple/ 模塊名
-
<font color =red >失敗三: cmd里面顯示已經(jīng)安裝過(guò)了, 或者安裝成功了, 但是在pycharm里面還是無(wú)法導(dǎo)入</font>
解決方法: 可能安裝了多個(gè)python版本 (anaconda 或者 python 安裝一個(gè)即可) 卸載一個(gè)就好
或者你pycharm里面python解釋器沒(méi)有設(shè)置好
如何配置pycharm里面的python解釋器?
選擇file(文件) >>> setting(設(shè)置) >>> Project(項(xiàng)目) >>> python interpreter(python解釋器)
點(diǎn)擊齒輪, 選擇add
添加python安裝路徑
pycharm如何安裝插件?
選擇file(文件) >>> setting(設(shè)置) >>> Plugins(插件)
點(diǎn)擊 Marketplace 輸入想要安裝的插件名字 比如:翻譯插件 輸入 translation / 漢化插件 輸入 Chinese
選擇相應(yīng)的插件點(diǎn)擊 install(安裝) 即可
安裝成功之后 是會(huì)彈出 重啟pycharm的選項(xiàng) 點(diǎn)擊確定, 重啟即可生效
如何實(shí)現(xiàn)蟲(chóng)案例: <思路流程 --> 通用>
一. 數(shù)據(jù)來(lái)源分析
- 分析清楚我們想要數(shù)據(jù)內(nèi)容, 是在什么地方, 什么樣子的
使用開(kāi)發(fā)者工具進(jìn)行抓包分析: 視頻數(shù)據(jù)以及視頻標(biāo)題
I. F12
或者 右鍵點(diǎn)擊檢查選擇network
刷新網(wǎng)頁(yè)
這么多數(shù)據(jù)包, 我想要視頻數(shù)據(jù)在什么地方?
- M3U8 視頻格式: 把整個(gè)完整的視頻內(nèi)容, 分為N個(gè)視頻片段, 每個(gè)片段都是幾秒鐘 <看多少就加載多少>
所有視頻片段 <ts文件> 都包含在 m3u8 的文件鏈接里面
II. 在開(kāi)發(fā)者工具里面 直接搜索m3u8 可以直接找相對(duì)應(yīng)鏈接地址
繼續(xù)分析 這個(gè) m3u8 url地址是從哪里過(guò)來(lái) 在什么地方有
III. 我們想要視頻數(shù)據(jù) <m3u8鏈接> 在 網(wǎng)頁(yè)源代碼里面有
獲取整個(gè)視頻內(nèi)容 ---> 分為N個(gè)視頻片段<ts文件> ---> 在m3u8鏈接里面 ---> 視頻播放詳情頁(yè)網(wǎng)頁(yè)源代碼里面
二. 代碼實(shí)現(xiàn)步驟:
發(fā)送請(qǐng)求, 模擬瀏覽器對(duì)于視頻播放詳情頁(yè)url發(fā)送請(qǐng)求
獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù)
開(kāi)發(fā)者工具里 response解析數(shù)據(jù), 提取我們想要的數(shù)據(jù)內(nèi)容
- m3u8鏈接
- 視頻標(biāo)題發(fā)送請(qǐng)求, 模擬瀏覽器對(duì)于 m3u8鏈接 發(fā)送請(qǐng)求
由第三步提取出來(lái)鏈接發(fā)送請(qǐng)求獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù)
開(kāi)發(fā)者工具里response
<對(duì)應(yīng)所有ts文件鏈接>解析數(shù)據(jù), 提取我們想要的數(shù)據(jù)內(nèi)容
所有ts文件鏈接保存數(shù)據(jù), 把所有視頻片段內(nèi)容保存下來(lái), 并且合成為一個(gè)完整視頻內(nèi)容
多頁(yè)數(shù)據(jù)采集
代碼展示
導(dǎo)入模塊
# 導(dǎo)入數(shù)據(jù)請(qǐng)求模塊 ---> 要安裝 在cmd里面 pip install requests
import requests
# 導(dǎo)入正則模塊 ---> 內(nèi)置模塊 不需要安裝
import re
# 導(dǎo)入json模塊 ---> 內(nèi)置模塊 不需要安裝
import json
# 導(dǎo)入格式化輸出模塊 ---> 內(nèi)置模塊 不需要安裝
from pprint import pprint
1. 發(fā)送請(qǐng)求, 模擬瀏覽器對(duì)于 視頻播放詳情頁(yè)url 發(fā)送請(qǐng)求
-
偽裝代碼 --> headers 請(qǐng)求頭
在開(kāi)發(fā)者工具里面進(jìn)行復(fù)制粘貼
<UA, cookie host referer>
請(qǐng)求頭 字典數(shù)據(jù)類(lèi)型, 構(gòu)建完整鍵值對(duì)
-
<Response [200]>
響應(yīng)對(duì)象200 狀態(tài)碼 表示請(qǐng)求成功
如果想要多個(gè)視頻內(nèi)容, 就要把視頻ID獲取下來(lái) <動(dòng)態(tài)數(shù)據(jù)加載>
分段寫(xiě)請(qǐng)求鏈接:
問(wèn)號(hào)左邊的內(nèi)容 屬于鏈接
問(wèn)號(hào)右邊的內(nèi)容 屬于請(qǐng)求參數(shù)/查詢(xún)參數(shù)
批量替換內(nèi)容:
選中替換的內(nèi)容, 按
ctrl + R
點(diǎn)選正則<.*>
正則命令匹配數(shù)據(jù) 替換
(.*?): (.*)
'$1': '$2',
請(qǐng)求鏈接
請(qǐng)求參數(shù)
data = {
'quickViewId': 'ac-space-video-list',
'reqID': '13',
'ajaxpipe': '1',
'type': 'video',
'order': 'newest',
'page': '2',
'pageSize': '20',
't': '1666360290070',
}
模擬偽裝
headers = {
# User-Agent 用戶(hù)代理 表示瀏覽器基本身份信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
發(fā)送請(qǐng)求
response_1 = requests.get(url=link, params=data, headers=headers)
解析數(shù)據(jù)
video_id_list = re.findall('atomid.*?":.*?"(\d+).*?",', response_1.text)
# for循環(huán)遍歷
for video_id in video_id_list:
# 發(fā)送請(qǐng)求
response = requests.get(url=url, headers=headers)
2. 獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù)
- 開(kāi)發(fā)者工具里 response
response.text
獲取響應(yīng)文本數(shù)據(jù) <網(wǎng)頁(yè)源代碼>
3. 解析數(shù)據(jù), 提取我們想要的數(shù)據(jù)內(nèi)容
m3u8鏈接
視頻標(biāo)題
調(diào)用re模塊里面findall
方法, 去找到所有我們想要的數(shù)據(jù)內(nèi)容
re.findall
('什么數(shù)據(jù)', '什么地方')
從什么地方去找你想要的什么數(shù)據(jù)
從 response.text
這里面 去找 "title":"(.*?)"
, 其中 (.*?)
是我們要的數(shù)據(jù)
[1]
列表索引位置取值
表示提取列表里面第二個(gè)元素
提取標(biāo)題
title = re.findall('"title":"(.*?)",', response.text)[1]
提取視頻信息
--> 字符串?dāng)?shù)據(jù)類(lèi)型
html_data = re.findall('window.pageInfo = window.videoInfo = (.*?);', response.text)[0]
轉(zhuǎn)數(shù)據(jù)類(lèi)型: 方便取值
---> 字典數(shù)據(jù)類(lèi)型 鍵值對(duì)取值: 根據(jù)冒號(hào)左邊的內(nèi)容[鍵], 提取冒號(hào)右邊的內(nèi)容[值]
json_data = json.loads(html_data)
提取 m3u8鏈接
m3u8_url = json.loads(json_data['currentVideoInfo']['ksPlayJson'])['adaptationSet'][0]['representation'][0]['backupUrl'][0]
4. 發(fā)送請(qǐng)求, 模擬瀏覽器對(duì)于 m3u8鏈接 發(fā)送請(qǐng)求
由第三步提取出來(lái)鏈接發(fā)送請(qǐng)求
5. 獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù)
開(kāi)發(fā)者工具里 response <對(duì)應(yīng)所有ts文件鏈接
xpath
標(biāo)簽節(jié)點(diǎn)提取數(shù)據(jù)內(nèi)容
re
是可以直接對(duì)于字符串?dāng)?shù)據(jù)進(jìn)行解析提取
css
根據(jù)標(biāo)簽屬性提取數(shù)據(jù)內(nèi)容
requests parsel re csv selenium
# 發(fā)送請(qǐng)求 + 獲取數(shù)據(jù)
m3u8_data = requests.get(url=m3u8_url, headers=headers).text
# 提取我們想要ts鏈接 跟上 6 有不明白 5 split() 分割字符串分割 --> 列表
m3u8_data = re.sub('#E.*', '', m3u8_data).split()
print(title)
# for循環(huán)遍歷 提取我們想要ts文件鏈接, 把列表里面元素 一個(gè)一個(gè)提取出來(lái)
for ts in m3u8_data:
字符串拼接 構(gòu)建完整鏈接地址
7. 保存數(shù)據(jù)
--> 需要發(fā)送請(qǐng)求 + 獲取數(shù)據(jù)
ts_content = requests.get(url=ts_url, headers=headers).content
with open('video\\' + title + '.mp4', mode='ab') as f:
# 寫(xiě)入數(shù)據(jù)
f.write(ts_content)
print(ts_url)
寧外給大家推薦一個(gè)好的教程:
【48小時(shí)搞定全套教程!你和大佬只有一步之遙【python教程】
尾語(yǔ) ??
好了,我的這篇文章寫(xiě)到這里就結(jié)束啦!
有更多建議或問(wèn)題可以評(píng)論區(qū)或私信我哦妄荔!一起加油努力叭(? ?_?)?
喜歡就關(guān)注一下博主,或點(diǎn)贊收藏評(píng)論一下我的文章叭5簟@沧狻!