一、設計方案
1.主題式網絡爬蟲名稱:爬取貓眼電影TOP100
2.爬取內容與數據特征分析:爬取貓眼電影TOP100榜單電影評分與出版年份..
3.設計方案概述、思路:首先打開目標網站,進行目標站點分析 打開貓眼電影 點擊榜單 TOP100 每一頁10個電影,通過URL offset參數改變電影的展示,然后進行網頁代碼分析 審查源代碼,由dd標簽包圍,抓取單頁內容,利用request請求目標站點,得到單個網頁HTML代碼,返回結果根據HTML代碼分析得到電影的名稱,主演,上映時間,評分,圖片鏈接等信息、保存文件、開啟循環及多線程....
難點:html源碼過於雜亂,難以提取數據,數據實時更新,會導致部分上傳的數據偏差
二、主題頁面的結構特征分析
1.主題頁面的結構與特征分析:通過分析頁面得知所要獲取的數據分布於dd標簽中,p為發行時間標簽,i為影片評分標簽。
2.Htmls頁面解析:
3.節點(標簽)查找方法與遍歷方法:通過re模塊的findall方法進行查找。
三、網絡爬蟲程序設計
1.數據的爬取與采集
import requests
import bs4
import pandas as pd
def get_one_page(url):
# 設置頭文件信息
#偽裝爬蟲
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' ,
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Cookie': '__mta=213236267.1587572266990.1587576183155.1587608996146.4; uuid_n_v=v1; uuid=CD3E8DF084B411EA92CE8B62796C19887B6E5F257E434EBFA5AFAA7C50986BB1; _csrf=d046dea14a42fa27a03f55d5df7be9fc2669e4f8e3f4e33ea42418cf07c04703; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1587572266; _lxsdk_cuid=171a2ae53b0c8-0824067bcb9761-366b420b-fa000-171a2ae53b1c8; _lxsdk=CD3E8DF084B411EA92CE8B62796C19887B6E5F257E434EBFA5AFAA7C50986BB1; mojo-uuid=0f40d6f281ba65600ee90a8fb913b7ac; t_lxid=171a2ae579fc8-0428f77e331d8b-366b420b-fa000-171a2ae579fc8-tid; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1587608996; _lxsdk_s=171a580f996-9c1-c73-c3f%7C%7C1',
'Host': 'maoyan.com',
'Upgrade-Insecure-Requests': '1'
}
try:
response=requests.get(url,headers=headers)
if response.status_code==200:
response.encoding = response.apparent_encoding
return response.text
except :
return None
#解析網頁
def get_soup(htm):
soup = bs4.BeautifulSoup(htm,'html.parser')
return soup
#找到電影名
def find_name(soup):
x=soup.find_all('p',class_="name")
n=[]
for i in x:
n.append(i.text)
return n
#找到電影上映時間
def get_time(soup):
x=soup.find_all('p',class_="releasetime")
n=[]
for i in x:
n.append(i.text)
return n
#找到電影評分
def get_score(soup):
x=soup.find_all('p',class_="score")
n=[]
for i in x:
n.append(i.text)
return n
def main():
url='https://maoyan.com/board/4?'
html = get_one_page(url)
#print(html)
soup = get_soup(html)
#print(soup)
#電影名
name = find_name(soup)
'''for i in name:
print(i)'''
#上映時間
time = get_time(soup)
'''for i in time:
print(i)'''
#評分
score = get_score(soup)
'''for i in score:
print(i)'''
#保存excel文件
df = pd.DataFrame({'電影名':name,'上映時間':time,'評分':score})
df.to_excel('貓眼電影.xlsx')
if __name__=='__main__':
main()
抓取的單頁內容:
2.對數據進行清洗和處理
#讀取csv文件 df = pd.DataFrame(pd.read_excel('貓眼電影.xlsx')) df.head()
#缺失值處理 df.isnull().head() #True為缺失值,False為存在值
#空值處理# df.isnull().sum() #0表示無空值

#查找重復值 df.duplicated() #顯示表示已經刪除重復值

#查看統計信息 df.describe()

4.數據分析與可視化
條形圖
#繪制條形圖
df = pd.read_excel('貓眼電影.xlsx')
x = df['電影名'][:5]
y = df['評分'][:5]
plt.xlabel('電影名')
plt.ylabel('評分')
plt.bar(x,y)
plt.title("電影名與評分條形圖")
plt.show()
#繪制折線圖
df = pd.read_excel('貓眼電影.xlsx')
x = df['電影名'][:10]
y = df['評分'][:10]
plt.xlabel('電影名')
plt.ylabel('評分')
plt.plot(x,y,color="red",label="折線")
plt.title("貓眼電影電影名評分折線圖")
plt.legend()
plt.show()
散點圖
df = pd.DataFrame(pd.read_excel('貓眼電影.xlsx'))
x = df['上映時間'][:1]
y = df['評分'][:10]
sns.lmplot(x="上映時間",y= "評分",data=df)
p0=[0,0,0]
Para=leastsq(error_func,p0,args=(q,w))
a,b,c=Para[0]
plt.figure(figsize=(6,3))
plt.scatter(q,w,color="grenn",label=u"最高評分散點",linewidth=2)
x=np.linspace(0,20,15)
y=a*x*x+b*x+c
plt.plot(x,y,color="green",label=u"回歸方程曲線",linewidth=2)
plt.xlabel("電影名")[:10]
plt.ylabel("最高評分")[:10]
plt.title("貓眼電影回歸曲線圖")
plt.legend()
plt.show()
代碼匯總:
import requests
import bs4
import pandas as pd
import seaborn as sns
import numpy as np
from numpy import genfromtxt
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
def get_one_page(url):
# 設置頭文件信息
#偽裝
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' ,
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Cookie': '__mta=213236267.1587572266990.1587576183155.1587608996146.4; uuid_n_v=v1; uuid=CD3E8DF084B411EA92CE8B62796C19887B6E5F257E434EBFA5AFAA7C50986BB1; _csrf=d046dea14a42fa27a03f55d5df7be9fc2669e4f8e3f4e33ea42418cf07c04703; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1587572266; _lxsdk_cuid=171a2ae53b0c8-0824067bcb9761-366b420b-fa000-171a2ae53b1c8; _lxsdk=CD3E8DF084B411EA92CE8B62796C19887B6E5F257E434EBFA5AFAA7C50986BB1; mojo-uuid=0f40d6f281ba65600ee90a8fb913b7ac; t_lxid=171a2ae579fc8-0428f77e331d8b-366b420b-fa000-171a2ae579fc8-tid; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1587608996; _lxsdk_s=171a580f996-9c1-c73-c3f%7C%7C1',
'Host': 'maoyan.com',
'Upgrade-Insecure-Requests': '1'
}
try:
response=requests.get(url,headers=headers)
if response.status_code==200:
response.encoding = response.apparent_encoding
return response.text
except :
return None
#解析網頁
def get_soup(htm):
soup = bs4.BeautifulSoup(htm,'html.parser')
return soup
#找到電影名
def find_name(soup):
x=soup.find_all('p',class_="name")
n=[]
for i in x:
n.append(i.text)
return n
#找到電影上映時間
def get_time(soup):
x=soup.find_all('p',class_="releasetime")
n=[]
for i in x:
n.append(i.text)
return n
#找到電影評分
def get_score(soup):
x=soup.find_all('p',class_="score")
n=[]
for i in x:
n.append(i.text)
return n
def main():
url='https://maoyan.com/board/4?'
html = get_one_page(url)
#print(html)
soup = get_soup(html)
#print(soup)
#電影名
name = find_name(soup)
'''for i in name:
print(i)'''
#上映時間
time = get_time(soup)
'''for i in time:
print(i)'''
#評分
score = get_score(soup)
'''for i in score:
print(i)'''
#排名
#保存excel文件
df = pd.DataFrame({'電影名':name,'上映時間':time,'評分':score})
df.to_excel('貓眼電影.xlsx')
if __name__=='__main__':
main()
df = pd.DataFrame(pd.read_excel('貓眼電影.xlsx'))
df.head()
#缺失值處理 df.isnull().head() #True為缺失值,False為存在值 #空值處理# df.isnull().sum() #0表示無空值 #查找重復值 df.duplicated() #顯示表示已經刪除重復值 #查看統計信息 df.describe()
#繪制條形圖
df = pd.read_excel('貓眼電影.xlsx')
x = df['電影名'][:5]
y = df['評分'][:5]
plt.xlabel('電影名')
plt.ylabel('評分')
plt.bar(x,y)
plt.title("電影名與評分條形圖")
plt.show()
#繪制折線圖
df = pd.read_excel('貓眼電影.xlsx')
x = df['電影名'][:10]
y = df['評分'][:10]
plt.xlabel('電影名')
plt.ylabel('評分')
plt.plot(x,y,color="red",label="折線")
plt.title("貓眼電影電影名評分折線圖")
plt.legend()
plt.show()
df = pd.DataFrame(pd.read_excel('貓眼電影.xlsx'))
x = df['上映時間'][:1]
y = df['評分'][:10]
sns.lmplot(x="上映時間",y= "評分",data=df)
df = pd.DataFrame(pd.read_csv('E:/華北天氣數據.csv'))
q = df['地點']
w = 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=(q,w))
a,b,c=Para[0]
plt.figure(figsize=(6,3))
plt.scatter(q,w,color="grenn",label=u"最高評分散點",linewidth=2)
x=np.linspace(0,20,15)
y=a*x*x+b*x+c
plt.plot(x,y,color="green",label=u"回歸方程曲線",linewidth=2)
plt.xlabel("電影名")[:10]
plt.ylabel("最高評分")[:10]
plt.title("貓眼電影回歸曲線圖")
plt.legend()
plt.show()
1.經過對主題數據的分析與可視化,可以得到哪些結論?
可以更直觀的發現和解決需求,大量數據一目了然,喜歡追求電影質量的可以更直接的觀看高評分電影,如果需要查找影片也可以更快的從分析與可視化完的數據中查找,也更方便迅捷。
2.對本次程序設計任務完成的情況做一個簡單的小結。
本次程序設計任務完成時間較久,也是對python的不熟悉,但是隨着這次的作業的完成,更熟識了許多庫與語法,對自己有較大的提升,盡管還是有很多語法錯誤與不完整的地方,但是我相信一步一個腳印總會有收獲的!