大數(shù)據(jù)可視化——基于Python豆瓣電影數(shù)據(jù)可視化分析系統(tǒng)
本項目旨在通過對豆瓣電影數(shù)據(jù)進行綜合分析與可視化展示,構(gòu)建一個基于Python的大數(shù)據(jù)可視化系統(tǒng)。通過數(shù)據(jù)爬取收集、清洗、分析豆瓣電影數(shù)據(jù),我們提供了一個全面的電影信息平臺,為用戶提供深入了解電影產(chǎn)業(yè)趨勢、影片評價與演員表現(xiàn)的工具。項目的關鍵步驟包括數(shù)據(jù)采集、數(shù)據(jù)清洗、數(shù)據(jù)分析與可視化展示。首先,我們使用爬蟲技術從豆瓣電影網(wǎng)站獲取豐富的電影數(shù)據(jù),包括電影基本信息、評分、評論等存儲到Mysql數(shù)據(jù)庫。然后,通過數(shù)據(jù)清洗與預處理,確保數(shù)據(jù)的質(zhì)量與一致性,以提高后續(xù)分析的準確性。數(shù)據(jù)分析階段主要包括對電影評分分布、不同類型電影的數(shù)量分布、評分、演員的影響力等方面的深入研究。基于Echarts進行可視化展示,借助Python中的數(shù)據(jù)分析庫(如Pandas、NumPy)和可視化庫(如Matplotlib、Seaborn),我們能夠以圖表的形式清晰地展示電影數(shù)據(jù)的特征和趨勢。最終,我們將分析結(jié)果以交互式的可視化界面呈現(xiàn),用戶可以通過系統(tǒng)自定義的查詢與過濾功能,深入挖掘他們感興趣的電影信息。這個項目不僅為電影愛好者提供了一個全面的數(shù)據(jù)參考平臺,也為電影產(chǎn)業(yè)從業(yè)者提供了洞察行業(yè)動向的工具。
最后我們爬取到的字段信息:電影名,評分,封面圖,詳情url,上映時間,導演,類型,制作國家,語言,片長,電影簡介,星星比例,多少人評價,預告片,前五條評論,五張詳情圖片
for i,moveInfomation in enumerate(moveisInfomation):
try:
resultData = {}
# 詳情
resultData['detailLink'] = detailUrls[i]
# 導演(數(shù)組)
resultData['directors'] = ','.join(moveInfomation['directors'])
# 評分
resultData['rate'] = moveInfomation['rate']
# 影片名
resultData['title'] = moveInfomation['title']
# 主演(數(shù)組)
resultData['casts'] = ','.join(moveInfomation['casts'])
# 封面
resultData['cover'] = moveInfomation['cover']
# =================進入詳情頁====================
detailMovieRes = requests.get(detailUrls[i], headers=headers)
soup = BeautifulSoup(detailMovieRes.text, 'lxml')
# 上映年份
resultData['year'] = re.findall(r'[(](.*?)[)]',soup.find('span', class_='year').get_text())[0]
types = soup.find_all('span',property='v:genre')
for i,span in enumerate(types):
types[i] = span.get_text()
# 影片類型(數(shù)組)
resultData['types'] = ','.join(types)
country = soup.find_all('span',class_='pl')[4].next_sibling.strip().split(sep='/')
for i,c in enumerate(country):
country[i] = c.strip()
# 制作國家(數(shù)組)
resultData['country'] = ','.join(country)
lang = soup.find_all('span', class_='pl')[5].next_sibling.strip().split(sep='/')
for i, l in enumerate(lang):
lang[i] = l.strip()
# 影片語言(數(shù)組)
resultData['lang'] = ','.join(lang)
upTimes = soup.find_all('span',property='v:initialReleaseDate')
upTimesStr = ''
for i in upTimes:
upTimesStr = upTimesStr + i.get_text()
upTime = re.findall(r'\d*-\d*-\d*',upTimesStr)[0]
# 上映時間
resultData['time'] = upTime
if soup.find('span',property='v:runtime'):
# 時間長度
resultData['moveiTime'] = re.findall(r'\d+',soup.find('span',property='v:runtime').get_text())[0]
else:
# 時間長度
resultData['moveiTime'] = random.randint(39,61)
# 評論個數(shù)
resultData['comment_len'] = soup.find('span',property='v:votes').get_text()
starts = []
startAll = soup.find_all('span',class_='rating_per')
for i in startAll:
starts.append(i.get_text())
# 星星比例(數(shù)組)
resultData['starts'] = ','.join(starts)
# 影片簡介
resultData['summary'] = soup.find('span',property='v:summary').get_text().strip()
# 五條熱評
comments_info = soup.find_all('span', class_='comment-info')
comments = [{} for x in range(5)]
for i, comment in enumerate(comments_info):
comments[i]['user'] = comment.contents[1].get_text()
comments[i]['start'] = re.findall('(\d*)', comment.contents[5].attrs['class'][0])[7]
comments[i]['time'] = comment.contents[7].attrs['title']
contents = soup.find_all('span', class_='short')
for i in range(5):
comments[i]['content'] = contents[i].get_text()
resultData['comments'] = json.dumps(comments)
# 五張詳情圖
imgList = []
lis = soup.select('.related-pic-bd img')
for i in lis:
imgList.append(i['src'])
resultData['imgList'] = ','.join(imgList)
將結(jié)果保存到CSV文件和SQL數(shù)據(jù)庫中,并在完成后更新頁數(shù)記錄。
從豆瓣電影數(shù)據(jù)中提取演員和導演的電影數(shù)量信息,以便后續(xù)的分析和可視化展示。
def getAllActorMovieNum():
allData = homeData.getAllData()
ActorMovieNum = {}
for i in allData:
for j in i[1]:
if ActorMovieNum.get(j,-1) == -1:
ActorMovieNum[j] = 1
else:
ActorMovieNum[j] = ActorMovieNum[j] + 1
ActorMovieNum = sorted(ActorMovieNum.items(), key=lambda x: x[1])[-20:]
x = []
y = []
for i in ActorMovieNum:
x.append(i[0])
y.append(i[1])
return x,y
定義統(tǒng)計導演執(zhí)導電影數(shù)量的函數(shù)getAllDirectorMovieNum():
def getAllDirectorMovieNum():
allData = homeData.getAllData()
ActorMovieNum = {}
for i in allData:
for j in i[4]:
if ActorMovieNum.get(j,-1) == -1:
ActorMovieNum[j] = 1
else:
ActorMovieNum[j] = ActorMovieNum[j] + 1
ActorMovieNum = sorted(ActorMovieNum.items(), key=lambda x: x[1])[-20:]
x = []
y = []
for i in ActorMovieNum:
x.append(i[0])
y.append(i[1])
return x,y
-
allData = homeData.getAllData()
:調(diào)用homeData
模塊中的getAllData
函數(shù),獲取所有的電影數(shù)據(jù),并將其保存在allData
變量中。 -
ActorMovieNum = {}
:創(chuàng)建一個空字典ActorMovieNum
,用于存儲導演與其執(zhí)導電影數(shù)量的映射。 -
for i in allData:
:遍歷所有電影數(shù)據(jù),其中i
代表每一部電影的信息。 -
for j in i[4]:
:在每部電影的信息中,使用i[4]
訪問導演的信息,然后遍歷每個導演。 -
if ActorMovieNum.get(j, -1) == -1:
:檢查字典ActorMovieNum
中是否已經(jīng)存在該導演的記錄。如果不存在,則將該導演作為鍵加入字典,并將對應的值初始化為1。 -
else:
:如果字典中已存在該導演的記錄,則將對應的值加1,表示該導演又執(zhí)導了一部電影。 -
ActorMovieNum = sorted(ActorMovieNum.items(), key=lambda x: x[1])[-20:]
:將字典中的導演及其執(zhí)導電影數(shù)量按照電影數(shù)量進行降序排序,然后取排序后的前20項。排序的依據(jù)是key=lambda x: x[1]
,即按照字典中的值進行排序。 -
x = []
和y = []
:創(chuàng)建兩個空列表,用于存儲導演名稱和對應的執(zhí)導電影數(shù)量。 -
for i in ActorMovieNum:
:遍歷排序后的前20項導演及其執(zhí)導電影數(shù)量。 -
x.append(i[0])
和y.append(i[1])
:將導演的名稱和執(zhí)導電影數(shù)量分別加入列表x
和y
。 -
return x, y
:返回存儲導演名稱和執(zhí)導電影數(shù)量的兩個列表。
從名為homeData
的模塊中導入getAllData
函數(shù),然后使用pandas
庫創(chuàng)建一個數(shù)據(jù)框(DataFrame)df
。getAllData
函數(shù)的返回值被傳遞給DataFrame
的構(gòu)造函數(shù),同時指定了數(shù)據(jù)框的列名。
-
from . import homeData
: 這行代碼從當前目錄(.
表示當前目錄)導入homeData
模塊。 -
import pandas as ps
: 這行代碼導入pandas
庫,并使用ps
作為別名。一般來說,pandas
的別名是pd
,但在這里使用了ps
。 -
df = ps.DataFrame(homeData.getAllData(), columns=[...])
: 這行代碼創(chuàng)建一個數(shù)據(jù)框df
,并使用homeData.getAllData()
的返回值填充數(shù)據(jù)框。列名由columns
參數(shù)指定,列的順序與列表中的順序相對應。列名包括:- ‘id’: 電影ID
- ‘directors’: 導演
- ‘rate’: 評分
- ‘title’: 標題
- ‘casts’: 演員
- ‘cover’: 封面
- ‘year’: 上映年份
- ‘types’: 類型
- ‘country’: 制片國家
- ‘lang’: 語言
- ‘time’: 時長
- ‘moveiTime’: 電影時長
- ‘comment_len’: 評論長度
- ‘starts’: 星級
- ‘summary’: 摘要
- ‘comments’: 評論
- ‘imgList’: 圖片列表
- ‘movieUrl’: 電影鏈接
- ‘detailLink’: 詳細鏈接
這樣就創(chuàng)建了一個包含特定列名的數(shù)據(jù)框,其中的數(shù)據(jù)來自homeData.getAllData()
函數(shù)的返回結(jié)果。
from . import homeData
import pandas as ps
df = ps.DataFrame(homeData.getAllData(),columns=[
'id',
'directors',
'rate',
'title',
'casts',
'cover',
'year',
'types',
'country',
'lang',
'time',
'moveiTime',
'comment_len',
'starts',
'summary',
'comments',
'imgList',
'movieUrl',
'detailLink'
])
從數(shù)據(jù)框(DataFrame)中的’country’列中提取地址數(shù)據(jù)。數(shù)據(jù)框中的地址數(shù)據(jù)提取出來,并統(tǒng)計每個地址出現(xiàn)的次數(shù)。它首先檢查’country’列中的每個元素,如果元素是一個列表,則將列表中的每個元素添加到一個新的列表(address)中。然后,它創(chuàng)建一個字典(addressDic),將地址作為鍵,出現(xiàn)次數(shù)作為值,最后返回地址列表和對應的出現(xiàn)次數(shù)列表。
def getAddressData():
# 獲取名為 'country' 的列的值
addresses = df['country'].values
# 創(chuàng)建一個空列表來存儲地址
address = []
# 遍歷 'country' 列的每個元素
for i in addresses:
# 如果元素是列表類型
if isinstance(i, list):
# 遍歷列表中的每個元素并添加到 address 列表中
for j in i:
address.append(j)
else:
# 如果元素不是列表類型,直接將其添加到 address 列表中
address.append(i)
# 創(chuàng)建一個空字典來存儲地址及其出現(xiàn)次數(shù)
addressDic = {}
# 遍歷地址列表中的每個元素
for i in address:
# 如果地址字典中不存在該地址,則將其添加并設置出現(xiàn)次數(shù)為1
if addressDic.get(i, -1) == -1:
addressDic[i] = 1
else:
# 如果地址字典中已存在該地址,則將其出現(xiàn)次數(shù)加1
addressDic[i] = addressDic[i] + 1
# 返回地址列表和對應的出現(xiàn)次數(shù)列表
return list(addressDic.keys()), list(addressDic.values())
從數(shù)據(jù)框的’lang’列中提取語言數(shù)據(jù),并統(tǒng)計每種語言出現(xiàn)的次數(shù)。最終返回語言列表和對應的出現(xiàn)次數(shù)列表。
def getLangData():
# 獲取名為 'lang' 的列的值
langs = df['lang'].values
# 創(chuàng)建一個空列表來存儲語言數(shù)據(jù)
languages = []
# 遍歷 'lang' 列的每個元素
for i in langs:
# 如果元素是列表類型
if isinstance(i, list):
# 遍歷列表中的每個元素并添加到 languages 列表中
for j in i:
languages.append(j)
else:
# 如果元素不是列表類型,直接將其添加到 languages 列表中
languages.append(i)
# 創(chuàng)建一個空字典來存儲語言及其出現(xiàn)次數(shù)
langsDic = {}
# 遍歷語言列表中的每個元素
for i in languages:
# 如果語言字典中不存在該語言,則將其添加并設置出現(xiàn)次數(shù)為1
if langsDic.get(i, -1) == -1:
langsDic[i] = 1
else:
# 如果語言字典中已存在該語言,則將其出現(xiàn)次數(shù)加1
langsDic[i] = langsDic[i] + 1
# 返回語言列表和對應的出現(xiàn)次數(shù)列表
return list(langsDic.keys()), list(langsDic.values())
數(shù)據(jù)庫創(chuàng)建四個表:
修改為自己的數(shù)據(jù)庫主機名和賬號密碼:
啟動項目:
服務端口:5000 http://127.0.0.1:5000
用戶注冊 http://127.0.0.1:5000/registry
用戶登錄
首頁頁面展示:
還有電影數(shù)據(jù),包括電影名、評分、片場、預告片等數(shù)據(jù)。
查看電影預告片
電影搜索
電影產(chǎn)量分析
電影數(shù)據(jù)時長分布占比
電影評分統(tǒng)計分析
? 豆瓣評分星級餅狀圖、豆瓣年度評價評分柱狀圖
? 豆瓣電影中外評分分布圖
數(shù)據(jù)視圖切換
? 電影拍攝地點統(tǒng)計圖
? 電影語言統(tǒng)計圖
電影類型餅圖
? 導演作品數(shù)量前20
? 數(shù)據(jù)表操作
? 標題詞云圖
? 簡介詞云圖
s4XV8qh-1701860368769)
? 演員名詞云圖
評論詞云圖
需更多資料/商業(yè)合作/交流探討等可以添加下面?zhèn)€人名片,感謝各位的喜歡與支持!文章來源:http://www.zghlxwxcb.cn/news/detail-811096.html
后面有時間和精力也會分享更多關于大數(shù)據(jù)領域方面的優(yōu)質(zhì)內(nèi)容,喜歡的小伙伴可以點贊關注收藏,感謝各位的喜歡與支持!文章來源地址http://www.zghlxwxcb.cn/news/detail-811096.html
到了這里,關于大數(shù)據(jù)可視化——基于Python豆瓣電影數(shù)據(jù)可視化分析系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!