思路:用requests庫獲取對應頁面的源碼,用beautifulSoup庫篩選出想要的信息,再用matplotlib庫實現數據可視化。
下面直接呈現源碼:
import requests
from bs4 import BeautifulSoup
from matplotlib import pyplot as plt
from matplotlib import font_manager
allUniv = []
x = []
y = []
#獲取指定網址的頁面源碼
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = 'utf-8'
return r.text
except:
return ""
#篩選出網頁中《td》標籤中的信息,並存放到列表allUniv中
def fillUnivList(soup):
data = soup.find_all('tr')#data類型是bs4.element.ResultSet
for tr in data:
# print(tr)
ltd = tr.find_all('td')#類型是bs4.element.ResultSet
if len(ltd)==0:
continue
singleUniv = []
for td in ltd:
# print(td.string)
singleUniv.append(td.string)
allUniv.append(singleUniv)
#控制檯打印結果
def printUnivList(num):
print("{:<6}{:<30}{:<40}{:<8}".format("年度排名","歷史排名","電影名稱","上映年份"))
for i in range(num):
u=allUniv[i]
print("{:<6}{:<30}{:<40}{:<8}".format(u[0],u[1],u[2],u[6]))
#將電影名稱,歷史排名放到x,y列表
def fix(num):
for i in range(num):
u = allUniv[i]
x.append(u[2])
y.append(u[1])
#將數據可視化
def draw():
my_font = font_manager.FontProperties(fname="C:/WINDOWS/Fonts/MSYH.ttc")
#設置圖片大小
plt.figure(figsize=(20, 15), dpi=80)
#畫柱狀圖
plt.bar(range(len(x)),y,width=0.3)
# plt.barh(range(len(x)), y, height=0.3)
#設置x軸刻度和字樣
plt.xticks(range(len(x)),x,fontproperties=my_font,rotation=70)
# 添加描述信息
plt.xlabel("電影名稱", fontproperties=my_font)
plt.ylabel("歷史排名", fontproperties=my_font)
plt.title("2020最火的電影排行", fontproperties=my_font)
# 繪製網格
plt.grid(alpha=0.3) # 裏面的第一個參數設置透明度
#展示
plt.show()
#調用上面的所有方法,實現爬取,顯示
def main():
url = 'http://58921.com/alltime/2020'
html = getHTMLText(url)
soup = BeautifulSoup(html, "html.parser")
fillUnivList(soup)
printUnivList(20)
fix(20)
draw()
if __name__ == '__main__':
main()
運行的效果如下: