Python爬取梨視頻的示例
發(fā)現(xiàn)視頻的url在id為“JprismPlayer”的div標(biāo)簽下的video標(biāo)簽src屬性中,xpath解析網(wǎng)頁(yè)
video_url = tree.xpath('//div[@id=’JprismPlayer’]/video/@src')
但得到的返回值為空,也就是說(shuō)這個(gè)video標(biāo)簽在原網(wǎng)頁(yè)中并不存在,很可能是動(dòng)態(tài)加載出來(lái)的
2. 從動(dòng)態(tài)請(qǐng)求獲取視頻的url果然在動(dòng)態(tài)請(qǐng)求中發(fā)現(xiàn)了包含視頻url的json數(shù)據(jù)
可是發(fā)起請(qǐng)求后拿到的json數(shù)據(jù)卻和抓包工具中看到的不一樣,試著在請(qǐng)求頭中加入Referer參數(shù),查看referer可以發(fā)現(xiàn),它最后video_后面跟的是首頁(yè)中視頻的編號(hào)
{'resultCode':'1','resultMsg':'success', 'reqId':'fd1c910d-f49a-431a-b9a4-9c193c3c1983','systemTime': '1611666178518','videoInfo':{'playSta':'1','video_image':'https://image1.pearvideo.com/cont/20210125/11107897-184717-1.png','videos':{'hdUrl':'','hdflvUrl':'','sdUrl':'','sdflvUrl':'','srcUrl':'https://video.pearvideo.com/mp4/third/20210125/1611666178518-11107897-181816-hd.mp4'}}}
在headers中加入Referer后順利拿到j(luò)son數(shù)據(jù)
可向json數(shù)據(jù)中的視頻url發(fā)起請(qǐng)求拿到的卻是404頁(yè)面
3. 拼接正確的url這里花了很長(zhǎng)時(shí)間去想哪里有問(wèn)題,把前面的步驟理了很多遍才發(fā)現(xiàn),其實(shí)動(dòng)態(tài)請(qǐng)求返回的json數(shù)據(jù)中的視頻url和主頁(yè)video標(biāo)簽中的視頻url根本不一致
首頁(yè)中加載出來(lái)的視頻鏈接是正確的,可以順利的拿到視頻,而json數(shù)據(jù)中的鏈接則會(huì)返回404。把他們進(jìn)行對(duì)比,可以看到他們前半部分是一樣的,但到了紅線框住的地方就不一樣了。正確的url是 cont-視頻id-而json數(shù)據(jù)中的url這個(gè)部分是 一串?dāng)?shù)字那只要把這一串?dāng)?shù)字改成 cont-視頻id- 的形式就能獲得正確的視頻url了
代碼# 爬取梨視頻import requestsfrom lxml import etreeimport osfrom multiprocessing import Pool# 梨視頻首頁(yè)urlurl = 'https://www.pearvideo.com/category_6'headers = {’User-Agent’: ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36’ }# 獲取響應(yīng),并用etree解析response = requests.get(url=url, headers=headers).texttree = etree.HTML(response)# 拿到視頻的名字和視頻號(hào)video_id_list = tree.xpath('//ul[@class=’listvideo-list clearfix’]/li[@class=’categoryem ’]//a[@class=’vervideo-lilink actplay’]/@href')video_name_list = tree.xpath('//ul[@class=’listvideo-list clearfix’]/li[@class=’categoryem ’]//a/div[@class=’vervideo-title’]/text()')data_list = [{'name': video_name_list[i], 'idNum': video_id_list[i][6:]} for i in range(len(video_name_list))]# 創(chuàng)建一個(gè)存放視頻的文件夾if not os.path.exists('./videos'): os.mkdir('./videos')# 獲取視頻的函數(shù)def down_video(data): name = data[’name’] idNum = data[’idNum’] # 獲取視頻需要的headers,注意這里的Referer要和視頻的id匹配 headers = { ’User-Agent’: ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36’, ’Referer’: f’https://www.pearvideo.com/video_{idNum}’ } # 獲取接近真正視頻url的url,這里的id也需要和視頻id匹配才行 url = f’https://www.pearvideo.com/videoStatus.jsp?contId={idNum}’ # 得到包含視頻地址json響應(yīng)數(shù)據(jù) response = requests.get(url=url, headers=headers).json() video_url = response['videoInfo']['videos']['srcUrl'] # 將視頻地址中的數(shù)字替換成 cont-視頻編號(hào) 拿到真正的視頻地址 video_url = video_url.replace(video_url.split('/')[-1].split('-')[0], 'cont-' + idNum) # 拿到視頻并保存 video = requests.get(url=video_url, headers=headers).content with open(f'./videos/{name}.mp4', 'wb') as f: print(f'正在下載視頻 {name} ...') f.write(video) print(f'視頻 {name} 下載完成!')if __name__ == ’__main__’: # 創(chuàng)建進(jìn)程池并使用 pool = Pool(3) pool.map(down_video, data_list) pool.close() pool.join()總結(jié)
其實(shí)最難的地方是獲取正確的視頻url,中間過(guò)程比較繞。只要找到這個(gè)地址,再加上從首頁(yè)拿到的視頻id就可以順利拿到視頻了。如果要爬取整個(gè)首頁(yè)視頻只需要重新設(shè)置xpath路徑就可以了。
以上就是Python爬取梨視頻的示例的詳細(xì)內(nèi)容,更多關(guān)于Python爬取梨視頻的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 基于 Python 實(shí)踐感知器分類(lèi)算法2. Python如何批量生成和調(diào)用變量3. ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車(chē)4. 通過(guò)CSS數(shù)學(xué)函數(shù)實(shí)現(xiàn)動(dòng)畫(huà)特效5. ASP.Net Core對(duì)USB攝像頭進(jìn)行截圖6. python利用opencv實(shí)現(xiàn)顏色檢測(cè)7. ASP.Net Core(C#)創(chuàng)建Web站點(diǎn)的實(shí)現(xiàn)8. Python 中如何使用 virtualenv 管理虛擬環(huán)境9. Python獲取B站粉絲數(shù)的示例代碼10. windows服務(wù)器使用IIS時(shí)thinkphp搜索中文無(wú)效問(wèn)題
