愛奇藝影片熱榜的爬取及其數據分析


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

1,主題式網絡爬蟲名稱:

爬取愛奇藝影片熱榜

2,主題式網絡爬蟲爬取的內容與數據特征分析:

爬取內容為:影片名稱,排名,與其點擊量

數據特征分析:將其儲存於csv或xlsx文件中

3.主題式網絡爬蟲設計方案概述(包括實現思路與技術難點)

實現思路:首先進行對網頁源代碼的訪問分析,用BeautifulSoup進行HTML的解析和信息的爬取,后續對爬取下來的信息用pandas進行繪圖數據分析

技術難點:爬取信息時對標簽的查找,寫出查找所需標簽的代碼,對數據進行相應的分析

二、主題頁面的結構特征分析

打開網址http://v.iqiyi.com/index/dianying/index.html,F12或右鍵點擊檢查

 

 

 

 

 源代碼中可以看到,影片標題的名稱在div標簽下的a,title-link標簽中,點擊數在標簽div,qy-top-title-zhishu中

用for語句及find_all語句進行遍歷和爬取

三、網絡爬蟲程序設計

復制代碼
復制代碼
#導入所需要的BeautifulSoup和pandas
import requests import pandas as pd
from bs4 import BeautifulSoup #待爬取的網址 url = "http://v.iqiyi.com/index/dianying/index.html" #模擬瀏覽器 header={"User-Agent": "kaidie"} #發送請求 r = requests.get(url,headers=header) #創建標題的空列表 titlelist=[] #創建點擊數的空列表 mathlist=[] #為儲存數據創立空列表 alist=[] #用BeautifulSoup進行html的解析
html = r.text soup=BeautifulSoup(html,'html.parser') #找到所對應的標簽 #用for遍歷循環find_all查找語句查找標題 for a in soup.find_all("a","title-link"): titlelist.append(a.string) #同理找視頻的點擊數 for div in soup.find_all("div","qy-top-title-zhishu"): mathlist.append(div.string)
print("-------------------------愛奇藝影片榜前25-------------------------") print("{:^10}\t{:^30}\t{:^20}".format("排名","電影名","點擊數")) #獲取愛奇藝影片榜前25名 for i in range(25): print("{:^10}\t{:^30}\t{:^20}".format(i+1,titlelist[i],mathlist[i])) #將獲取的數據放入alist的空列表中 for i in range(25): alist.append([i+1,titlelist[i],mathlist[i]]) #用pandas對數據進行儲存,做到數據的持久化
A = pd.DataFrame(alist,columns = ['排名','電影名','點擊數']) A.to_excel('愛奇藝排行.xlsx')
復制代碼
復制代碼

 

 

 

 2.對數據進行清洗和處理

#讀取文件中的信息
df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
#打印出所有的信息
df.head(25)

 

#根據具體的需求可以清除不需要的數據
df.drop("點擊數", axis=1,inplace=True)
df.head(10)

 

 

#重復值的處理
df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
df.duplicated()

 

 

#異常值的觀察
df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
df.describe()

 

 

#查看相關系數
df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
df.corr()

3.文本分析

#首先導入做詞雲所需要的
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from imageio import imread
復制代碼
復制代碼
#讀取愛奇藝排行.xlsx將其中的電影名寫到txt文本中去
Name = pd.read_excel("愛奇藝排行.xlsx", encoding='utf-8')
with open("電影名.txt",'a+', encoding='utf-8') as f:
    for title in Name.電影名:
        f.write((str(title)+'\n'))

#讀取電影名.txt文本        
text=open('電影名.txt',encoding='utf-8').read()
#詞雲的背景圖片
photo=imread('手牽手.jpg')
Cyun=WordCloud(
    background_color = "white",
    mask = photo,
    width=1600,
    repeat=True,
    font_path=r'simfang.ttf',
    height=1600).generate(text)
plt.imshow(Cyun)
plt.axis("off")
plt.show()
#保存詞雲圖片
Cyun.to_file("愛奇藝詞雲.jpg") 
復制代碼
復制代碼

