溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用python爬蟲(chóng)怎么結(jié)合唧唧對(duì)Bilibili進(jìn)行爬取

發(fā)布時(shí)間:2020-12-01 15:12:07 來(lái)源:億速云 閱讀:191 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)使用python爬蟲(chóng)怎么結(jié)合唧唧對(duì)Bilibili進(jìn)行爬取,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

爬蟲(chóng)部分

1.依賴庫(kù)

requestsl

xml

2.代碼
相關(guān)講解已在注釋標(biāo)注。

'''
author:Ericam
description: 用于爬取b站視頻鏈接
'''
import requests
import re
from lxml import etree
import time

'''
該函數(shù)用于解析爬取的網(wǎng)頁(yè)。
提取出網(wǎng)頁(yè)里視頻的url鏈接以及對(duì)應(yīng)的視頻名。
'''
def getHref(url,page):
 try:
 req = requests.get(url,timeout=5,headers=headers)
 html = req.text
 data = etree.HTML(html)
 '''
 page-1://*[@id="all-list"]/div[1]/div[2]/ul[@class="video-list"]/li
 other://*[@id="all-list"]/div[1]/ul[@class="video-list"]/li
 '''
 pattern = '//*[@id="all-list"]/div[1]/div[2]/ul[contains(@class,"video-list")]/li' if page == 1 else '//*[@id="all-list"]/div[1]/ul[contains(@class,"video-list")]/li'
 vurlList = data.xpath(pattern)
 for li in vurlList:
  vurl = li.xpath(".//a/attribute::href")[0]
  title = li.xpath(".//a/attribute::title")[0]
  yield vurl,title
 except:
 print('第%d頁(yè)爬取失敗' % page)
 print('Unfortunitely -- An Unknow Error Happened, Please wait 3 seconds')
 time.sleep(3)

'''
該函數(shù)用于正則提取,將url內(nèi)的BV號(hào)提取出來(lái)
'''
def getBv(href):
 pattern = re.compile('(BV.*?)\?')
 data = re.search(pattern,href)
 if data == None:
 return ''
 return data.group(1)

if __name__ == "__main__":

 #頭部偽裝
 headers = {
 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
 }
 hrefList = []
 titleList = []
 #需要爬取多少頁(yè),自行進(jìn)行修改,本代碼測(cè)試1~2頁(yè)
 for i in range(1,3): 
 url = "https://search.bilibili.com/all?keyword=歪嘴戰(zhàn)神&page={0}".format(i) #修改keyword后的關(guān)鍵字即可
 l = getHref(url,i)
 for vurl,title in l:
  hrefList.append(vurl)
  titleList.append(title)
 print("第{0}頁(yè)爬取結(jié)束".format(i))
 time.sleep(2)
 
 print("---------------------------開(kāi)始截取BV號(hào)-----------------------------")
 for i in range(len(hrefList)):
 hrefList[i] = getBv(hrefList[i])
 with open("bv.txt",'w',encoding='utf-8') as f:
 for i in range(len(hrefList)): 
  f.write(hrefList[i]+"\t"+titleList[i]+"\n")
 print("爬取結(jié)束")

3.爬取結(jié)果

使用python爬蟲(chóng)怎么結(jié)合唧唧對(duì)Bilibili進(jìn)行爬取

唧唧下載視頻

給出唧唧的鏈接,唧唧,很好用的小工具。
我們只需要將剛才爬取好的鏈接放在一邊,不斷復(fù)制BV號(hào),然后唧唧進(jìn)行下載即可。

使用python爬蟲(chóng)怎么結(jié)合唧唧對(duì)Bilibili進(jìn)行爬取

視頻重命名

唧唧下載好的視頻如下所示:

使用python爬蟲(chóng)怎么結(jié)合唧唧對(duì)Bilibili進(jìn)行爬取

為什么需要將它們進(jìn)行改名呢,因?yàn)槿绻?dāng)視頻數(shù)量越來(lái)越多時(shí),比如幾千幾萬(wàn)時(shí),通過(guò)名字便會(huì)越來(lái)越難以管理,同時(shí)也難以進(jìn)行去重,很大概率會(huì)不斷下載重復(fù)的視頻。
在B站,BV號(hào)便是每個(gè)視頻的“身份證”(主鍵),因此用其進(jìn)行視頻命名可以方便日后管理,同時(shí)也方便進(jìn)行去重。

代碼

'''
author:Ericam
description: 用于將下載下來(lái)的b站視頻重命名,命名格式為bv號(hào)
'''
import os
import difflib

if __name__ == '__main__':
 
 bvpath = os.path.join("D:/","Coding","python","Python爬蟲(chóng)")
 os.chdir(bvpath)
 d = {}
 '''
 bvdownload.txt里存放bv號(hào)與title名
 若之前爬蟲(chóng)爬取了幾千個(gè),而唧唧只下載了幾百個(gè),便可以將這些已下載的bv和title復(fù)制到
 bvdownload.txt中,將已下載的視頻進(jìn)行改名
 '''
 with open("bvdownload.txt",'r',encoding='utf-8')as f:
 lines = f.readlines()
 for val in lines:
  val = val.strip("\n")
  data = val.split("\t")
  bv = data[0]
  title = data[1]
  d[title] = bv
 
 #視頻存放位置
 path = 'F:/bilibili視頻/'
 os.chdir(path)
 videoList = os.listdir()
 
 #開(kāi)始進(jìn)行模糊匹配
 for key in d:
 video = difflib.get_close_matches(key,videoList,1, cutoff=0.3)
 if len(video) == 0:
  continue
 video = video[0]
 #檢查視頻是否已存在,若存在則刪除視頻
 if os.path.isfile(d[key]+".mp4") and os.path.isfile(video):
  os.remove(video)
 else:
  if os.path.isfile(video):
  os.rename(video,d[key]+".mp4")
 print("重命名完成!")

結(jié)果演示

重命名完成的視頻列表如下:

使用python爬蟲(chóng)怎么結(jié)合唧唧對(duì)Bilibili進(jìn)行爬取

關(guān)于使用python爬蟲(chóng)怎么結(jié)合唧唧對(duì)Bilibili進(jìn)行爬取就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI