梨視頻爬取攻略
思路
1.打開網址查看數據加載方式,具體步驟是打開網絡源碼查看視頻數據是否存在 2.存在為直接加載,不存在為js動態申請,發現數據為js動態加載 3.打開network查看url地址,請求方式,視頻文件多為get請求 4.獲取首頁所有詳細頁面地址后,執行循環向詳細頁面地址發送請求 5.進入詳細頁面時,查看視頻加載方式 6.network查看url地址,請求方式,請求體或請求頭文件 systemTime srcUrl 7.獲取信息后,發現不是視頻數據 8.再對請求結果的觀察中發現真實地址與請求結果地址有相似的地方,但也有不同的地方 9.通過特定的值將請求結果地址替換為真實地址,利用視頻ID與systemTIme進行替換,就可以發送求獲得視頻 10.梨視頻存在防爬鏈,需要在請求返回值中查找referer鍵值對 11.將referer鍵值對,作為請求頭加入請求 12.向視頻的地址發送請求獲取視頻信息 13.最好設置時間間隔,不要太頻繁
實際操作
調用模塊
import requests ''' requests模塊主要用於網絡請求獲取數據,請求方式主要為get和post,本次實驗會用到get ''' from bs4 import BeautifulSoup ''' 從bs4集合中獲取BeautifulSoup,其主要識別'html'和'lxml'的文本內容,並且有多個選擇器可以篩選結果 ''' import os ''' os模塊運用於操作文本格式的文件 '''
進入官網查看,查看數據請求方式,右鍵檢查,發現是間接加載
按f12或右鍵檢查呼出后端界面。查看network,需要下拉或刷新頁面獲取請求信息,可以看到url和請求方式,在Paramerters中categoryld是用來定義視頻的種類,start為頁面視頻數量,為12的倍數,我們可以通過在請求頭中對這些數據進行更改,來獲得多個視頻的量
# 發送get請求網址 res=requests.get('https://www.pearvideo.com/category_9', params={"reqType": 5, "categoryId": 9, "start":page_id}) # 構造解析對象 soup=BeautifulSoup(res.text,'lxml')
# 獲取li列表中a鏈接標簽
li_class=soup.select('.categoryem a.vervideo-lilink')
獲取需要的詳情ID后,要去進行ID拼接才能請求進入詳情界面
用瀏覽器進入詳情頁面后,打開后端,刷新頁面,查看請求信息中的url與請求方式,獲取源地址信息
# 循環獲取視頻地址 for a_href in li_class: # 獲取網址具體地址 a_list_href=a_href.get('href') # 獲取網絡ID video_id=a_list_href.split('_')[-1] # print(video_id) # 發送請求 res2=requests.get('https://www.pearvideo.com/videoStatus.jsp?', # 請求體確定視頻 params={"contId": video_id}, # 請求頭輸入防爬鏈 headers={"Referer": "https://www.pearvideo.com/video_%s"%video_id}, )
但是打開url地址后,並沒有視頻,所以這不是我么們要的視頻地址
那真正的視屏地址在哪呢,首先運行視頻,打開頁面的網絡源碼后,查找video標簽,那才是視頻地址
可以發現真實地址與請求的家地址存在相同卻又不相似的地方,而假地址的不同數據就是請求數據中獲得的systmeTime,所以把家地址中的systemTime中的數據替換成真地址中的數據即可獲取事情內容,真地址的不同處為'cont-'加上述首頁程序獲取的video_id號,便可請求視頻數據
# 因為是json格式,使用json轉義對應數據,獲取假的視頻地址 fake_href=res2.json()["videoInfo"]["videos"]['srcUrl'] # print(fake_href) # 獲取沖突值 systemtime=res2.json()["systemTime"] # 將假地址變成真地址 real_href=fake_href.replace(systemtime,'cont-%s'%video_id) # 發送請求 res4=requests.get(real_href, # 請求體確定視頻 params={"contId": video_id}, # 請求頭輸入防爬鏈 headers={"Referer": "https://www.pearvideo.com/video_%s" % video_id}, )
梨視頻官網存在防爬鏈,所以要在請求頭加入該數據
# 路徑拼接 file_path=os.path.join(r'視頻',real_href[-8:]) # 打開路徑,以二進制寫入 with open(file_path,'wb') as f: # 寫入數據 f.write(res4.content) # 提示成功 print("親下載成功")
如果訪問過於頻繁,網站地址會把電腦IP封掉,所以最好加個訪問延遲,減緩工作量避免被防封號
# 等待時間 time.sleep(1)
執行結果