【Python】爬蟲下載視頻


Python爬蟲下載視頻

前言

這兩天我一時興起想學習 PS ,於是去我的軟件寶庫中翻出陳年已久的 PhotoshopCS6 安裝,結果發現很真流暢誒!

然后去搜索學習視頻,網上的視頻大多浮躁,收費,突然想到了我入門編程時學習的網站, 我要自學網 ,尋找當時非常喜歡的易語言編程視頻,很可惜,沒有了。而且發現網站似乎不那么好用了QAQ。

找啊找,找啊找,找到了一個同類型,界面很古老的學習網站, 51視頻學院(禁不住好奇,似乎很多那個時候的網站都喜歡51開頭,比如吾愛論壇,51巔峰閣...) ,發現上面的ps視頻還可以,但是我家的網速是不是老卡,所以想一下子都下載完,然后就慢慢本地看啦!不再受網絡的影響。 想到這種事情,就立馬想到了Python。

Python搞起!

分析

  1. 尋找視頻地址

    右鍵網頁點擊檢查,先刷新一下網頁,然后點擊網絡選項卡。

    這個網站屬於比較老啦,哈哈,我這樣的爬蟲小白白都能爬,直接點擊媒體,我們就能發現視頻的請求地址啦,也就是下載地址。啊哈,果不其然,復制鏈接后打開就可以下載視頻了!

  2. 獲取視頻地址

    這就是我們尋找到的視頻地址啦,但是怎么知道其他視頻的地址呢?注意看紅色方框的內容

    這個時候,讓我們回到這個課程的目錄頁看看

    欸欸欸?是不是看到了點東西?沒錯,相信眼光敏銳的你已經看到啦,視頻地址的后面的1-1就是課程的章節序號啦!

    那我們去試幾個,發現也是可行的!所以我們從目錄網頁上獲取那個章節序號就好啦,順便把后面的文字也獲取了,當成文件名。不然都不知道視頻的內容是什么。

    總而言之,流程大致為從目錄獲取章節序號->下載視頻->保存到本地。

    寫代碼!

    1. 獲取章節序號及內容

      這里用到了XPath,不會的 點我看看, 很簡單的。

      代碼:

      import requests
      from lxml import etree
      
      list_url = "http://www.51shiping.com/list-657-1.html"
      headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"}
      response = requests.get(list_url,headers=headers)
      text = response.text
      # 解析
      html = etree.HTML(text)
      titles = html.xpath("//div[@align='left']/a/text()")
      for title in titles:
          print(title)
      

      結果:

      完美!第一步大功告成

      但是,在編寫下面是發現一個隱藏的坑點,那就是 空格是'\ax0',你輸出titles就知道我說的什么意思了 ,下圖是titles數組實際存的內容:

      所以下面分割字符串時候要以\ax0分割。

    2. 試下載一頁的視頻

      import requests
      from lxml import etree
      
      list_url = "http://www.51shiping.com/list-657-1.html"
      v_url = "http://www.51shiping.com/uploadfiles/jiaochen/pscs7/mp9/" # 視頻地址,用於拼接
      headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"}
      response = requests.get(list_url,headers=headers)
      text = response.text
      # 解析
      html = etree.HTML(text)
      titles = html.xpath("//div[@align='left']/a/text()")
      # 下載
      for title in titles:
          #unicodedata.normalize('NFKC', titles[i]) # 去掉\xa0這樣的空白字符
          file_dir = 'E:/PSVideo/{}.mp4'.format(title) # 保存的路徑和文件名
          order = title.split('\xa0')[0] # 每節的編號
          video_url = v_url+order.split('.')[0]+'-'+order.split('.')[1]+'.mp4' # 拼接視頻下載地址
          print(title+'正在下載中...請耐心等待');
          # 下載視頻
          with open(file_dir,'wb') as f:
              f.write(requests.get(video_url,headers=headers).content)
              f.flush()
              print(video_url)
              print(file_dir+'  已經下載成功!');
      

      結果:

    我這里網速可能還是有點慢,(同時我也懷疑是它的服務器太老啊哈哈)。

  3. 下載所有頁的視頻

    import requests
    from lxml import etree
    
    def getVideo(n):
        # 訪問目錄網頁,n為目錄的頁數
        list_url = "http://www.51shiping.com/list-657-{}.html".format(n)    
        v_url = "http://www.51shiping.com/uploadfiles/jiaochen/pscs7/mp9/" # 視頻地址,用於拼接
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"}
        response = requests.get(list_url,headers=headers)
        text = response.text
        # 解析
        html = etree.HTML(text)
        titles = html.xpath("//div[@align='left']/a/text()")
        # 下載
        for title in titles:
            #unicodedata.normalize('NFKC', titles[i]) # 去掉\xa0這樣的空白字符
            file_dir = 'E:/PSVideo/{}.mp4'.format(title) # 保存的路徑和文件名
            order = title.split('\xa0')[0] # 每節的編號
            video_url = v_url+order.split('.')[0]+'-'+order.split('.')[1]+'.mp4' # 拼接視頻下載地址
            print(title+'正在下載中...請耐心等待');
            # 下載視頻
            with open(file_dir,'wb') as f:
                f.write(requests.get(video_url,headers=headers).content)
                f.flush()
                print(video_url)
                print(file_dir+'  已經下載成功!');
    
    if __name__ == "__main__":
        for n in range(1,7):
            getVideo(1)
    

    這個結果我就不再演示啦,(網速慢的我)

總結

該項目利用了requests+XPath知識實現,不是很難,我是一個初學爬蟲的小白,都能實現,更何況你呢~

如果能給你正在寫的項目一點啟發,那更是好啦!哈哈,如果覺得還可以,記得給我點個贊哦~你的贊就是對我最大的鼓勵!


免責聲明!

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



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