一.主題式網絡主題式網絡爬蟲設計方案
1.爬蟲名稱:爬取豆瓣電影 Top 250 數據
2.爬取內容:爬取電影排名,評分,介紹
3.網絡爬蟲設計方案概述:
思路:通過分析網頁源代碼,找出數據所在的標簽,通過爬蟲讀取數據保存到csv文件中,讀取文件,對數據進行清洗和處理,數據分析與可視化處理。
技術難點:數據量過少,所掌握的知識不夠使用。
二.主題頁面的結構特征分析
1.主題頁面的結構和特征分析:爬取數據都分布在標簽'<ol class="grid_view">'里面,電影名標簽為'span.title',評分標簽為'span.rating_num',介紹標簽為'span.inq'。
2.Htmls頁面解析:
三、網絡爬蟲程序設計
1.數據的爬取與采集:
import requests
from bs4 import BeautifulSoup
import pandas as pd
from sklearn.linear_model import LinearRegression
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from scipy.optimize import leastsq
def get_html(url):
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'}#偽裝爬蟲
resp = requests.get(url, headers = headers)
return resp.text
url = 'https://movie.douban.com/top250'
html = get_html(url)
soup = BeautifulSoup(html, 'html.parser')
a = soup.find_all('div', class_='hd')
#電影名
film_name = []
for i in a:
film_name.append(i.a.span.text)
#評分
rating_score = soup.find_all('span', class_='rating_num')
lt = []
num = 20
for i in range(num):
lt.append([i+1,film_name[i], rating_score[i].string])
df = pd.DataFrame(lt,columns = ['排名', '電影名', '評分'])
df.to_csv('豆瓣電影數據.csv') #保存文件,數據持久化
2.對數據進行清洗和處理:
#讀取csv文件
df = pd.DataFrame(pd.read_csv('豆瓣電影數據.csv'))
#print(df)
df.head()
#檢查是否有重復值
df.duplicated()
#空值處理 df.isnull().sum()#返回0,表示沒有空值
#缺失值處理
df[df.isnull().values==True]#返回無缺失值
#用describe()命令顯示描述性統計指標 df.describe()
3.數據分析與可視化:
X = df.drop("電影名",axis=1)
predict_model = LinearRegression()
predict_model.fit(X,df['評分'])
print("回歸系數為:",predict_model.coef_)
#繪制排名與評分的回歸圖
plt.rcParams['font.sans-serif']=['STSong']#顯示中文
sns.regplot(df.排名,df.評分)
# 繪制散點圖
def Scatter_point():
plt.scatter(df.排名, df.評分, color='red', s=25, marker="o")
plt.xlabel("排名")
plt.ylabel("評分")
plt.title("排名與評分-散點圖")
plt.show()
Scatter_point()
# 繪制垂直柱狀圖
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
plt.bar(df.排名, df.評分, label="排名與評分柱狀圖")
plt.show()
#繪制排名與評分-盒圖
def draw1():
plt.figure(figsize=(10, 6))
plt.title('繪制排名與評分-盒圖')
sns.boxplot(x='排名',y='評分', data=df)
draw1()
#繪制部分分布圖
sns.jointplot(x="排名",y='評分',data = df, kind='reg')
#繪制一元一次回歸方程
def main():
colnames = ["排名", "電影名", "評分"]
df = pd.read_csv('豆瓣電影數據.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 = [0,0]
Para = leastsq(error_func, p0, args = (X, Y))
k, b = Para[0]
print("k=",k,"b=",b)
plt.figure(figsize=(10,6))
plt.scatter(X,Y,color="green",label=u"評分分布",linewidth=2)
x=np.linspace(0,30,20)
y=k*x+b
plt.plot(x,y,color="red",label=u"回歸方程直線",linewidth=2)
plt.title("電影排名和評分關系圖")
plt.xlabel('排名')
plt.ylabel('評分')
plt.legend()
plt.show()
main()
#繪制一元二次回歸方程
def one():
colnames = ["排名", "電影名", "評分"]
df = pd.read_csv('豆瓣電影數據.csv',skiprows=1,names=colnames)
X = df.排名
Y = df.評分
def func(p,x):
a,b,c=p
return a*x*x+b*x+c
def error_func(p,x,y):
return func(p,x)-y
p0=[0,0,0]
Para=leastsq(error_func,p0,args=(X,Y))
a,b,c=Para[0]
plt.figure(figsize=(10,6))
plt.scatter(X,Y,color="green",label=u"評分分布",linewidth=2)
x=np.linspace(0,30,20)
y=a*x*x+b*x+c
plt.plot(x,y,color="red",label=u"擬合直線",linewidth=2)
plt.title("電影排名和評分一元二次回歸方程關系圖")
plt.legend()
plt.show()
one()
5.將以上各部分的代碼匯總,附上完整程序代碼:
import requests
from bs4 import BeautifulSoup
import pandas as pd
from sklearn.linear_model import LinearRegression
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from scipy.optimize import leastsq
def get_html(url):
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'}#偽裝爬蟲
resp = requests.get(url, headers = headers)
return resp.text
url = 'https://movie.douban.com/top250'
html = get_html(url)
soup = BeautifulSoup(html, 'html.parser')
a = soup.find_all('div', class_='hd')
#電影名
film_name = []
for i in a:
film_name.append(i.a.span.text)
#評分
rating_score = soup.find_all('span', class_='rating_num')
lt = []
num = 20
for i in range(num):
lt.append([i+1,film_name[i], rating_score[i].string])
df = pd.DataFrame(lt,columns = ['排名', '電影名', '評分'])
df.to_csv('豆瓣電影數據.csv') #保存文件,數據持久化
#讀取csv文件
df = pd.DataFrame(pd.read_csv('豆瓣電影數據.csv'))
#print(df)
df.head()
#檢查是否有重復值
df.duplicated()
#空值處理
df.isnull().sum()#返回0,表示沒有空值
#缺失值處理
df[df.isnull().values==True]#返回無缺失值
#用describe()命令顯示描述性統計指標
df.describe()
#數據分析
X = df.drop("電影名",axis=1)
predict_model = LinearRegression()
predict_model.fit(X,df['評分'])
print("回歸系數為:",predict_model.coef_)
#繪制排名與評分的回歸圖
plt.rcParams['font.sans-serif']=['STSong']#顯示中文
sns.regplot(df.排名,df.評分)
# 繪制散點圖
def Scatter_point():
plt.scatter(df.排名, df.評分, color='red', s=25, marker="o")
plt.xlabel("排名")
plt.ylabel("評分")
plt.title("排名與評分-散點圖")
plt.show()
Scatter_point()
# 繪制垂直柱狀圖
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
plt.bar(df.排名, df.評分, label="排名與評分柱狀圖")
plt.show()
#繪制排名與評分-盒圖
def draw1():
plt.figure(figsize=(10, 6))
plt.title('繪制排名與評分-盒圖')
sns.boxplot(x='排名',y='評分', data=df)
draw1()
#繪制分布圖
sns.jointplot(x="排名",y='評分',data = df, kind='reg')
#繪制一元一次回歸方程
def main():
colnames = ["排名", "電影名", "評分"]
df = pd.read_csv('豆瓣電影數據.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 = [0,0]
Para = leastsq(error_func, p0, args = (X, Y))
k, b = Para[0]
print("k=",k,"b=",b)
plt.figure(figsize=(10,6))
plt.scatter(X,Y,color="green",label=u"評分分布",linewidth=2)
x=np.linspace(0,30,20)
y=k*x+b
plt.plot(x,y,color="red",label=u"回歸方程直線",linewidth=2)
plt.title("電影排名和評分關系圖")
plt.xlabel('排名')
plt.ylabel('評分')
plt.legend()
plt.show()
main()
#繪制一元二次回歸方程
def one():
colnames = ["排名", "電影名", "評分"]
df = pd.read_csv('豆瓣電影數據.csv',skiprows=1,names=colnames)
X = df.排名
Y = df.評分
def func(p,x):
a,b,c=p
return a*x*x+b*x+c
def error_func(p,x,y):
return func(p,x)-y
p0=[0,0,0]
Para=leastsq(error_func,p0,args=(X,Y))
a,b,c=Para[0]
plt.figure(figsize=(10,6))
plt.scatter(X,Y,color="green",label=u"評分分布",linewidth=2)
x=np.linspace(0,30,20)
y=a*x*x+b*x+c
plt.plot(x,y,color="red",label=u"擬合直線",linewidth=2)
plt.title("電影排名和評分一元二次回歸方程關系圖")
plt.legend()
plt.show()
one()
四、結論
1.1.經過對主題數據的分析與可視化,可以得到哪些結論?
通過這次作業中對主題數據的分析與可視化,讓我深刻的認識到了數據可視化的遍歷之處,通過數據分析和可視化讓抽象的數據變成具體的圖像,讓我們的理解更加容易。
2.對本次程序設計任務完成的情況做一個簡單的小結:通過這次做題任務,我明白了數據的分析與可視化,掌握了不少庫的使用,在完成的過程中遇到了很多的困難,讓我得到了許多收獲,也讓我充分的認識到了自己的不足之處,在未來我將更加努力的學習