前言
我,一個天天起牀,睡前必刷B站的菜雞程序猿,昨天看到一位關注的程序猿up主發佈的動態,心裏很不好受,所以纔想着做這次的內容
到底程序猿up主做什麼類型的視頻纔會受大衆喜歡呢?
不想看文字就點擊圖片去看B站我的視頻吧,之前好像可以直接導入視頻的,現在iframe不知道爲什麼失效了
開始動手
1.首先需要去採集數據
選擇到搜索去搜程序猿,然後選擇視頻,彈幕最多(也就是真實觀看的人比較多),去得到每一個視頻的鏈接。
這樣我們就先得到每個視頻對應的詳情頁鏈接,然後再從詳情頁用xpath去得到標題,up名,up主頁等信息(在這個頁面直接得到視頻點贊數和播放數最後保存的結果是異常值),點贊數和播放數用api去得到。
api只需要視頻的id就可以返回相應的json結果,所以得到也是比較方便的,最後保存到csv文件。
爬蟲代碼:
import requests
from lxml import etree
import time
import pandas as pd
import re
import json
#https://search.bilibili.com/video?keyword=%E7%A8%8B%E5%BA%8F%E7%8C%BF&order=dm&duration=0&tids_1=36&tids_2=122&page=32
def get_html(url,header):
html=requests.get(url,headers=header).text
return html
def get_all_page(n):
urls=[]
for i in range(1,n+1):
url=f"https://search.bilibili.com/video?keyword=%E7%A8%8B%E5%BA%8F%E7%8C%BF&order=dm&duration=0&tids_1=36&tids_2=122&page={i}"
html=get_html(url,headers)
selector = etree.HTML(html)
li_list=selector.xpath("//ul[@class='video-list clearfix']")
for li in li_list:
urls.extend(li.xpath("//li[@class='video-item matrix']/a/@href"))
return urls
def get_information(urls,avid):
space_url=[]
name_list=[]
views_list=[]
dz_list=[]
video_names=[]
count=0
for url in urls:
count+=1
if count==10:
time.sleep(1)
url=url.replace('//','https://')
print("正在爬取:",url)
html=get_html(url,headers1)
selector = etree.HTML(html)
space_url.append(selector.xpath("//div[@class='name']/a[1]/@href")[0])
name_list.append(selector.xpath("//div[@class='name']/a[1]/text()")[0])
video_names.append(selector.xpath("//h1/@title")[0])
# views_list.append(selector.xpath("//div[@class='video-data']/span[1]/text()")[0])
# dz_list.append(selector.xpath("//div[@class='ops']/span[1]/text()")[0])
for id in avid:
base_url="https://api.bilibili.com/x/web-interface/view?aid="
html=get_html(base_url+id,headers2)
res=json.loads(html)
video_info = res['data']
views_list.append(video_info["stat"]["view"])
dz_list.append(video_info["stat"]["like"])
return space_url,name_list,views_list,dz_list,video_names
def save(n):
urls=get_all_page(n)
avid=[]
for i in urls:
avid.append(re.findall("\d+",i)[0])
space_url,name_list,views_list,dz_list,video_names=get_information(urls,avid)
data=pd.DataFrame({"空間鏈接":space_url,"up主":name_list,"視頻名":video_names,"視頻播放次數":views_list,"視頻點贊數":dz_list})
data.to_csv('./B站程序猿up主視頻信息.csv',encoding='utf8')
print("所有數據爬取完畢")
if __name__ == '__main__':
headers = {
'Host': 'search.bilibili.com',
'Referer': 'https//www.bilibili.com/',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
headers1 = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
'Host': 'www.bilibili.com',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive'
}
headers2={
'Host': 'api.bilibili.com',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 79.0.3945 .130Safari / 537.36'
}
n=int(input("請輸入想要爬取的頁數:"))
save(n)
我爬取了十頁,一共200條數據
2.開始數據分析
基本的導庫和導入數據,並且重命名列名
然後對數據清洗和預處理,查看缺失值異常值。但是由於B站數據比較友好,沒有異常缺失值。
然後分組分析點贊數多的up和播放數多的up
這一部分用groupby很簡單就實現了,所以只上對點讚的分析繪圖代碼
# 找到視頻點贊數最多的up主
most_dz=data.groupby(by=data['up主名'],as_index=False)['視頻點贊數'].sum()
most_dz.columns=['up主名','視頻點贊總數']
most_dz.head()
#降序排序
most_dz=most_dz.sort_values(by=['視頻點贊總數'],ascending=False)
most_dz.head(10)
# 可視化點贊數前20的up主
plt.figure(figsize=(13,10))
sns.barplot(most_dz['up主名'][:20],most_dz['視頻點贊總數'][:20])
plt.title('程序猿up主視頻點贊總數前20', fontsize=22)
plt.grid()
plt.xticks(rotation=90)
plt.show()
3.查看各圖中第一的視頻類型
我發現迷糊老師出的視頻涉及到編程的比較少,大多是涉及到日常電腦使用高階操作的視頻。看來我以後要是想點贊數多應該少出點涉及到編程的,多出點能讓觀衆日常使用到的視頻 畢竟編程類教學視頻都是被埋在收藏夾裏了,我的收藏夾裏都有一大堆
納尼,就只有一個視頻就737萬+的播放數,這也太強了吧。同時也說明還是有很多人還是願意在B站學習編程的,特別是python相關的視頻好像特別火
4.做個總結
總結:
-
在B站教學類視頻有很大概率會被放進收藏夾吃灰,所以程序猿up主們要抓住觀衆們的喜好來創作視頻,比如python系列的教學視頻就很受歡迎(原因也是python生態好,學起來簡單),或者是一些日常電腦高階操作的教學的視頻,這些都是比較容易吸引到觀衆的。
-
從親愛的程序羊不能進入前20更能發現這個問題:程序羊的視頻質量是很高的,但是受用羣體不大,因爲他的視頻幾乎都是講程序猿的修煉,沒太多簡單易學的,相反大多都是程序猿們覺得很有意義,但是圈外人聽着一臉懵,根本就像聽天書一樣的。哈哈,不過對於我們這些程序猿來說這樣的up主簡直就是寶藏up,也正是因爲他選擇講對程序猿最有益的一些內容,放棄一些其他利益,這也才能讓我們學到更多更好的知識。
-
再來看看一些出發點不同的程序猿up,比如張大米的日常。他能有這麼高觀看數和點贊數的原因就是他的視頻既兼顧了程序猿,利用程序猿的梗可以給我們帶來歡樂,同時也照顧了其他羣體,從一些不那麼深奧的計算機知識出發,可以讓觀衆更瞭解程序猿的生活,而且每個視頻長度很短,符合現在短視頻的趨勢。
-
從這些榜單中不難發現我們熟悉的up,落拓、技術胖……其實這些up主們都在和我們分享自己的知識和一些想法感受。還有一些沒上榜,但是我想提到的up,七米老師、你腳下有坑、菜菜、棋子、哲的王、很久很久之前的.net大神Anduin……他們有的也許還沒有很火,也許有的因爲環境、評論各種因素導致離開,但是他們的視頻我覺得是用心製作的。七米老師和哲的王講go語言相關的視頻、菜菜的數據分析,機器學習、棋子之前每天一更的python知識短視頻、還有講算法的踩坑大師,上面這些up們能讓我收穫越來越多的知識,所以這也是我愛刷B站的重要原因。雖然不知道爲什麼棋子斷更這麼久,但是還是希望他能早點回來更新python一分鐘小知識的。
最後
通過上面的分析我們知道吸引人的視頻大多有幾個特點:
1.受衆面廣
2.搞笑輕鬆
3.主要是以短視頻爲主
4.熱門且簡單易學的技術類視頻也很受歡迎(比如python)
但是我們也需要那些發佈有意義視頻或者教學視頻的up,這些才更有助於我們提高。
當然,這些分析只是表面,我們可以更加深挖,比如再去爬取得到受歡迎up主們視頻的長度、所在分區、簡介、視頻彈幕……,從視頻時間長短、文本情感分析等更多角度出發分析,去找到那些影響力最大的因素。
注意,這些數據和圖標不能反映最真實的信息,因爲我只爬取了前十頁,並且其中還有一些與程序猿無關的內容也會被搜索到導致數據有干擾,所以只是用數據以及加上我對這些up主一直以來的關注做出的分析總結,不能完全符合事實,只是提出一些想法和建議。