<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          寫了個(gè)爬蟲(chóng)把B站彈幕分析了一通。。。

          共 10935字,需瀏覽 22分鐘

           ·

          2020-08-06 05:13

          點(diǎn)擊上方數(shù)據(jù)管道”,選擇“置頂星標(biāo)”公眾號(hào)

          干貨福利,第一時(shí)間送達(dá)




          1


          前言

          眾所周知,B 站是一個(gè)學(xué)習(xí)網(wǎng)站。

          「里面的人,個(gè)個(gè)都是人才,說(shuō)話又好聽(tīng),超喜歡那里的。」

          B 站里有很多寶藏 UP 主,視頻質(zhì)量非常高。

          想要下載 B 站視頻,保存到硬盤里慢慢「學(xué)習(xí)」,那本文的 B 站視頻下載教程可以幫到你。

          沒(méi)有彈幕的 B 站視頻是沒(méi)有靈魂的,彈幕當(dāng)然也不能少。

          B 站視頻 + 彈幕下載,Let`s go!

          爬 B 站視頻和彈幕,會(huì)有新的挑戰(zhàn),本文會(huì)講解一些你可能不知道的新思路。

          2


          手工耿

          「刑部尚書(shū)」手工耿,以他奇思妙想的「刑具」而著稱。

          自制夫妻分分合合床,自制倒立洗頭機(jī),自制不銹鋼 AK47 鍵盤,這都什么「妖魔鬼怪」。


          今天就以他為例,下載他的所有視頻和彈幕。

          保存到硬盤,以備后續(xù)「深入學(xué)習(xí)」。

          會(huì)了本文的方法,找一些收藏家?UP 主下載些小視頻也就都不成問(wèn)題了。

          3


          視頻鏈接

          首先看下手工耿的個(gè)人空間。

          地址:
          https://space.bilibili.com/280793434


          點(diǎn)擊更多,打開(kāi)他的全部視頻。

          查看請(qǐng)求,不難發(fā)現(xiàn),視頻鏈接是通過(guò)一個(gè)接口獲得的。


          這個(gè) API 接口是這樣的:

          https://api.bilibili.com/x/space/arc/search?mid=280793434&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp

          后面都 keyword 參數(shù)都是無(wú)用,我們直接看前面。

          https://api.bilibili.com/x/space/arc/search?mid=280793434&ps=30&tid=0&pn=1

          mid 就是用戶的一種 id,可以通過(guò)用戶首頁(yè)獲取這個(gè) mid。

          https://space.bilibili.com/280793434

          ps 是當(dāng)前也加載視頻的格式。

          tid 一直為 0 即可。

          pn 是翻頁(yè)。

          知道這些,就可以直接寫代碼,獲取所有視頻的鏈接了。

          # -*-coding:utf-8 -*-# Website: https://cuijiahua.com# Author: Jack Cui# Date: 2020.07.22import requestsimport jsonimport math
          space_url = 'https://space.bilibili.com/280793434'search_url = 'https://api.bilibili.com/x/space/arc/search'mid = space_url.split('/')[-1]sess = requests.Session()search_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': 'application/json, text/plain, */*'}
          # 獲取視頻個(gè)數(shù)ps = 1pn = 1search_params = {'mid': mid, 'ps': ps, 'tid': 0, 'pn': pn}req = sess.get(url=search_url, headers=search_headers, params=search_params, verify=False)info = json.loads(req.text)video_count = info['data']['page']['count']
          ps = 10page = math.ceil(video_count/ps)videos_list = []for pn in range(1, page+1): search_params = {'mid': mid, 'ps': ps, 'tid': 0, 'pn': pn} req = sess.get(url=search_url, headers=search_headers, params=search_params, verify=False) info = json.loads(req.text) vlist = info['data']['list']['vlist'] for video in vlist: title = video['title'] bvid = video['bvid'] vurl = 'https://www.bilibili.com/video/' + bvid videos_list.append([title, vurl])print('共 %d 個(gè)視頻' % len(videos_list))for video in videos_list: print(video[0] + ':' + video[1])

          運(yùn)行結(jié)果:


          4


          視頻和彈幕下載

          有了鏈接,接下來(lái)就可以下載視頻了。

          使用 you-get 這類工具下載 B 站視頻,時(shí)常會(huì)抽風(fēng)下載失敗,很不穩(wěn)定,有的視頻鏈接還無(wú)法解析,問(wèn)題很多。

          自己解析視頻的成本又高,因?yàn)榫W(wǎng)站可能會(huì)時(shí)常更新,那就得總改代碼。

          這回,咱換一個(gè)方法,使用別人搭建好的 B 站視頻解析服務(wù),抓包分析提供解析服務(wù)的網(wǎng)站,將視頻解析的任務(wù)交給它們處理。

          經(jīng)過(guò)我精挑細(xì)選,找到了一個(gè)既穩(wěn)定又快速的 B 站視頻解析服務(wù)網(wǎng)站。

          咱們直接拿解析好的視頻地址下載即可。

          # -*-coding:utf-8 -*-# Website: https://cuijiahua.com# Author: Jack Cui# Date: 2020.07.22import requestsimport jsonimport re
          from bs4 import BeautifulSoup
          def get_download_url(arcurl): # 微信搜索 JackCui-AI 關(guān)注公眾號(hào),后臺(tái)回復(fù)「B 站」獲取視頻解析地址 jiexi_url = 'xxx' payload = {'url': arcurl} jiexi_req = requests.get(jiexi_url, params=payload) jiexi_bf = BeautifulSoup(jiexi_req.text) jiexi_dn_url = jiexi_bf.iframe.get('src') dn_req = requests.get(jiexi_dn_url) dn_bf = BeautifulSoup(dn_req.text) video_script = dn_bf.find('script',src = None) DPlayer = str(video_script.string) download_url = re.findall('\'(http[s]?:(?:[a-zA-Z]|[0-9]|[$-_@.&~+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)\'', DPlayer)[0] download_url = download_url.replace('\\', '') return download_url
          download_url = get_download_url('https://www.bilibili.com/video/BV1Ya4y1a7DC')print(download_url)

          jiexi_url 地址進(jìn)行了隱藏,想要使用這個(gè)解析服務(wù)的地址,關(guān)注我的微信公眾號(hào),后臺(tái)回復(fù)「B 站」獲取。

          這是為了防止這個(gè) B 站視頻解析服務(wù)網(wǎng)站被濫用,我對(duì)其進(jìn)行了一些限制。

          這種 API 的一種特點(diǎn)就是,知道的人越多它失效的也就越快

          希望這樣,它可以活得久一點(diǎn)。


          可以看到,視頻順利解析。

          這個(gè)視頻解析網(wǎng)站,抓包分析也很簡(jiǎn)單,就是通過(guò) GET 請(qǐng)求,設(shè)置 url 參數(shù),然后進(jìn)行解析。

          解析的 url 通過(guò)正則表達(dá)式匹配。

          視頻下載地址獲取到了,那怎么下載視頻的彈幕呢?

          打開(kāi)視頻頁(yè)面,抓包分析。

          URL:
          https://www.bilibili.com/video/BV1Ya4y1a7DC

          這個(gè)是 PC 端的鏈接,打開(kāi)這個(gè)視頻,你可能花費(fèi)九牛二虎之力,也找不到彈幕是怎么加載的。

          B 站是怎么實(shí)現(xiàn)的,我們不清楚。

          但是我們可以換個(gè)思路去嘗試摸索,沒(méi)準(zhǔn)有意外收獲。

          記住,這也是一種常規(guī)的爬蟲(chóng)分析思路

          我們將 URL 修改為移動(dòng)端的鏈接:

          URL:
          https://m.bilibili.com/video/BV1Ya4y1a7DC

          可以看到,鏈接中的 www 改為了 m。

          一個(gè)網(wǎng)站,有「 PC端」頁(yè)面,也可能還有「?移動(dòng)端」頁(yè)面。

          而「?移動(dòng)端」頁(yè)面,往往會(huì)因?yàn)橐恍┰颍浕蛘邽榱诉m配,而沒(méi)有「 PC端」健壯。

          這就有機(jī)可乘


          使用 Chrome 瀏覽器,可以直接開(kāi)啟移動(dòng)端模式。這回再刷新頁(yè)面,我們就能輕松找到視頻彈幕的加載地址了。

          甚至,「 移動(dòng)端」頁(yè)面還會(huì)返回視頻的真實(shí)地址


          瞧,視頻的下載地址就這么輕易的拿到了。

          不過(guò),為啥本文沒(méi)用這種方法呢?

          因?yàn)檫@個(gè)是移動(dòng)端的視頻,視頻清晰度是有限的。

          如果對(duì)視頻清晰度要求不高,倒是可以用這種方法下載視頻。

          我們?cè)倏催@個(gè)視頻彈幕怎么下載。

          視頻彈幕接口:

          https://api.bilibili.com/x/v1/dm/list.so?oid=213419373

          可以看到,只有一個(gè)參數(shù) oid。

          oid 可以通過(guò),解析后的視頻下載地址獲得。

          # -*-coding:utf-8 -*-# Website: https://cuijiahua.com# Author: Jack Cui# Date: 2020.07.22import requestsimport xml2assimport timefrom contextlib import closingfilename = '自制夫妻分分合合床'danmu_name = filename + '.xml'danmu_ass = filename + '.ass'download_url = 'https://upos-sz-mirrorhw.bilivideo.com/upgcxcode/73/93/213419373/213419373-1-208.mp4?e=ig8euxZM2rNcNbh3hzdVhwdlhz4zhwdVhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1595414435&gen=playurl&os=hwbv&oi=837395164&trid=e936c792a83d4305b722c6a81a40c2f5T&platform=html5&upsig=f60cec742f9f6d3d9bbbf2b3d7cb3db3&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=580104086&orderid=0,1&logo=80000000'oid = download_url.split('/')[6]danmu_url = 'https://api.bilibili.com/x/v1/dm/list.so?oid={}'.format(oid)print(danmu_url)sess = requests.Session()danmu_header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36',                'Accept': '*/*',                'Accept-Encoding': 'gzip, deflate, br',                'Accept-Language': 'zh-CN,zh;q=0.9'}with closing(sess.get(danmu_url, headers=danmu_header, stream=True, verify=False)) as response:      if response.status_code == 200:        with open(danmu_name, 'wb') as file:            for data in response.iter_content():                file.write(data)                file.flush()    else:        print('鏈接異常')time.sleep(0.5)xml2ass.Danmaku2ASS(danmu_name, danmu_ass, 1280, 720)

          這里用到了一個(gè) xml2ass ,這個(gè)是一個(gè) xml轉(zhuǎn) ass 封裝好的函數(shù),直接用即可,其實(shí)就是變了一下文本格式。

          xml2ass.py 文件地址:
          https://github.com/Jack-Cherish/python-spider/blob/master/2020/bilibili/xml2ass.py

          運(yùn)行結(jié)果:


          生成一個(gè) ass 文件和 xml 文件。

          ass 彈幕文件就是本地視頻播放可以用的彈幕文件。

          5


          迅雷下載

          對(duì)于視頻下載,除了曾經(jīng)寫過(guò)的 requests、urlretrieve 方法,其實(shí)可以外接迅雷。

          這么做的好處是,下載更穩(wěn)定,可以批量提交給迅雷任務(wù),下載速度也更快。

          總而言之,更快更強(qiáng)。

          ?

          程序調(diào)用迅雷下載,需要將迅雷設(shè)置為一鍵下載



          此外,再將迅雷下載目錄改為,我們的工程目錄,并將「自動(dòng)修改為上次使用的目錄」去掉。



          運(yùn)行如下代碼:

          import osimport timefrom win32com.client import Dispatchdef addTasktoXunlei(down_url):    flag = False    o = Dispatch('ThunderAgent.Agent64.1')    try:        o.AddTask(down_url, "", "", "", "", -1, 0, 5)        o.CommitTasks()        flag = True    except Exception:        print(Exception.message)        print(" AddTask is fail!")    return flagaddTasktoXunlei('ftp://b:[email protected]:8206/[電影天堂www.dy2018.com]戰(zhàn)狼BD國(guó)語(yǔ)中字.rmvb')

          如果配置沒(méi)錯(cuò)的話,那么程序會(huì)自動(dòng)調(diào)用迅雷,下載視頻。


          可以看到,運(yùn)行左邊程序,可以給迅雷添加下載任務(wù)。


          6


          起飛

          現(xiàn)在將所有功能模塊整合到一起,開(kāi)始下載手工耿的所有視頻吧!

          # -*-coding:utf-8 -*-# Website: https://cuijiahua.com# Author: Jack Cui# Date: 2020.07.22import requestsimport jsonimport reimport jsonimport mathimport xml2assimport timefrom contextlib import closing
          from bs4 import BeautifulSoup
          import osfrom win32com.client import Dispatch
          def addTasktoXunlei(down_url): flag = False o = Dispatch('ThunderAgent.Agent64.1') try: o.AddTask(down_url, "", "", "", "", -1, 0, 5) o.CommitTasks() flag = True except Exception: print(Exception.message) print(" AddTask is fail!") return flag
          def get_download_url(arcurl): # 微信搜索 JackCui-AI 關(guān)注公眾號(hào),后臺(tái)回復(fù)「B 站」獲取視頻解析地址 jiexi_url = 'xxx' payload = {'url': arcurl} jiexi_req = requests.get(jiexi_url, params=payload) jiexi_bf = BeautifulSoup(jiexi_req.text) jiexi_dn_url = jiexi_bf.iframe.get('src') dn_req = requests.get(jiexi_dn_url) dn_bf = BeautifulSoup(dn_req.text) video_script = dn_bf.find('script',src = None) DPlayer = str(video_script.string) download_url = re.findall('\'(http[s]?:(?:[a-zA-Z]|[0-9]|[$-_@.&~+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)\'', DPlayer)[0] download_url = download_url.replace('\\', '') return download_url
          space_url = 'https://space.bilibili.com/280793434'search_url = 'https://api.bilibili.com/x/space/arc/search'mid = space_url.split('/')[-1]sess = requests.Session()search_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': 'application/json, text/plain, */*'}
          # 獲取視頻個(gè)數(shù)ps = 1pn = 1search_params = {'mid': mid, 'ps': ps, 'tid': 0, 'pn': pn}req = sess.get(url=search_url, headers=search_headers, params=search_params, verify=False)info = json.loads(req.text)video_count = info['data']['page']['count']
          ps = 10page = math.ceil(video_count/ps)videos_list = []for pn in range(1, page+1): search_params = {'mid': mid, 'ps': ps, 'tid': 0, 'pn': pn} req = sess.get(url=search_url, headers=search_headers, params=search_params, verify=False) info = json.loads(req.text) vlist = info['data']['list']['vlist'] for video in vlist: title = video['title'] bvid = video['bvid'] vurl = 'https://www.bilibili.com/video/' + bvid videos_list.append([title, vurl])print('共 %d 個(gè)視頻' % len(videos_list))all_video = {}# 下載前 10 個(gè)視頻for video in videos_list[:10]: download_url = get_download_url(video[1]) print(video[0] + ':' + download_url) # 記錄視頻名字 xunlei_video_name = download_url.split('?')[0].split('/')[-1] filename = video[0] for c in u'′☆?\/:*?"<>| ': filename = filename.replace(c, '') save_video_name = filename + '.mp4' all_video[xunlei_video_name] = save_video_name
          addTasktoXunlei(download_url) # 彈幕下載 danmu_name = filename + '.xml' danmu_ass = filename + '.ass' oid = download_url.split('/')[6] danmu_url = 'https://api.bilibili.com/x/v1/dm/list.so?oid={}'.format(oid) danmu_header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9'} with closing(sess.get(danmu_url, headers=danmu_header, stream=True, verify=False)) as response: if response.status_code == 200: with open(danmu_name, 'wb') as file: for data in response.iter_content(): file.write(data) file.flush() else: print('鏈接異常') time.sleep(0.5) xml2ass.Danmaku2ASS(danmu_name, danmu_ass, 1280, 720)# 視頻重命名for key, item in all_video.items(): while key not in os.listdir('./'): time.sleep(1) os.rename(key, item)

          這里下載的是前 10 個(gè)視頻,想下載全部視頻,可以將 videos_list[:10] 改為 videos_list。

          幾分鐘,就可以運(yùn)行完畢,迅雷幾兆/秒的下載速度可不是蓋的。


          使用 PotPlayer 這類支持彈幕的播放器打開(kāi)視頻,即可自動(dòng)加載彈幕,播放視頻。


          真香!

          7


          最后


          使用迅雷下載,速度飛起。用本文的方法,爬 B 站視頻,就很舒服。


          代碼、教程僅限于學(xué)習(xí)交流,請(qǐng)勿用于任何商業(yè)用途!

          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久精品2019中文字幕人妻欧 | 香蕉视频日韩成人网 | 亚洲人成人网站色 | 亚洲永久免费黄色电影 | 大香蕉免费中文 |