生成的詞雲如下

4.數據分析與可視化 

復制代碼
#根據畫圖的需求導入相應的庫
from matplotlib import pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns
復制代碼
復制代碼
復制代碼
#定義一個散點圖的函數
#排名與點擊數的散點圖 def Sspot(): df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx')) #賦予x,y所對應的值 x = df.排名 y = df.點擊數 plt.xlabel("排名") plt.ylabel("點擊數") plt.scatter(x,y,color="green",label="散點") plt.title("排名與點擊數的散點圖") plt.legend() plt.show() Sspot()
復制代碼
復制代碼

復制代碼
復制代碼
#繪制扇形圖
def Pspot():
    df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
    x = df.電影名
    y = df.點擊數
    #前五名的電影標題
    name = [x[0],x[1],x[2],x[3],x[4]]
    math = [y[0],y[1],y[2],y[3],y[4]]
    explode=[0.1,0.1,0.1,0.1,0.1]
    plt.pie(math,labels=name,colors=["r","g","c","b","y"],explode=explode)
    plt.axis("equal")
    plt.title("點擊數與電影的扇形圖")
    plt.show()
Pspot()
復制代碼
復制代碼

 

 

 

 

復制代碼
復制代碼
#排名與點擊數的條形圖
def Tspot():
    df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
    x = df.排名
    y = df.點擊數
    plt.xlabel("排名")
    plt.ylabel("點擊數")
    plt.bar(x,y,color="green")
    plt.title("排名與點擊數的條形圖")
    plt.show()
Tspot()
復制代碼
復制代碼

 

 

復制代碼
復制代碼
#前五名的電影與點擊數的條形圖
def Tspot2():
    df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
    x = df.電影名[:5]
    y = df.點擊數[:5]
    plt.xlabel("電影名")
    plt.ylabel("點擊數")
    plt.bar(x,y,color="green")
    plt.title("電影名與點擊數的條形圖")
    plt.show()
Tspot2()
復制代碼
復制代碼

 

 

復制代碼
復制代碼
#排名與點擊數的折線圖
def Zspot():
    df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
    x = df.排名
    y = df.點擊數
    plt.xlabel("排名")
    plt.ylabel("點擊數")
    plt.plot(x,y,color="green",label="折線")
    plt.title("排名與點擊數的折線圖")
    plt.legend()
    plt.show()
Zspot()
復制代碼
復制代碼

 

 

復制代碼
復制代碼
#回歸直線的圖
def huigui():
    #x,y為回歸直線的排名和點擊數
    x = df.排名
    y = df.點擊數
    #X,Y為散點圖的
    X = df.排名
    Y = df.點擊數
    #先定義所需要的數據
    x_i2=0
    x_i =0
    y_i=0
    #計算出x,y的均值用mean()
    q = x.mean()
    w = y.mean()
    for i in range(25):
        x_i2 = x_i+x[i]*x[i]
        x_i = x_i+x[i]
        y_i = y_i+y[i]
    #運用回歸直線的公式計算出所需要的值
    #分子
    m_1 = x_i*y_i-25*q*w
    #分母
    m_2 = x_i2-25*q*q
    #斜率
    k = m_1/m_2
    #截距
    b = w-q*k
    x=np.linspace(0,25)
    y=k*x+b
    print("斜率k=",k,"截距b=",b)
    plt.figure(figsize=(6,4))
    plt.xlabel('排名')
    plt.ylabel('點擊數')
    plt.scatter(X,Y,color="green",label="散點",linewidth=2)
    plt.plot(x, y,color="blue",label= "回歸直線")
    plt.title("回歸直線圖")
    plt.legend() 
    plt.show()
huigui()
復制代碼
復制代碼

 

 

#排名和點擊數的線性關系
df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
sns.lmplot(x="排名",y= "點擊數",data=df)

 

5.完整程序代碼

