爬蟲案例-如何爬取梨視頻?


一、目標

爬取梨視頻-娛樂-版塊下標簽為‘最熱’的視頻,存儲到本地'梨視頻'目錄下,視頻名:視頻標題.mp4

首頁url:https://www.pearvideo.com/category_4

二、分析

  • 首頁可以提取到視頻標題以及詳情頁url(部分),比如:'video_1731216',下面以該視頻為例
  • 進入詳情頁,可以從頁面中查看到視頻地址藏在video標簽中,地址:’https://video.pearvideo.com/mp4/third/20210603/cont-1731216-10887340-153958-hd.mp4‘

  • 但是通過抓包工具局部搜索無法找到該標簽,所以判斷是通過ajax動態加載獲取到的

  • 捕獲到ajax請求
    • url:’https://www.pearvideo.com/videoStatus.jsp?contId=1731216&mrd=0.03291621253058907‘
    • method:GET

  • 我們來回顧下整個流程:
    • 主頁獲取到詳情頁url:'video_1731216'
    • ajax請求:’https://www.pearvideo.com/videoStatus.jsp?contId=1731216&mrd=0.03291621253058907‘---mrd參數是0-1之間的一個隨機數(random.random()),需要注意的是,發送ajax請求時,需要驗證請求頭中的Referer參數,對應的是詳情頁url,否則無法獲取數據
    • ajax請求返回的url:’https://video.pearvideo.com/mp4/third/20210603/1622802774696-10887340-153958-hd.mp4
    • 視頻真實url:’https://video.pearvideo.com/mp4/third/20210603/cont-1731216-10887340-153958-hd.mp4
  • 總結:
    • 通過主頁獲取詳情頁視頻id,然后我們可以構造ajax請求:’https://www.pearvideo.com/videoStatus.jsp?contId=id&mrd=0-1之間的隨機數
    • 發送ajax請求時注意需要攜帶上Referer參數,並將返回的url中時間戳替換成’cont-id

三、代碼實現

# coding:utf-8
import requests import random import os import re from multiprocessing.dummy import Pool from fake_useragent import UserAgent from lxml import etree class LiVideoSpider: '''梨視頻爬蟲類'''

    def __init__(self): self.st_url = 'https://www.pearvideo.com/category_4' #首頁url
        self.p = Pool(4) #創建4個線程的線程池
        self.headers = { 'ua':UserAgent().random } self.items = [] #存儲視頻相關信息,[{'id':'xxx','video_url':'xxx'...},...]
        self.video_path = './梨視頻' #視頻存儲路徑

    def start(self): '''爬蟲入口'''
        
        #創建存儲文件夾
        if not os.path.exists(self.video_path): os.mkdir(self.video_path) #獲取主頁數據
        response = requests.get(url=self.st_url,headers=self.headers) tree = etree.HTML(response.text) li_list = tree.xpath('//*[@id="listvideoList"]/ul/li') #解析主頁數據,提取id,詳情頁url,視頻標題
        for li in li_list: title = li.xpath('.//div[@class="vervideo-title"]/text()')[0] detail_url = li.xpath('./div/a/@href')[0] id = detail_url.split('_')[-1] item = { 'id':id, 'title':title+'.mp4', 'detail_url':detail_url } self.items.append(item) #構造每個視頻ajax請求的url
        for i in range(len(self.items)): js_url = 'https://www.pearvideo.com/videoStatus.jsp?contId={}&mrd={}'.format(self.items[i]['id'],random.random()) self.items[i]['js_url'] = js_url #通過線程池異步獲取每個視頻的下載地址url
        items = self.p.map(self.get,self.items) #異步下載每個視頻
 self.p.map(self.download,items) def get(self,item): '''獲取視頻下載地址'''
        
        #headers中添上Referer參數
        headers = { 'ua':UserAgent().random, 'Referer':item['detail_url'] } json_data = requests.get(url=item['js_url'],headers=headers).json() video_url = json_data["videoInfo"]["videos"]["srcUrl"] #修正視頻下載地址url
        item['video_url'] = re.sub(r'16\d+-',r'cont-{}-'.format(item['id']),video_url) return item def download(self,item): '''下載視頻''' video_data = requests.get(url=item['video_url'],headers=self.headers).content with open(self.video_path+'/'+item['title'],'wb') as f: f.write(video_data) if __name__ == '__main__': LiVideoSpider().start()

四、爬取結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM