基于python爬取梨視頻實(shí)現(xiàn)過(guò)程解析
目標(biāo)網(wǎng)址:梨視頻
然后我們找到科技這一頁(yè):https://www.pearvideo.com/category_8。其實(shí)你要哪一頁(yè)都行,你喜歡就行。嘿嘿…
這是動(dòng)態(tài)網(wǎng)站,所以咱們直奔network 然后去到XHR:

找規(guī)律,這個(gè)應(yīng)該不難,我就直接貼網(wǎng)址上來(lái)咯,想要鍛煉的可以找找看哈:
https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=0
這個(gè)就是我們要找的目標(biāo)網(wǎng)址啦,后面的0就代表頁(yè)數(shù),讓打開(kāi)這個(gè)網(wǎng)頁(yè)發(fā)現(xiàn)是靜態(tài)網(wǎng)頁(yè),這最好搞啦,直接上:

代碼如下:
import requests
import parsel,re
import os
target = "https://www.pearvideo.com/videoStatus.jsp?contId="
url = "https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0"
res = requests.get(url)
res.encoding="utf-8"
html = parsel.Selector(res.text)
lists = html.xpath('/html/body/li/div/a/@href').getall()
for each in lists:
print("https://www.pearvideo.com/"+each)
output;
https://www.pearvideo.com/video_1703486
https://www.pearvideo.com/video_1703189
https://www.pearvideo.com/video_1703161
https://www.pearvideo.com/video_1702880
https://www.pearvideo.com/video_1702773
...
順利拿到,然后進(jìn)入播放頁(yè)面,卻發(fā)現(xiàn)找不到MP4視頻,怎么辦?經(jīng)過(guò)我一番努力(扯掉了幾十根頭發(fā)后)發(fā)現(xiàn),它在另外一個(gè)網(wǎng)址里面

