一、主題式網絡爬蟲設計方案
1.主題式網絡爬蟲名稱:爬取軟件之家軟件下載排行榜
2.主題式網絡爬蟲爬取的內容:爬取軟件下載排名、下載次數
3.主題式網絡爬蟲設計方案概述
實現思路:訪問目標網頁的源代碼,使用get請求和BeautifulSoup解析工具爬取數據並采集保留,然后進行數據清洗和處理,數據分析與可視化,畫出散點圖,用最小二乘法分析兩個變量間的二次 擬合方程和繪制擬合曲線。
技術難點:對庫的正確認識與應用以及數據分析
二、主題頁面的結構特征分析
1.主題頁面的結構與特征分析:觀察發現,爬取所需數據都在<li class="m-list-item m-list-item-ictive>中,軟件排名標簽為"class=title()",名稱標簽為"class=sces''",下載次數標簽為"class=sdate"。
2.Htmls
3.節點(標簽)查找方法與遍歷方法
for child in soup.body.contents: print(child)
soup.select('title')
三、網絡爬蟲程序設計
1.數據爬取與采集
import requests from bs4 import BeautifulSoup import pandas as pd #對url發出get請求 url='https://www.mgtv.com/top/tv/' 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.18362'} r = requests.get(url, headers=headers,timeout=10) def getHTMLText(url,timeout = 30): try: r = requests.get(url, timeout = 30) #用requests抓取網頁信息 r.raise_for_status() #可以讓程序產生異常時停止程序 r.encoding = r.apparent_encoding #設置編碼標准 return r.text except: return '產生異常' #獲取源代碼 html=r.text soup=BeautifulSoup(html,'html.parser') title = soup.find_all('span',class_="title") desc= soup.find_all('span', class_='desc') print('{:^35}'.format('芒果TV電視劇排行榜')) print('{:^8}\t{:^8}\t{:^8}'.format('排名', '標題', '播放次數(億次)')) #創建空列表 a=[] for i in range(30): print('{:^5}\t{:^15}\t{:^20}'.format(i+1,title[i].string,desc[i].string)) a.append([i+1,title[i].string,desc[i].string]) df = pd.DataFrame(list, columns=['排名','標題','播放次數(億次)']) print(df)
2.對數據進行清洗和處理
#讀取csv文件 df=pd.DataFrame(pd.read_excel('abc.xlsx')) df
#刪除無效列與行 df.drop('劇名', axis=1, inplace = True) df
# 查找重復值 df.duplicated()
# 刪除重復值
df = df.drop_duplicates()
df
#查找空值
df['播放量'].isnull().value_counts()
df
#若有則刪除缺失值
df[df.isnull().values==True]
df.corr()
#查找異常值 df.describe() df
3.文本分析
# 構建線性回歸預測模型 from sklearn.linear_model import LinearRegression X = df.drop("播放量", axis = 1) predict_model = LinearRegression() predict_model.fit(X, df['播放量']) print("回歸系數為:", predict_model.coef_)
4.數據分析與可視化
#繪制排名與評分的回歸圖 matplotlib.rcParams['font.sans-serif']=['SimHei'] sns.regplot(df.排名,df.播放量)
5.根據數據之間的關系,分析兩個變量之間的相關系數,畫出散點圖,並建立變量之間的回歸方程(一元或多元)
def main(): colnames=["排名","劇名","播放量"] df=pd.read_csv('芒果TV電視劇排行榜.csv',skiprows=1,names=colnames) X=df.排名 Y=df.劇名 def func(p,x): k,b=p return k*x+b def error_func(p,x,y): return func(p,x)-y p0=[1,20] Para = leastsq(error_func,p0,args = (X,Y)) k,b = Para[0] print("k=",k,"b=",b) plt.figure(figsize=(10,8)) plt.scatter(X,Y,color="blue",label=u"播放量分布",linewidth=2) x=np.linspace(0,30,25) y=k*x+b plt.plot(x,y,color="red",label=u"回歸方程直線",linewidth=2) plt.title("芒果TV電視劇排名和播放量關系圖") plt.xlabel('排名') plt.ylabel('播放量(單位:億次)') plt.legend() plt.show() main()
6.數據持久化
data.to_csv('mgtv.csv')
7.將以上各部分的代碼匯總,附上完整程序代碼
import requests from bs4 import BeautifulSoup import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib import seaborn as sns #對url發出get請求 url='https://www.mgtv.com/top/tv/' 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.18362'} r = requests.get(url, headers=headers,timeout=10) def getHTMLText(url,timeout = 30): try: r = requests.get(url, timeout = 30) #用requests抓取網頁信息 r.raise_for_status() #可以讓程序產生異常時停止程序 r.encoding = r.apparent_encoding #設置編碼標准 return r.text except: return '產生異常' #獲取源代碼 html=r.text soup=BeautifulSoup(html,'html.parser') title = soup.find_all('span',class_="title") desc= soup.find_all('span', class_='desc') print('{:^35}'.format('芒果TV電視劇排行榜')) print('{:^8}\t{:^8}\t{:^8}'.format('排名', '標題', '播放次數(億次)')) #創建空列表 a=[] for i in range(30): print('{:^5}\t{:^15}\t{:^20}'.format(i+1,title[i].string,desc[i].string)) a.append([i+1,title[i].string,desc[i].string]) df = pd.DataFrame(list, columns=['排名','標題','播放次數(億次)']) print(df) data.to_csv('mgtv.csv') #讀取csv文件 df=pd.DataFrame(pd.read_excel('abc.xlsx')) #刪除無效列與行 df.drop('劇名', axis=1, inplace = True) # 查找重復值 df.duplicated() # 刪除重復值 df = df.drop_duplicates() #查找空值 df['播放量'].isnull().value_counts() #若有則刪除缺失值 df[df.isnull().values==True] df.corr() #查找異常值 df.describe() # 構建線性回歸預測模型 from sklearn.linear_model import LinearRegression X = df.drop("播放量", axis = 1) predict_model = LinearRegression() predict_model.fit(X, df['播放量']) print("回歸系數為:", predict_model.coef_) #繪制排名與評分的回歸圖 matplotlib.rcParams['font.sans-serif']=['SimHei'] sns.regplot(df.排名,df.播放量) def main(): colnames=["排名","劇名","播放量"] df=pd.read_csv('芒果TV電視劇排行榜.csv',skiprows=1,names=colnames) X=df.排名 Y=df.劇名 def func(p,x): k,b=p return k*x+b def error_func(p,x,y): return func(p,x)-y p0=[1,20] Para = leastsq(error_func,p0,args = (X,Y)) k,b = Para[0] print("k=",k,"b=",b) plt.figure(figsize=(10,8)) plt.scatter(X,Y,color="blue",label=u"播放量分布",linewidth=2) x=np.linspace(0,30,25) y=k*x+b plt.plot(x,y,color="red",label=u"回歸方程直線",linewidth=2) plt.title("芒果TV電視劇排名和播放量關系圖") plt.xlabel('排名') plt.ylabel('播放量(單位:億次)') plt.legend() plt.show() main()
四、結論
1.經過對芒果TV電視劇排行榜的數據分析和可視化,可以清楚看出各排名電視劇的具體播放量,播放量越多,排名越高,對數據有了更深切的了解和更直觀的感受。
2.小結:通過此次任務,更清楚的看到了自己對這門課程沒有掌握的地方,發現了自己的許多不足,並在這次任務的過程中,逐漸學到了更多,對這門課程的了解也更深入了。