復制代碼
復制代碼
  1 #導入所需要的BeautifulSoup和pandas
  2 import requests
  3 import pandas as pd
  4 from bs4 import BeautifulSoup
  5 #根據畫圖的需求導入相應的庫
  6 from matplotlib import pyplot as plt
  7 import numpy as np
  8 import matplotlib.pyplot as plt
  9 import matplotlib
 10 import seaborn as sns
 11 #導入做詞雲所需要的
 12 from wordcloud import WordCloud
 13 import matplotlib.pyplot as plt
 14 from imageio import imread
 15 
 16 #待爬取的網址
 17 url = "http://v.iqiyi.com/index/dianying/index.html"
 18 #模擬瀏覽器
 19 header={"User-Agent": "kaidie"}
 20 #發送請求
 21 r = requests.get(url,headers=header)
 22 #創建標題的空列表
 23 titlelist=[]
 24 #創建點擊數的空列表
 25 mathlist=[]
 26 #為儲存數據創立空列表
 27 alist=[]
 28 
 29 #用BeautifulSoup進行html的解析
 30 html = r.text
 31 soup=BeautifulSoup(html,'html.parser')
 32 #找到所對應的標簽
 33 #用for遍歷循環find_all查找語句查找標題
 34 for a in soup.find_all("a","title-link"):
 35     titlelist.append(a.string)
 36     
 37 #同理找視頻的點擊數
 38 for div in soup.find_all("div","qy-top-title-zhishu"):
 39     mathlist.append(div.string)
 40 
 41 print("-------------------------愛奇藝影評榜前25-------------------------")
 42 print("{:^10}\t{:^30}\t{:^20}".format("排名","電影名","點擊數"))
 43 
 44 #獲取愛奇藝影評榜前25名
 45 for i in range(25):
 46     print("{:^10}\t{:^30}\t{:^20}".format(i+1,titlelist[i],mathlist[i]))
 47     
 48 #將獲取的數據放入alist的空列表中
 49 for i in range(25):
 50     alist.append([i+1,titlelist[i],mathlist[i]])
 51     
 52 #用pandas對數據進行儲存,做到數據的持久化
 53 A = pd.DataFrame(alist,columns = ['排名','電影名','點擊數'])
 54 A.to_excel('愛奇藝排行.xlsx')
 55 
 56 #讀取文件中的信息
 57 df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
 58 #打印出所有的信息
 59 df.head(25)
 60 
 61 #根據具體的需求可以清除不需要的數據
 62 df.drop("點擊數", axis=1,inplace=True)
 63 df.head(10)
 64 
 65 #重復值的處理
 66 df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
 67 df.duplicated()
 68 
 69 #異常值的觀察
 70 df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
 71 df.describe()
 72 
 73 #查看相關系數
 74 df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
 75 df.corr()
 76 
 77 #排名和點擊數的線性關系
 78 df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
 79 sns.lmplot(x="排名",y= "點擊數",data=df)
 80 
 81 #讀取愛奇藝排行.xlsx將其中的電影名寫到txt文本中去
 82 Name = pd.read_excel("愛奇藝排行.xlsx", encoding='utf-8')
 83 with open("電影名.txt",'a+', encoding='utf-8') as f:
 84     for title in Name.電影名:
 85         f.write((str(title)+'\n'))
 86 
 87 #讀取電影名.txt文本        
 88 text=open('電影名.txt',encoding='utf-8').read()
 89 #詞雲的背景圖片
 90 photo=imread('手牽手.jpg')
 91 Cyun=WordCloud(
 92     background_color = "white",
 93     mask = photo,
 94     width=1600,
 95     repeat=True,
 96     font_path=r'simfang.ttf',
 97     height=1600).generate(text)
 98 plt.imshow(Cyun)
 99 plt.axis("off")
