爬取芒果TV電視劇排行榜


一、主題式網絡爬蟲設計方案

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.小結:通過此次任務,更清楚的看到了自己對這門課程沒有掌握的地方,發現了自己的許多不足,並在這次任務的過程中,逐漸學到了更多,對這門課程的了解也更深入了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM