項目:爬蟲B站視頻排行榜熱度,並數據可視化html
摘要
該實驗主要是用python編寫爬蟲代碼,把爬取到的數據進行整理,上傳到flourish網站,進行數據最後的可視化。本次實現的是爬取B站的天天視頻排行榜的前100名(根據綜合評分爲標準,非播放量),生成xls文件後整理並生成動態統計圖的視頻進行賽跑比較。python
1.引言
該論文是在疫情期間,python網課的最後一個考覈實驗,是驗收一學期下來所累積的python知識的成果,因爲最後選題方向依然是爬蟲項目,沒有考慮遊戲等模塊知識,還沒有涉及到更加深的爬蟲技術。實現爬蟲的數據可視化的來源是平時逛B站時碰見的一些播放量排行榜比較的視頻,比較感興趣,後學習python才發現能夠用爬蟲技術實現部分效果,固然Java也能夠。爲了實現數據可視化功能,根據天天不一樣的數據咱們能夠實現條形圖的比賽。瀏覽器
2.系統結構
整個系統採用了python的爬蟲技術,首先簡單介紹一下什麼是爬蟲技術呢?若是咱們把互聯網比做一張大的蜘蛛網,那一臺計算機上的數據即是蜘蛛網上的一個獵物,而爬蟲程序就是一隻小蜘蛛,沿着蜘蛛網抓取本身想要的獵物/數據。爬蟲是向網站發起請求,獲取資源後分析並提取有用數據的程序。而爬蟲後獲得的各類不一樣的有用的數據,爲了研究或者美觀效果,要進行數據的可視化,這就是數據的處理方式。我把系統簡單的分爲以下幾個步驟:
服務器
該程序引進了python的四個模塊,分別爲:
(1) os模塊;該模塊就是對操做系統進行操做,使用該模塊必須先導入模塊
(2) requests模塊;在python內置模塊的基礎上進行了高度的封裝,從而使得python進行網絡請求時,變得人性化,使用Requests能夠垂手可得的完成瀏覽器可有的任何操做。
(3) xlwt模塊;該模塊實現對excel文件的寫入,程序用到excel文件時要用到的模塊,它並非自帶的,須要自行安裝,命令:python -m pip install xlwt
(4) 解析庫lxml,lxml是python的一個解析庫,支持HTML和XML的解析,支持XPath解析方式,並且解析效率很是高。安裝命令:python -m pip install lxml
咱們在瀏覽器中輸入一個網址,敲擊回車,看到網站的頁面信息。這就是瀏覽器請求了網站的服務器,獲取到網絡資源。那麼,爬蟲也至關於模擬瀏覽器發送請求,得到到HTML代碼。HTML代碼裏一般包含了標籤和文字信息,咱們就從中提取到咱們想要的信息。一般爬蟲是從某個網站的某個頁面開始,爬取這個頁面的內容,找到網頁中的其餘連接地址,而後從這個地址爬到下一個頁面,這樣一直不停的爬下去,進去批量的抓取信息。那麼,咱們能夠看出網絡爬蟲就是一個不停爬取網頁抓取信息的程序。這方面不懂的須要去簡單學習網頁的構成,一些hmtl知識即可解決問題。
網絡
3.實現代碼
(1) 首先,導入4個程序須要用到的模塊或庫架構
import os import requests import xlwt from lxml import html
(2) 經過爬蟲嗶哩嗶哩的網頁,提取咱們想要的信息。(按F12)
url表明嗶哩嗶哩的網址,requests.get(url)是向服務器請求網頁資源。以後經過查找一層一層標籤下的目的標籤返回一個值,再去遍歷這個值。
app
def bug(key_once): url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3' #得到一個網頁最簡單直接的方法就是 r = requests.get(url) ,向服務器請求資源。 response = requests.get(url).text #response.text返回的是Unicode格式,http響應內容的字符串形式,url對應的頁面內容 l = html.fromstring(response) #html.fromstring 會解析html 頭部中charset屬性,而且自動的decode #下面咱們使用相對路徑,查找一下相對路徑下li標籤下的div標籤下的class="rank-item",class=content屬性的值 matter = l.xpath('//li[@class="rank-item"]/div[@class="content"]/div[@class="info"]') rank = 0 #一開始排名爲0 #Python join() 方法用於將序列中的元素以指定的字符鏈接生成一個新的字符串。 for item in matter: #for循環遍歷matter rank += 1 #排名+1 topic = "".join(item.xpath('./a/text()')).replace('"','') #split():拆分字符串。經過指定分隔符對字符串進行切片,並返回分割後的字符串列表(list) playinfo = "".join(item.xpath('./div[@class="detail"]/span/text()')).split("萬") play = playinfo[0] + "萬" up = "".join(item.xpath('./div[@class="detail"]/a/span/text()')) hot = "".join(item.xpath('./div[@class="pts"]/div/text()')) key_once.append({ #在video_list.append列表末尾添加新的對象 'rank': rank, #排名 'topic': topic, #題目 'play': play, #播放量 'up': up, #up名 'hot': hot #熱度 }) return key_once
(3) 將爬取到的數據寫入Excel表格當中
首先用xlwt.Workbook()建立一個workbook,用.add_sheet建立一個名字爲「b站視頻排行榜前100」的sheet。用.write把sheet的表頭順序寫爲’標題’, ‘up主’,‘綜合熱度’,‘播放量’, ‘排名’。能夠設置字體的樣式,和行列的寬度高度,具體的語句百度不少。最後用workbook.save保存文件。
ide
def importance(key_once): workbook = xlwt.Workbook() # 定義、建立一個workbook table = workbook.add_sheet('b站視頻排行榜前100') # 添加、建立一個sheet al = xlwt.XFStyle() # 初始化樣式 al.horz = 0x02 # 爲樣式建立字體,設置字體水平居中 al.vert = 0x01 # 設置字體垂直居中 head = ['標題', 'up主','綜合熱度','播放量', '排名'] # 表頭 for y in range(len(head)): table.write(0, y, head[y],al) # 把表頭寫到Excel裏面去 參數對應行,列,值,(格式) i = 1 for item in key_once: # 設置第1、二行的寬度 first_col=table.col(0) sec_col= table.col(1) first_col.width=256*40 sec_col.width=256*25 table.write(i, 0, item['topic'],al) table.write(i, 1, item['up'], al) table.write(i, 2, item['hot'], al) table.write(i, 3, item['play'], al) table.write(i, 4, item['rank'], al) i += 1 # 若是文件存在,則將其刪除 if os.path.exists('C:/python/b站視頻排行榜前100.xls'): os.remove('C:/python/b站視頻排行榜前100.xls') workbook.save('C:/python/b站視頻排行榜前100.xls') #保存excel文件的路徑 print("生成的文件位於:C:/python/b站視頻排行榜前100.xls") if __name__ == '__main__': #調用前面兩個函數 key_once = [] importance(bug(key_once))
(4) 把導出的excel文件進行整合
(5) 整合好時間線的文件另存爲csv文件,接着上傳到flourish網站的Bar chart race模式。
(6) 可在右側合理調整統計圖的樣式,最後生成動態統計圖。
函數
4.實驗
(1) 運行成功界面
(2) 獲得咱們想要的數據文件
學習
(3) 整合幾天的數據(這裏因爲沒有預判到數據的時間差,只有兩天,對比不是特別明顯),像一些up主作一些國內國外的疫情動態統計圖或者地圖,比較有好的觀看體驗,可是獲取數據有點麻煩,數據多的狀況下須要用python寫一個整合的代碼比較方便,就不爬了~~
(4) 在flourish網站上直接導入整合好的csv文件,生成動態統計圖。Flourish是款很方便的「動態數據圖」製做軟件,在國外可以直接訪問,可是須要用到google服務器。(不會用的小夥伴自行百度啦)
5.總結和展望
爬蟲技術說簡單也很簡單,說難也能夠很深水,在爬蟲以前我先學習了一些html,對網頁的構成元素有必定的瞭解,知道標籤的運用。整個實驗過程當中,最不足的是不瞭解一些函數和方法的使用。有時候是先想着這個功能該怎麼實現,再去查找實現的辦法才學會這個函數或方法。