100 plt.show()
101 #保存詞雲圖片
102 Cyun.to_file("愛奇藝詞雲.jpg")        
103 
104 #定義一個散點圖的函數
105 #排名與點擊數的散點圖
106 def Sspot():
107     df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
108 #賦予x,y所對應的值
109     x = df.排名
110     y = df.點擊數
111     plt.xlabel("排名")
112     plt.ylabel("點擊數")
113     plt.scatter(x,y,color="green",label="散點")
114     plt.title("排名與點擊數的散點圖")
115     plt.legend()
116     plt.show()
117 Sspot()
118 
119 #繪制扇形圖
120 def Pspot():
121     df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
122     x = df.電影名
123     y = df.點擊數
124     #前五名的電影標題
125     name = [x[0],x[1],x[2],x[3],x[4]]
126     math = [y[0],y[1],y[2],y[3],y[4]]
127     explode=[0.1,0.1,0.1,0.1,0.1]
128     plt.pie(math,labels=name,colors=["r","g","c","b","y"],explode=explode)
129     plt.axis("equal")
130     plt.title("排名與電影的扇形圖")
131     plt.show()
132 Pspot()
133 
134 #排名與點擊數的條形圖
135 def Tspot():
136     df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
137     x = df.排名
138     y = df.點擊數
139     plt.xlabel("排名")
140     plt.ylabel("點擊數")
141     plt.bar(x,y,color="green")
142     plt.title("排名與點擊數的條形圖")
143     plt.show()
144 Tspot()
145 
146 #前五名的電影與點擊數的條形圖
147 def Tspot2():
148     df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
149     x = df.電影名[:5]
150     y = df.點擊數[:5]
151     plt.xlabel("電影名")
152     plt.ylabel("點擊數")
153     plt.bar(x,y,color="green")
154     plt.title("電影名與點擊數的條形圖")
155     plt.show()
156 Tspot2()
157 
158 #排名與點擊數的折線圖
159 def Zspot():
160     df = pd.DataFrame(pd.read_excel('愛奇藝排行.xlsx'))
161     x = df.排名
162     y = df.點擊數
163     plt.xlabel("排名")
164     plt.ylabel("點擊數")
165     plt.plot(x,y,color="green",label="折線")
166     plt.title("排名與點擊數的折線圖")
167     plt.legend()
168     plt.show()
169 Zspot()
170 
171 #回歸直線的圖
172 def huigui():
173     #x,y為回歸直線的排名和點擊數
174     x = df.排名
175     y = df.點擊數
176     #X,Y為散點圖的
177     X = df.排名
178     Y = df.點擊數
179     #先定義所需要的數據
180     x_i2=0
181     x_i =0
182     y_i=0
183     #計算出x,y的均值用mean()
184     q = x.mean()
185     w = y.mean()
186     for i in range(25):
187         x_i2 = x_i+x[i]*x[i]
188         x_i = x_i+x[i]
189         y_i = y_i+y[i]
190     #運用回歸直線的公式計算出所需要的值
191     #分子
192     m_1 = x_i*y_i-25*q*w
193     #分母
194     m_2 = x_i2-25*q*q
195     #斜率
196     k = m_1/m_2
197     #截距
198     b = w-q*k
199     x=np.linspace(0,25)
200     y=k*x+b
201     print("斜率k=",k,"截距b=",b)
202     plt.figure(figsize=(6,4))
203     plt.xlabel('排名')
204     plt.ylabel('點擊數')
205     plt.scatter(X,Y,color="green",label="散點",linewidth=2)
206     plt.plot(x, y,color="blue",label= "回歸直線")
207     plt.title("回歸直線圖")
208     plt.legend() 
209     plt.show()
210 huigui()
復制代碼
復制代碼

 

 

 

 四、結論

根據數據的圖形分析,點擊數會隨着排名的降低呈現大幅度的下降,根據點擊數的數量差距可以知道他們排名差距程度的多少。

小結:在完成程序的過程,有意外獲得的收獲也有一些困難,由於一個的函數字母的輸入的錯誤導致代碼無法運行,所以要養成寫代碼檢查的習慣。同時通過這次的補考讓我對python的應用有了更進一步的提升,受益良多。


免責聲明!

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



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