Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲日本在线播放,欧美一区2区三区3区公司,韩国精品视频在线观看

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Python爬取下載m3u8加密視頻,原來這么簡(jiǎn)單

          .前言

          爬取視頻的時(shí)候發(fā)現(xiàn),現(xiàn)在的視頻都是經(jīng)過加密(m3u8),不再是mp4或者avi鏈接直接在網(wǎng)頁顯示,都是經(jīng)過加密形成ts文件分段進(jìn)行播放。

          今天就教大家如果通過python爬取下載m3u8加密視頻。

          2.分析網(wǎng)頁

          1.電影視頻來源

          
          http://www.caisetv.com/
          


          2.分析m3u8加密目錄

          
          http://www.caisetv.com/dongzuopian/chaidanzhuanjia/0-1.html
          




          在視頻播放的頁面,通過F12可以查看網(wǎng)絡(luò)數(shù)據(jù)包

          
          https://xigua-cdn.haima-zuida.com/20210219/19948_fcbc225a/1000k/hls/index.m3u8
          




          這里的ts就電影的加密分段視頻

          
          https://xigua-cdn.haima-zuida.com/20210219/19948_fcbc225a/1000k/hls/
          

          上面的m3u8鏈接掉index.m3u8后,在拼上075a34cccdd000000.ts等ts名稱就是分段視頻的鏈接

          如下所示:

          
          https://xigua-cdn.haima-zuida.com/20210219/19948_fcbc225a/1000k/hls/075a34cccdd000000.ts
          

          通過瀏覽器把這個(gè)分段視頻下載后打開:






          所以只要把所有的ts下載并合并就是完整的電影視頻!!!

          3.下載ts

          1.下載ts分段視頻

          剛剛已經(jīng)把ts的所有名稱下載下來了






          接下來通過python代碼去讀取這個(gè)文件,提取出名稱,拼接鏈接后下載保存到一個(gè)文件夾里!

          
          headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',}
          
          ###下載ts文件
          def download(url,name):
              r = requests.get(url, headers=headers)
              with open(name+"", "wb") as code:
                  code.write(r.content)
          
          with open("index.m3u8","r") as f:
              ts_list = f.readlines()
          
          #去掉前面沒用的信息
          ts_list = ts_list[5:]
          urlheader="https://xigua-cdn.haima-zuida.com/20210219/19948_fcbc225a/1000k/hls/"
          count = 0
          for i in ts_list:
              if "#" not in i:
                  i = i.replace("\n","")
                  download(urlheader+""+i,"cdzj2/"+str(count)+".ts")
                  count = count+1
                  print(count)
          




          這樣就可以把ts文件全部下載下來,但是一個(gè)一個(gè)下載很慢,下面通過多線程下載,提升下載速度?。。?/span>

          2.多線程下載ts視頻

          
          for i in ts_list:
              if "#" not in i:
                  i = i.replace("\n","")
                  n = i[-7:]
                  threading.Thread(target=download, args=(urlheader+""+i,"cdzj2/"+str(n),)).start()
                  #download(urlheader+""+i,"cdzj2/"+str(count)+".ts")
          




          通過多線程很快就可以將這些ts文件下載到本地?。?!

          4.合并ts

          cmd合并文件

          
          copy /b   *.ts   new.mp4
          

          通過這個(gè)命令(cmd終端中運(yùn)行),在含有ts文件的文件夾中就可以將ts文件合并(按名稱順序進(jìn)行排列合并),并保存成new.mp4




          5.總結(jié)

          1.分析m3u8加密文件
          2.python下載ts文件
          3.cmd合并ts保存成mp4格式


          程不是科學(xué),而是一門手藝

          Python 具有豐富的解析庫和簡(jiǎn)潔的語法,所以很適合寫爬蟲。這里的爬蟲指的是爬取網(wǎng)頁的“蟲子”。簡(jiǎn)而言之,爬蟲就是模擬瀏覽器訪問網(wǎng)頁,然后獲取內(nèi)容的程序。

          爬蟲工程師是個(gè)很重要的崗位。爬蟲每天爬取數(shù)以億計(jì)的網(wǎng)頁,供搜索引擎使用。爬蟲工程師們當(dāng)然不是通過單擊鼠標(biāo)右鍵并另存的方式來爬取網(wǎng)頁的,而會(huì)用爬蟲“偽裝”成真實(shí)用戶,去請(qǐng)求各個(gè)網(wǎng)站,爬取網(wǎng)頁信息。

          本文選自《Python基礎(chǔ)視頻教程》一書,每一小節(jié)都給出了視頻講解,配合視頻微課帶你快速入門Python。



          ( 正 文 )

          1、初識(shí) HTTP :4行代碼寫一個(gè)爬蟲

          超文本傳輸協(xié)議(HyperText Transfer Protocol,HTTP)是網(wǎng)絡(luò)中最常見的網(wǎng)絡(luò)傳輸協(xié)議。常見網(wǎng)站的網(wǎng)址大都以 http 開頭或者以 https 開頭,https 在 http 基礎(chǔ)上做了一層加密的協(xié)議。

          通常情況下,在瀏覽器里給服務(wù)器發(fā)送 http 或 https 請(qǐng)求,服務(wù)器拿到請(qǐng)求后會(huì)向?yàn)g覽器返回相應(yīng)的結(jié)果(response),瀏覽器解析、潤(rùn)色后呈現(xiàn)給用戶。

          寫爬蟲沒有那么難,下面用 4 行代碼寫一個(gè)爬蟲。在 first_spider.py 文件中寫入以下代碼:

          1from urllib import request
          2page = request.urlopen('http://www.yuqiaochuang.com/')
          3ret = page.read()
          4print(ret)


          python first_spider.py 運(yùn)行后,會(huì)看到屏幕上打印出了頁面的源代碼,這短短 4行就是一個(gè)爬蟲。

          從本質(zhì)上來說,這和打開瀏覽器、輸入網(wǎng)址去訪問沒有什么區(qū)別,只不過后者是借助瀏覽器獲取頁面內(nèi)容,而爬蟲則是用原生的 HTTP 獲取內(nèi)容。屏幕上打印的源代碼和在 Chrome 瀏覽器中單擊鼠標(biāo)右鍵,然后在彈出的快捷菜單中單擊“查看網(wǎng)頁源代碼”是一樣的。

          在此可以看到,網(wǎng)頁的源代碼是由很多標(biāo)簽組成的。

          尖括號(hào)包圍的就是一個(gè)標(biāo)簽,如<head><body><div>。標(biāo)簽內(nèi)可以有屬性,例如<html lang="zh-CN">,有一個(gè)值為"zh-CN"的 lang 屬性,表示語言是中文。標(biāo)簽通常是成對(duì)出現(xiàn)的,例如,<title>Python 教程 - 雨敲窗個(gè)人博客</title>。“Python 教程 - 雨敲窗個(gè)人博客”被<title>和</title>包括起來,包括起來的部分被稱為標(biāo)簽的內(nèi)容。


          2、正則表達(dá)式

          前面用 4 行代碼寫了一個(gè)爬蟲,運(yùn)行成功后可以看到爬取的內(nèi)容。不過,這卻是一個(gè)大塊的內(nèi)容,如果想提取其中的某些字段該怎么辦?

          常用的做法就是用正則表達(dá)式(Regular Expression)提取。

          對(duì)初學(xué)編程的人來說,很難理解正則表達(dá)式是“何方神圣”。其實(shí)大家可以把正則表達(dá)式當(dāng)作一個(gè)提取器來看,通過制定一些規(guī)則,從字符串中提取出想要的內(nèi)容。

          下面先看看正則表達(dá)式的幾個(gè)簡(jiǎn)單用法。在regular_expression.py 文件中寫入以下代碼:

          1import re # 正則表達(dá)式的包
          2
          3m = re.findall("abc", "aaaaabcccabcc")
          4print(m)
          5m = re.findall("\d", "abc1ab2c")
          6print(m)
          7m = re.findall("\d\d\d\d", "123abc1234abc")
          8print(m)
          9m = re.findall(r"<div>(.*)</div>", "<div>hello</div>")
          10print(m)
          11m = re.findall(r"<div>(.*)</div>", "<div>hello</div><div>world</div>")
          12print(m)
          13m = re.findall(r"<div>(.*?)</div>", "<div>hello</div><div>world</div>")
          14print(m)


          python regular_expression.py 的運(yùn)行結(jié)果如下:

          1['abc', 'abc']
          2['1', '2']
          3['1234']
          4['hello']
          5['hello</div><div>world']
          6['hello', 'world']


          首先,需要“import re”,以引用正則表達(dá)式模塊,這樣才能使用正則表達(dá)式庫中的方法。

          之后,上述代碼中的 m = re.findall("abc", "aaaaabcccabcc") 從"aaaaabcccabcc"中提取出"abc",返回的 m 是一個(gè)列表,里面有兩個(gè)'abc'。

          m = re.findall("\d", "abc1ab2c") 從"abc1ab2c"中提取出單個(gè)數(shù)字,"\d"表示提取的目標(biāo)字符是數(shù)字,返回的結(jié)果是['1', '2'] 。

          m = re.findall("\d\d\d\d", "123abc1234abc")提取 4 個(gè)連續(xù)的數(shù)字,返回的結(jié)果是['1234']。

          m = re.findall(r"<div>(.*)</div>", "<div>hello</div>")從"<div>hello</div>"中提取出<div>和</div>中間的內(nèi)容,括號(hào)括起來就表示提取括號(hào)中的內(nèi)容,“.”表示可以匹配任何字符,“*”表示可以匹配任意多個(gè)字符,返回的結(jié)果是['hello']。

          m = re.findall(r"<div>(.*)</div>", "<div>hello</div><div>world</div>")從"<div> hello</div><div>world</div>" 中 取 div 中 的 內(nèi) 容 , 返 回 的 結(jié) 果 是 ['hello</div> <div>world']。與上一行的提取規(guī)則相同,為什么沒有單獨(dú)提取出 hello 和 world 呢?因?yàn)檎齽t表達(dá)式默認(rèn)用的是貪婪匹配,所謂貪婪匹配就是能匹配多長(zhǎng)就匹配多長(zhǎng)。"<div>hello</div><div>world</div>"就從頭匹配到了末尾,提取出來一個(gè)大長(zhǎng)串。

          m = re.findall(r"<div>(.*?)</div>", "<div>hello</div><div>world</div>") 在括號(hào)中加入一個(gè)“?”就表示以非貪婪匹配去提取,即能匹配多短就匹配多短,所以提取出來的結(jié)果是['hello', 'world']。

          結(jié)合前面的幾個(gè)例子,可以總結(jié)出正則表達(dá)式中最常用的 findall 方法的用法。第一個(gè)參數(shù)是定義的提取語法,第二個(gè)參數(shù)是原始字符串。返回的是一個(gè)列表,列表里是符合提取規(guī)則的字符串。

          關(guān)于正則表達(dá)式更詳細(xì)的語法,大家可以借助搜索引擎,搜索“菜鳥教程正則表達(dá)式”。


          3、爬取靜態(tài)頁面的網(wǎng)站

          還 記 得 前 面 寫 的 那 個(gè) 只 有 4 行 碼 的 爬 蟲 嗎 ?它 爬 取 了 “ http://www. yuqiaochuang.com”整個(gè)頁面的內(nèi)容。在學(xué)過正則表達(dá)式之后,就可以提取想要的內(nèi)容。

          還是以爬取這個(gè)博客為例,提取這個(gè)博客上文章列表的標(biāo)題。

          在爬取一個(gè)網(wǎng)站前,通常要先分析一下這個(gè)網(wǎng)站是否是靜態(tài)頁面。靜態(tài)頁面是指,網(wǎng)站的源代碼里包含所有可見的內(nèi)容,也就是所見即所得。常用的做法是,在瀏覽器中單擊鼠標(biāo)右鍵,然后在彈出的快捷菜單中選擇“顯示網(wǎng)頁源代碼”,推薦使用 Chrome 瀏覽器。

          類似上圖中的代碼,就是網(wǎng)頁的源代碼,這里能夠看到該博客中文章的標(biāo)題和網(wǎng)址。

          接下來使用正則表達(dá)式提取各標(biāo)題。前面那個(gè)只有 4 行代碼的爬蟲用的是標(biāo)準(zhǔn)庫里的urllib 庫。推薦使用 requests 庫,其具有更強(qiáng)大、更易用的功能。使用 pip 安裝,在 PowerShell 命令行窗口中輸入以下命令:

          1pip install requests


          上述代碼的前兩行先將要使用的庫“import”進(jìn)來,然后調(diào)用 requests 庫中的 get方法獲取頁面(page)。之后使用 re.findall 方法提取所有的標(biāo)題,page.text 即頁面的源代碼內(nèi)容。將頁面中以“<p><a.*>”開頭、“</a></p>”結(jié)尾的標(biāo)題提取出來。

          若欲了解更多與 requests 庫相關(guān)的資料,可以借助搜索引擎,搜索“python requests”查看具體用法。


          4、beautifulsoup4

          beautifulsoup4 也是一個(gè) Python 的第三方庫,提供解析網(wǎng)頁的功能。其有些類似于正則表達(dá)式,但是比正則表達(dá)式的語法更加優(yōu)雅和便利。

          在 PowerShell 命令行窗口中輸入以下命令安裝 beautifulsoup4:

          1pip install beautifulsoup4


          還是以“http://www.yuqiaochuang.com”的網(wǎng)頁源代碼為例,提取這些文章的標(biāo)題和鏈接。在 blog_spider_use_bs4.py 文件中寫入以下代碼:

          1from bs4 import BeautifulSoup
          2import requests
          3page = requests.get('http://www.yuqiaochuang.com/')
          4soup = BeautifulSoup(page.text, features="html.parser")
          5all_title = soup.find("div", "entry-content").find_all("a")
          6for title in all_title:
          7 print(title["href"], title.string)


          “from bs4 import BeautifulSoup ”將 BeautifulSoup 引 進(jìn) 程 序 。

          “ soup = BeautifulSoup(page.text, features="html.parser")”聲明了一個(gè)解析結(jié)構(gòu) soup。這里解析的是爬取的網(wǎng)頁源代碼 page.text;features 指定了“html.parser”這個(gè)默認(rèn)的解析器。

          在此可以看到,想爬取的標(biāo)題都在 class 是“entry-content”的 div 塊中。“soup.find("div", "entry-content")”用于提取 class 是“entry-content”的 div 塊。緊接著調(diào)用 find_all,爬取所有標(biāo)題的標(biāo)簽。find_all 方法返回的是一個(gè)列表,這個(gè)列表中的元素是符合查找條件的標(biāo)簽。

          然后寫一個(gè)循環(huán),把標(biāo)題的標(biāo)簽打印下來。通過調(diào)用 title["href"]可以獲取標(biāo)簽中屬性的值—鏈接。title.string 則是獲取標(biāo)簽中的內(nèi)容。


          5、爬取圖片

          如果網(wǎng)站中僅有枯燥的文字,則很難吸引用戶持續(xù)觀看,所以,好的網(wǎng)站都是圖文并茂的。如果想將圖片也爬取下來,該怎么辦呢?爬蟲當(dāng)然也可以爬取圖片,就像在用瀏覽器訪問網(wǎng)站時(shí),可以在圖片上單擊鼠標(biāo)右鍵,然后在彈出的快捷菜單中選擇“另存為”選項(xiàng)去下載圖片一樣。

          利用 requests 庫也可以抓取圖片。還是以爬取“http://www.yuqiaochuang.com”為例,這次爬取網(wǎng)站左上角的圖片。在左上角的圖片上面單擊鼠標(biāo)右鍵,接著在彈出的快捷菜單中選擇“檢查”。

          在此可以看到,瀏覽器下方區(qū)域出現(xiàn)了一個(gè)工具欄,里面突出顯示的部分就是圖片地址的網(wǎng)頁源代碼。

          在此可以看到,圖片是以“img”標(biāo)簽開頭的。這個(gè)“img”標(biāo)簽在 class 是“profile”的 div 中,因此可以使用 requests+beautifulsoup4 提取圖片的地址。

          在 image_spider.py文件中寫入以下代碼:

          1from bs4 import BeautifulSoup
          2import requests
          3
          4page = requests.get('http://www.yuqiaochuang.com/')
          5soup = BeautifulSoup(page.text, features="html.parser")
          6img = soup.find("div", "profile").find("img")
          7print(img["src"])


          python image_spider.py 的運(yùn)行結(jié)果如圖下。

          soup.find("div", "profile").find("img") 直接提取了 img 標(biāo)簽,然后打印 img 標(biāo)簽中的 src 字段,在此可以看到圖片地址被提取了出來。但是,你有沒有發(fā)現(xiàn)這個(gè)鏈接地址似乎少了一些前綴?

          沒錯(cuò),少了"http://www.yuqiaochuang.com"。有些網(wǎng)站的圖片會(huì)省略前綴,在爬取時(shí)補(bǔ)上即可。接下來正式爬取圖片,在 image_spider.py 文件中寫入以下代碼:

          1from bs4 import BeautifulSoup
          2import requests
          3
          4page = requests.get('http://www.yuqiaochuang.com/')
          5soup = BeautifulSoup(page.text, features="html.parser")
          6img = soup.find("div", "profile").find("img")
          7
          8image_url = "http://www.yuqiaochuang.com" + img["src"]
          9img_data = requests.get(image_url)
          10img_file = "image.png"
          11
          12f = open(img_file, 'wb')
          13f.write(img_data.content)
          14f.close()


          python image_spider.py 運(yùn)行后,可以看到當(dāng)前文件夾下多了一個(gè)“image.png”圖片文件。

          在獲取圖片地址后,調(diào)用 requests 的 get 方法,獲取圖片的請(qǐng)求數(shù)據(jù),然后調(diào)用寫文件的方法,將圖片數(shù)據(jù)寫入到文件中。

          前面爬取文字時(shí),調(diào)用的是 text 字段,為什么這里變成了 content 字段呢?

          這是因?yàn)?content 是最原始的數(shù)據(jù),二進(jìn)制的數(shù)據(jù)流;而 text 則是經(jīng)過編碼的數(shù)據(jù)。在寫文件時(shí),參數(shù)也不是'w',而是'wb'。'wb'的意思是,寫入的數(shù)據(jù)是二進(jìn)制數(shù)據(jù)流,而不是經(jīng)過編碼的數(shù)據(jù)。爬取圖片和爬取文字的本質(zhì),都是根據(jù)網(wǎng)頁鏈接發(fā)送請(qǐng)求,然后獲取內(nèi)容,只不過圖片需要用二進(jìn)制的形式保存到本地文件中。


          —— 完 ——


          對(duì)編程充滿向往和好奇,卻不知如何上手嗎?

          博文視點(diǎn)學(xué)院精品課程【每天5分鐘:Python基礎(chǔ)視頻教程(書+課)】帶你打開編程世界的大門!

          今日僅需39元,你將獲得:

          • 300分鐘、46節(jié)視頻講解
          • 社群答疑,同行交流,互助成長(zhǎng)
          • 價(jià)值59元的《Python基礎(chǔ)視頻教程》圖書一本

          Python中爬取網(wǎng)站上的視頻通常涉及幾個(gè)步驟:定位視頻資源的URL,下載視頻文件,以及處理可能的登錄、反爬蟲機(jī)制等。以下是一個(gè)基本的流程和代碼示例,使用requests和BeautifulSoup庫來獲取網(wǎng)頁中的視頻鏈接,然后使用urllib或requests來下載視頻。

          首先,確保你已經(jīng)安裝了必要的庫:

          Bash

          深色版本

          1pip install requests beautifulsoup4

          接下來,你可以使用以下代碼框架來抓取視頻:

          import requests
          from bs4 import BeautifulSoup
          import os
          
          def fetch_video_url(url):
              # 發(fā)送HTTP請(qǐng)求獲取網(wǎng)頁內(nèi)容
              response = requests.get(url)
              # 解析HTML文檔
              soup = BeautifulSoup(response.text, 'html.parser')
              # 查找視頻標(biāo)簽
              video_tag = soup.find('video')
              # 獲取視頻源鏈接
              video_url = video_tag['src'] if video_tag else None
              return video_url
          
          def download_video(video_url, save_path):
              # 檢查目錄是否存在,不存在則創(chuàng)建
              if not os.path.exists(os.path.dirname(save_path)):
                  os.makedirs(os.path.dirname(save_path))
              
              # 發(fā)送請(qǐng)求并下載視頻
              with open(save_path, 'wb') as f:
                  response = requests.get(video_url, stream=True)
                  total_length = response.headers.get('content-length')
                  
                  if total_length is None:  # no content length header
                      f.write(response.content)
                  else:
                      dl = 0
                      total_length = int(total_length)
                      for data in response.iter_content(chunk_size=4096):
                          dl += len(data)
                          f.write(data)
                          done = int(50 * dl / total_length)
                          print('\r[%s%s]' % ('=' * done, ' ' * (50-done)), end='')
          
          if __name__ == "__main__":
              url = "http://example.com/video-page"
              video_url = fetch_video_url(url)
              
              if video_url:
                  save_path = "./videos/video.mp4"
                  download_video(video_url, save_path)
                  print("Video downloaded successfully.")
              else:
                  print("No video found on the page.")

          注意事項(xiàng):

          1. 版權(quán)問題:確保你有權(quán)下載和使用視頻內(nèi)容,遵守網(wǎng)站的使用條款和版權(quán)法律。
          2. 網(wǎng)站結(jié)構(gòu):不同的網(wǎng)站有不同的HTML結(jié)構(gòu),你可能需要根據(jù)具體的網(wǎng)站結(jié)構(gòu)調(diào)整代碼中的選擇器。
          3. 反爬蟲機(jī)制:一些網(wǎng)站可能有反爬蟲機(jī)制,如驗(yàn)證碼、IP封禁等,這可能需要更復(fù)雜的策略,比如使用代理、設(shè)置合理的延遲等。
          4. 流媒體視頻:對(duì)于流媒體視頻,可能需要使用專門的庫如youtube-dl來下載。
          5. 視頻格式:視頻可能有多種格式,下載時(shí)需要確認(rèn)格式與播放器兼容。

          請(qǐng)確保在使用網(wǎng)絡(luò)爬蟲時(shí)尊重網(wǎng)站的robots.txt文件,不要對(duì)網(wǎng)站服務(wù)器造成過大的負(fù)擔(dān),遵守道德和法律規(guī)定。


          主站蜘蛛池模板: 久久人妻无码一区二区| 天堂Av无码Av一区二区三区| 中文字幕一区在线播放| 亚洲国产欧美国产综合一区| 亚洲国产精品一区二区三区在线观看 | 精品日韩一区二区| 成人精品一区二区三区不卡免费看| 免费看无码自慰一区二区| 亚洲日韩AV一区二区三区四区| 国产一区二区三区在线2021| 国产伦精品一区二区三区视频金莲 | 国产精品一区二区毛卡片| 3d动漫精品啪啪一区二区免费 | 久久亚洲日韩精品一区二区三区| 色婷婷AV一区二区三区浪潮| 亚洲AV日韩精品一区二区三区| 高清无码一区二区在线观看吞精| 日韩视频免费一区二区三区| 精品国产福利在线观看一区| 天堂一区人妻无码| 成人h动漫精品一区二区无码| 国产福利一区二区三区| 亚洲午夜精品一区二区麻豆| 亚洲av无码一区二区三区四区| 无码人妻一区二区三区一| 亚洲日韩中文字幕无码一区| 亚洲日韩国产一区二区三区在线| 成人一区专区在线观看| 波多野结衣在线观看一区二区三区 | 一区二区三区四区视频在线| 日本精品夜色视频一区二区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 精品一区精品二区制服| 亚洲欧美日韩一区二区三区 | 亚洲一区二区三区免费| 一区二区三区无码高清| 日本精品高清一区二区| 国产成人久久精品区一区二区| 日韩成人无码一区二区三区| 国产一区二区影院| 好看的电影网站亚洲一区|