爬取騰訊視頻熱播榜並處理分析
一:網絡爬蟲設計方案
爬蟲名稱:爬取騰訊視頻熱播榜並處理分析
爬取內容:熱播榜的影視劇名稱與對應的熱度
設計方案概述:
1.需要找到要爬取的網頁,使用F12查看源代碼,找到要爬取的數據
2.然后使用get請求和beautifulsoup
3.使用pandas進行數據可視化
4.使用matplotlib進行數據分析以及回歸方程的繪制
5.最后將數據持久化
技術難點:需要找到數據之間的對應關系並進行處理分析。
二
1.查看源代碼后發現該網頁為html結構
並且發現所需要的數據在以下標簽中
一
2.利用find_all函數進行遍歷查找的方式爬取
三:爬蟲程序設計
先把我們所需要的數據爬取下來
1 import requests 2 from bs4 import BeautifulSoup 3 import pandas as pd 4 import numpy as np 5 import scipy as sp 6 from numpy import genfromtxt 7 import matplotlib 8 from pandas import DataFrame 9 import matplotlib.pyplot as plt 10 from scipy.optimize import leastsq 11 import urllib.request as urlrequest 12 #導入相關庫 13 url='http://top.iqiyi.com/rebobang.html' 14 #搜索網址 15 headers={'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363'}#偽裝爬蟲 16 #偽裝爬蟲 17 r=requests.get(url) 18 #發送get請求 19 r.encoding=r.apparent_encoding 20 #統一編碼 21 t=r.text 22 soup=BeautifulSoup(t,'lxml') 23 #使用BeautifulSoup工具解析 24 title=[] 25 count=[] 26 #建立兩個空列表 27 for x in soup.find_all(class_="title-link"): 28 title.append(x.get_text().strip()) 29 for y in soup.find_all('span',class_="count"): 30 count.append(y.get_text().strip()) 31 #使用find_all函數進行遍歷查找 32 data=[title,count] 33 #把兩個列表收到data變量中 34 print(data) 35 #使用print函數打印
爬取的數據如下圖
使用pandas將其數據可視化
1 df=pd.DataFrame(data,index=["名稱","熱度"]) 2 #數據可視化 3 print(df.T) 4 rebo="D:/hotbo.xlsx" 5 df.T.to_excel(rebo)
進行數據清洗與處理:
1 #數據清洗 2 print('\n====各列是否有缺失值情況如下:====') 3 print(df.isnull()) 4 #統計空值情況 5 print(df.duplicated()) 6 #查找重復值 7 print(df.isna().head()) 8 #統計缺失值 # 得出結果為False則不為空值 9 print(df.describe()) 10 #描述數據
數據清洗的結果:
進行數據分析和可視化
1 file="D:/hotbo.xlsx" 2 chinese=matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc') 3 df=pd.read_excel(file,names=["rank","name","hot"]) 4 #使用read函數讀取excel文件 5 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] 6 #用來正常顯示中文 7 plt.rcParams['axes.unicode_minus']=False 8 #用來正常顯示負號 9 10 #畫散點圖 11 plt.scatter(df.name,df.hot,alpha=1) 12 #畫散點圖,名字為X軸,熱度為Y軸,大小為1 13 plt.title("影視劇名稱與熱度統計值") 14 #添加標題 15 plt.grid() 16 plt.show() 17 plt.savefig(fname="D:/影視劇名稱與熱度統計值.png",figsize=[10,10]) 18 #保存圖像 19 20 #畫直方圖 21 data=np.array(df.hot) 22 Names=df.name 23 s=pd.Series(data,Names) 24 s.name='影視劇名稱與熱度統計值' 25 s.plot(kind='bar',title='影視劇名稱與熱度統計值') 26 plt.grid() 27 plt.show() 28 plt.savefig(fname="D:/影視劇名稱與熱度統計值.jpg",figsize=[1,1]) 29 #保存到D盤
運行結果如下
畫散點圖和回歸直線方程
1 #畫一元二次回歸方程 2 chinese=matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc') 3 #調用中文 4 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] 5 plt.rcParams['axes.unicode_minus']=False 6 filename="D:/hotbo.xlsx" 7 colnames=["rank","name","hot"] 8 df=pd.read_excel(filename,skiprows=1,names=colnames) 9 X=df.rank 10 Y=df.hot 11 #確定x,y軸 12 def func(params,x): 13 a,b,c=params 14 return a*x*x+b*x+c 15 def error(params,x,y): 16 #設置誤差函數 17 return func(params,x)-y 18 p0=[1978,0] 19 def main(): 20 #主函數 21 plt.figure(figsize=(8,6)) 22 #畫布尺寸 23 p0=[1978,300,1] 24 Para=leastsq(error,p0,args=(X,Y)) 25 a,b,c=Para[0] 26 print("a=",a,"b=",b,"c=",c) 27 plt.scatter(X,Y,color="green",label="樣本數據",linewidth=2) 28 x=np.linspace(1,25,25) 29 y=a*x*x+b*x+c 30 plt.plot(x,y,color="red",label="擬合曲線",linewidth=2) 31 #畫擬合曲線 32 plt.legend() 33 plt.title("影視劇排名與熱度統計值") 34 plt.grid() 35 plt.show() 36 main() 37 plt.savefig(fname="D:/影視劇名稱與熱度統計值回歸方程.jpg",figsize=[1,1]) 38 #保存圖像
運行結果如下
代碼:
1 import requests 2 from bs4 import BeautifulSoup 3 import pandas as pd 4 import numpy as np 5 import scipy as sp 6 from numpy import genfromtxt 7 import matplotlib 8 from pandas import DataFrame 9 import matplotlib.pyplot as plt 10 from scipy.optimize import leastsq 11 import urllib.request as urlrequest 12 #導入相關庫 13 url='http://top.iqiyi.com/rebobang.html' 14 #搜索網址 15 headers={'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363'}#偽裝爬蟲 16 #偽裝爬蟲 17 r=requests.get(url) 18 #發送get請求 19 r.encoding=r.apparent_encoding 20 #統一編碼 21 t=r.text 22 soup=BeautifulSoup(t,'lxml') 23 #使用BeautifulSoup工具解析 24 title=[] 25 count=[] 26 #建立兩個空列表 27 for x in soup.find_all(class_="title-link"): 28 title.append(x.get_text().strip()) 29 for y in soup.find_all('span',class_="count"): 30 count.append(y.get_text().strip()) 31 #使用find_all函數進行遍歷查找 32 data=[title,count] 33 #把兩個列表收到data變量中 34 print(data) 35 #使用print函數打印 36 df=pd.DataFrame(data,index=["名稱","熱度"]) 37 #數據可視化 38 print(df.T) 39 rebo="D:/hotbo.xlsx" 40 df.T.to_excel(hotbo) 41 file="D:/hotbo.xlsx" 42 chinese=matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc') 43 df=pd.read_excel(file,names=["rank","name","hot"]) 44 #使用read函數讀取excel文件 45 df.head() 46 47 #數據清洗 48 print('\n====各列是否有缺失值情況如下:====') 49 print(df.isnull()) 50 #統計空值情況 51 print(df.duplicated()) 52 #查找重復值 53 print(df.isna().head()) 54 #統計缺失值 # 得出結果為False則不為空值 55 print(df.describe()) 56 #描述數據 57 58 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] 59 #用來正常顯示中文 60 plt.rcParams['axes.unicode_minus']=False 61 #用來正常顯示負號 62 63 #畫散點圖 64 plt.scatter(df.name,df.hot,alpha=1) 65 #畫散點圖,名字為X軸,熱度為Y軸,大小為1 66 plt.title("影視劇名稱與熱度統計值") 67 #添加標題 68 plt.grid() 69 plt.show() 70 plt.savefig(fname="D:/影視劇名稱與熱度統計值.png",figsize=[10,10]) 71 #保存圖像 72 73 #畫直方圖 74 data=np.array(df.hot) 75 Names=df.name 76 s=pd.Series(data,Names) 77 s.name='影視劇名稱與熱度統計值' 78 s.plot(kind='bar',title='影視劇名稱與熱度統計值') 79 plt.grid() 80 plt.show() 81 plt.savefig(fname="D:/影視劇名稱與熱度統計值.jpg",figsize=[1,1]) 82 #保存到D盤 83 84 #畫一元二次回歸方程 85 chinese=matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc') 86 #調用中文 87 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] 88 plt.rcParams['axes.unicode_minus']=False 89 filename="D:/hotbo.xlsx" 90 colnames=["rank","name","hot"] 91 df=pd.read_excel(filename,skiprows=1,names=colnames) 92 X=df.rank 93 Y=df.hot 94 #確定x,y軸 95 def func(params,x): 96 a,b,c=params 97 return a*x*x+b*x+c 98 def error(params,x,y): 99 #設置誤差函數 100 return func(params,x)-y 101 p0=[1978,0] 102 def main(): 103 #主函數 104 plt.figure(figsize=(8,6)) 105 #畫布尺寸 106 p0=[1978,300,1] 107 Para=leastsq(error,p0,args=(X,Y)) 108 a,b,c=Para[0] 109 print("a=",a,"b=",b,"c=",c) 110 plt.scatter(X,Y,color="green",label="樣本數據",linewidth=2) 111 x=np.linspace(1,25,25) 112 y=a*x*x+b*x+c 113 plt.plot(x,y,color="red",label="擬合曲線",linewidth=2) 114 #畫擬合曲線 115 plt.legend() 116 plt.title("影視劇排名與熱度統計值") 117 plt.grid() 118 plt.show() 119 main() 120 plt.savefig(fname="D:/影視劇名稱與熱度統計值回歸方程.jpg",figsize=[1,1]) 121 #保存圖像
四:結論
1.通過這次分析與可視化可以看出大家對影視的喜歡方面。
2.小結:通過Python可以進行數據分析,方便生活的數據統計。