咋辦?當(dāng)然要想辦法把這個(gè)網(wǎng)址搞到手啦,仔細(xì)分析下,發(fā)現(xiàn)這個(gè)網(wǎng)址非常陌生呀,唯一稍微熟悉點(diǎn)的就是那串?dāng)?shù)字了,前面我們拿到播放頁(yè)的網(wǎng)址后面那串?dāng)?shù)字和這個(gè)對(duì)比,完全是一模一樣的,這樣的話那就好搞了,咱們直接用拼接的方式把它接上去就可以了,看代碼:
for each in lists:
url_num = each.replace('video_',"")
urls = target+url_num
print(urls)
``
```python
output:
https://www.pearvideo.com/videoStatus.jsp?contId=1703486
https://www.pearvideo.com/videoStatus.jsp?contId=1703189
https://www.pearvideo.com/videoStatus.jsp?contId=1703161
https://www.pearvideo.com/videoStatus.jsp?contId=1702880
https://www.pearvideo.com/videoStatus.jsp?contId=1702773
https://www.pearvideo.com/videoStatus.jsp?contId=1702633
...
出來(lái)了,好像稍微有點(diǎn)不一樣,后面那啥&mrd=***************** 沒(méi)有,怎么辦?沒(méi)有就不要唄,看過(guò)我發(fā)的百度圖片那篇的朋友都懂,網(wǎng)址里面有些東西是不需要的,純粹是搞咱們這些玩爬蟲(chóng)的,惡心咱們。不過(guò)沒(méi)辦法,畢竟是咱們要去爬人家的數(shù)據(jù)的。
網(wǎng)址問(wèn)題解決了,但是點(diǎn)進(jìn)去一看,發(fā)現(xiàn)這東東:

恩,很明顯,是遇到反爬機(jī)制了,這個(gè)好搞,要什么給什么就行,代碼如下:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
'Referer': 'https://www.pearvideo.com/video_'+ str(url_num)
}
html = requests.get(urls,headers=headers).text
print(html)

搞定??!
最后我們看一下MP4能不能播放:

西八!404??!恩,這里就稍微有點(diǎn)麻煩了,還得找數(shù)據(jù),把里面的時(shí)間戳改成 ‘cont-數(shù)字‘,感覺(jué)寫了好多,手都有點(diǎn)累了,我就直接上代碼了:
import requests
import parsel,re
import os
target = "https://www.pearvideo.com/videoStatus.jsp?contId="
url = "https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0"
res = requests.get(url)
res.encoding="utf-8"
html = parsel.Selector(res.text)
lists = html.xpath('/html/body/li/div/a/@href').getall()
# print(lists[2:])
# 提取視頻后面的數(shù)字,數(shù)字是最重要的,需要傳給 Referer 和 urls
for each in lists:
url_num = each.replace('video_',"")
urls = target+url_num
# print(urls)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
'Referer': 'https://www.pearvideo.com/video_'+ str(url_num)
}
html = requests.get(urls,headers=headers).text
cont = 'cont-' + str(url_num)
# 提取 mp4 視頻
srcUrl = re.findall(f'"srcUrl":"(.*?)"',html)[0]
# 替換視頻里面的時(shí)間戳,改為可以真正播放的數(shù)據(jù)
new_url = srcUrl.replace(srcUrl.split("-")[0].split("/")[-1],cont)
print(new_url)
# 使用視頻后綴當(dāng)視頻名稱
filename = srcUrl.split("/")[-1]
# 保存到本地
with open("./images/"+filename,"wb") as f:
f.write(requests.get(new_url).content)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python中圖形庫(kù)turtle庫(kù)詳解(適用于計(jì)算機(jī)二級(jí))
Turtle庫(kù)是Python語(yǔ)言中的一個(gè)圖形庫(kù),可以用來(lái)繪制各種形狀,如線條、矩形、圓形等等,下面這篇文章主要給大家介紹了關(guān)于python中圖形庫(kù)turtle庫(kù)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
Macbook air m1安裝python/anaconda全過(guò)程(圖文)
這篇文章主要介紹了Macbook air m1安裝python/anaconda全過(guò)程(圖文),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Python 批量讀取文件中指定字符的實(shí)現(xiàn)
這篇文章主要介紹了Python 批量讀取文件中指定字符的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
如何在python中實(shí)現(xiàn)capl語(yǔ)言里的回調(diào)函數(shù)(推薦)
CAPL是一種程序語(yǔ)言,其中程序塊的執(zhí)行由事件控制,主要介紹了如何在python中實(shí)現(xiàn)capl語(yǔ)言里的回調(diào)函數(shù)及事件函數(shù)的作用,需要的朋友可以參考下2022-08-08
Python實(shí)戰(zhàn)之屏幕錄制功能的實(shí)現(xiàn)
屏幕錄制,即屏幕捕獲,是指將計(jì)算機(jī)屏幕上的活動(dòng)記錄下來(lái),生成視頻文件,本文 主要為大家介紹了如何使用Python實(shí)現(xiàn)這一功能,希望對(duì)大家有所幫助2025-03-03
python使用梯度下降算法實(shí)現(xiàn)一個(gè)多線性回歸
這篇文章主要為大家詳細(xì)介紹了python使用梯度下降算法實(shí)現(xiàn)一個(gè)多線性回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
NumPy隨機(jī)數(shù)據(jù)分布與Seaborn可視化詳解
數(shù)據(jù)分布是指數(shù)據(jù)集中所有可能值出現(xiàn)的頻率,并用概率來(lái)表示,它描述了數(shù)據(jù)取值的可能性,Seaborn 是一個(gè)基于 Matplotlib 的 Python 數(shù)據(jù)可視化庫(kù),用于創(chuàng)建統(tǒng)計(jì)圖表,本文就給大家詳細(xì)的介紹一下NumPy隨機(jī)數(shù)據(jù)分布與Seaborn可視化,需要的朋友可以參考下2024-05-05

