本篇為讀者投稿,還是來自帥鍋鍋,本篇稿費是400。 帥鍋鍋已連續投稿3篇啦,他的動手能力貌似不錯,目前在鄭州大學四年級,有看上的老闆可以聯絡我噢。
最近發現動態排名影片很火,看的我心癢癢,總想用 python 也做個微博熱搜排名動態變化影片,動態看到微博排名變化,好讓我那每天恨不得趴在微博熱搜排名變化上的女朋友從手機上解脫出來,經過一下午的實踐終於用 python 把這個影片做出來了,效果如下:
下面我將一步步詳細介紹實現過程。
總體大概分為2個過程:
第一步是定時採集微博熱搜排名資料;
第二步是用 matplotlib 畫出動態排名圖。
第一步:requests 模擬請求,定時採集微博熱搜排名資料
1.直接從網頁版微博下手,找到熱搜所在頁
2.開啟瀏覽器自帶流量分析工具,重新整理網頁,找到傳輸熱搜排名資料的 url
第一個就是哦,只要定時模擬向這個 url 請求,就會返回最新資料,非常簡單。
3. requests 模擬請求,要帶著自己的 cookie 值哦,否則是無法返回正確資料的。
4.解析返回網頁,取出微博熱搜內容、熱度值等資料
每條資料都存在這樣的資料結構中,用 BeautifulSoup 很輕易的就解析出來了
5.用 schedule 模組每1分鐘爬一次資料
其中 run 為爬取微博排名的程式。最後再存入表格中備用。
第二步:根據爬取用matplotlib.animation畫出動圖
1.先畫出一張簡單排名圖
首先用panda讀取第一步儲存在表格中的資料
傳入3個引數,第一個表格檔名,第二個是解碼方式(只有gbk格式可以,utf-8格式會出錯),第三個資料相當於給表格中的每列資料命名,例如我要取微博排名內容就可以用df[‘title’]表示,取熱度資訊可以用df[‘num’]表示。
然後將某時刻的微博排名資訊展示到直方圖中
效果如下
接著將熱搜內容和熱度按排名順序放置到直方圖中,將排名第一的內容放到圖的上端,再將時間戳放到右下角位置
ax.text的引數介紹,前2個表示x和用y座標,第3個表示要顯示的文字,size表示字型大小,color表示字型顏色,transform=ax.transAxe表示文字在圖片中的先對位置,還有其他引數,這裡沒有用到,感興趣的可以自行研究。
效果如下
2.渲染元素
首先設定x座標軸,給x軸座標刻度科學技術,然後將座標資料放置到頂端,接著設定整個座標軸可以縮放,以便後續動態展示資料,最後畫x軸網格虛線,並設定網格虛線在圖形後方展示
效果如下
設定y軸座標
效果如下
給柱狀圖設定顏色
給每個排名的柱形圖設定1個不同的顏色,效果如下:
3.用animation.FuncAnimation畫出動圖
第一張圖已經做好了,從上我們可以看出,我們是根據時間戳選擇資料的,上面的靜態圖是由1個時間戳的資料做出來的,想要圖形動起來,根據時間流動態展示資料,就要定期用時間戳來調動上述資料,這時就用到matplotlib.animation函式
draw是畫單張圖的程式組成的函式,frames是傳入的引數,interval是時間間隔,其中為了取出所有時間戳並保證順序不變,我加了個sortTime函式,這個很好實現。
微博排名動圖展示到此已經做完,還有很多可以最佳化的地方,主要是美觀渲染方面,感興趣的可以深入研究一下。
在猿人學Python公眾號後臺回覆:wb 有該篇文章完整程式碼。
繼續接受投稿中,300-500/篇。詳情可看這篇:
來透過寫技術文章掙錢
近期好文:
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***