版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
目錄
1引言1
1.1項(xiàng)目背景1
1.2開發(fā)環(huán)境與工具1
1.2.1Python簡(jiǎn)介1
1.2.2Pandas簡(jiǎn)介1
1.2.3Pyecharts簡(jiǎn)介2
2需求分析2
2.1可行性需求分析2
2.2采集目標(biāo)功能分析3
2.3關(guān)鍵技術(shù)分析3
2.3.1網(wǎng)絡(luò)爬蟲技術(shù)3
2.3.2文件存取技術(shù)3
2.3.3可視化技術(shù)3
3數(shù)據(jù)采集4
3.1采集頁(yè)面分析4
3.2獲取分類列表5
3.3多線程爬蟲6
3.4翻頁(yè)處理7
3.5獲取電影字段并保存8
4數(shù)據(jù)清洗與處理11
4.1數(shù)據(jù)清洗需求11
4.2數(shù)據(jù)清洗11
4.3讀取文件并處理數(shù)據(jù)12
4.4保存到MySQL數(shù)據(jù)庫(kù)12
5數(shù)據(jù)統(tǒng)計(jì)與分析15
5.1數(shù)據(jù)讀取15
5.2數(shù)據(jù)展示15
I
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
5.2.1統(tǒng)計(jì)每個(gè)電影分類的數(shù)量和平均評(píng)分15
5.2.2統(tǒng)計(jì)每年上映的電影數(shù)量和平均評(píng)分17
5.2.3統(tǒng)計(jì)每個(gè)國(guó)家上映電影的數(shù)量18
5.2.4統(tǒng)計(jì)出演電影最多的10個(gè)演員20
5.3數(shù)據(jù)分析21
6小結(jié)22
參考資料23
II
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
豆瓣電影數(shù)據(jù)采集與分析
1引言
豆瓣電影作為國(guó)內(nèi)知名的電影評(píng)價(jià)和推薦平臺(tái),包含了大量的電影信息和
用戶評(píng)價(jià),具有很高的價(jià)值和應(yīng)用前景。對(duì)于電影愛好者和業(yè)內(nèi)人士而言,了
解豆瓣電影網(wǎng)站上電影的評(píng)分、評(píng)論、票房等信息,可以為電影的制作、推廣
和上映提供重要的參考依據(jù)。
因此,通過對(duì)豆瓣電影網(wǎng)站數(shù)據(jù)的采集和分析,可以幫助電影從業(yè)者和電
影愛好者深入了解電影市場(chǎng)的發(fā)展趨勢(shì)、用戶偏好、口碑評(píng)價(jià)等方面的信息,
進(jìn)而為電影制作、發(fā)行和推廣提供科學(xué)的數(shù)據(jù)支持。
1.1項(xiàng)目背景
豆瓣是中國(guó)知名的影視、圖書、音樂等文化類產(chǎn)品評(píng)分、評(píng)論和分享平臺(tái)
之一,其中豆瓣電影是其最具代表性的產(chǎn)品之一。豆瓣電影提供了大量的電影
信息,包括電影名稱、導(dǎo)演、演員、上映時(shí)間、評(píng)分等,這些數(shù)據(jù)為研究電影
市場(chǎng)、電影觀眾等提供了寶貴的資源。因此,對(duì)豆瓣電影網(wǎng)站進(jìn)行數(shù)據(jù)采集和
分析有著廣泛的應(yīng)用價(jià)值。
通過對(duì)豆瓣電影網(wǎng)站數(shù)據(jù)的采集、清洗和分析,探索豆瓣電影網(wǎng)站的電影
評(píng)分分布情況、熱門電影的特征、不同國(guó)家和地區(qū)電影的產(chǎn)出情況等,為電影
從業(yè)者、影評(píng)人、電影愛好者等提供有益的信息和參考。同時(shí),本項(xiàng)目的實(shí)現(xiàn)
也涉及了多種數(shù)據(jù)處理和分析技術(shù),有助于提升數(shù)據(jù)分析技能和應(yīng)用能力。
1.2開發(fā)環(huán)境與工具
1.2.1Python簡(jiǎn)介
Python是一種高級(jí)編程語(yǔ)言,廣泛用于數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、Web開發(fā)等
領(lǐng)域。Python的易用性、可讀性和豐富的第三方庫(kù)使其成為數(shù)據(jù)科學(xué)和數(shù)據(jù)分
析的熱門語(yǔ)言之一。
1.2.2Pandas簡(jiǎn)介
Pandas是一個(gè)開源的Python數(shù)據(jù)分析庫(kù),它提供了快速、靈活、簡(jiǎn)單的數(shù)
據(jù)結(jié)構(gòu),用于處理和分析結(jié)構(gòu)化數(shù)據(jù)。Pandas主要提供了兩種數(shù)據(jù)結(jié)構(gòu):Series
1
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
和DataFrame。在數(shù)據(jù)分析中,Pandas可以幫助我們進(jìn)行數(shù)據(jù)預(yù)處理、數(shù)據(jù)清
洗和數(shù)據(jù)探索性分析。在數(shù)據(jù)可視化中,我們可以使用Pandas與Matplotlib
或Seaborn等庫(kù)進(jìn)行數(shù)據(jù)可視化??傊琍andas是Python數(shù)據(jù)分析領(lǐng)域的重要
工具之一,廣泛應(yīng)用于數(shù)據(jù)清洗、處理、分析和可視化。
1.2.3Pyecharts簡(jiǎn)介
Pyecharts是一個(gè)基于Python的數(shù)據(jù)可視化庫(kù),它的目標(biāo)是成為Python數(shù)
據(jù)可視化領(lǐng)域的工具之一。Pyecharts具有開箱即用、易于使用、高度定制和美
觀的圖表等特點(diǎn)。該庫(kù)包含了各種圖表類型,例如折線圖、散點(diǎn)圖、餅圖、詞
云圖等。它的另一個(gè)重要功能是可以與Pandas等常見的數(shù)據(jù)分析庫(kù)配合使用,
使得數(shù)據(jù)處理和可視化更加方便快捷。Pyecharts采用了Echarts的JavaScrip
t庫(kù)作為其底層圖表庫(kù),這使得它可以生成高質(zhì)量的交互式圖表。
2需求分析
2.1可行性需求分析
數(shù)據(jù)獲取可行性:豆瓣電影網(wǎng)站提供了公開的API接口,但是限制了請(qǐng)求
頻率和返回?cái)?shù)據(jù)的數(shù)量,因此需要采用爬蟲技術(shù)來獲取更為詳細(xì)的數(shù)據(jù)。通過
分析豆瓣電影網(wǎng)站的網(wǎng)頁(yè)結(jié)構(gòu),可以確定采用Python的爬蟲框架來實(shí)現(xiàn)數(shù)據(jù)的
獲取。
數(shù)據(jù)存儲(chǔ)可行性:獲取到的數(shù)據(jù)需要進(jìn)行存儲(chǔ)和管理,常見的數(shù)據(jù)存儲(chǔ)方
式包括文本文件、CSV文件、Excel文件、MySQL等。針對(duì)本項(xiàng)目,可以使用MySQL
數(shù)據(jù)庫(kù)來存儲(chǔ)和管理采集到的數(shù)據(jù)。
數(shù)據(jù)清洗可行性:從豆瓣電影網(wǎng)站獲取到的數(shù)據(jù)往往存在缺失、重復(fù)、格
式不統(tǒng)一等問題,因此需要進(jìn)行數(shù)據(jù)清洗和預(yù)處理。Pandas提供了大量的數(shù)據(jù)
處理和清洗函數(shù),可以有效地解決這些問題。
數(shù)據(jù)分析可行性:獲取和清洗完數(shù)據(jù)后,需要進(jìn)行數(shù)據(jù)分析來發(fā)現(xiàn)數(shù)據(jù)之
間的關(guān)聯(lián)性和規(guī)律性。Pandas提供了各種數(shù)據(jù)分析函數(shù),可以幫助用戶進(jìn)行數(shù)
據(jù)分析和挖掘。
數(shù)據(jù)可視化可行性:通過數(shù)據(jù)可視化,可以更直觀地展現(xiàn)數(shù)據(jù)分析結(jié)果,
Pandas結(jié)合Matplotlib、Seaborn、Plotly等可視化工具可以提供豐富的數(shù)據(jù)
可視化效果。
2
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
2.2采集目標(biāo)功能分析
豆瓣電影網(wǎng)站數(shù)據(jù)采集與分析的采集目標(biāo)功能分析如下。
獲取電影基本信息:電影名稱、導(dǎo)演、演員、上映時(shí)間、評(píng)分等。
獲取電影詳細(xì)信息:劇情簡(jiǎn)介、演職人員、電影標(biāo)簽、制片國(guó)家等。
爬取電影評(píng)論:用戶評(píng)論、評(píng)分等信息。
爬取演員詳細(xì)信息:演員個(gè)人信息、出演電影列表等。
以上功能可以通過豆瓣電影網(wǎng)站的API或者頁(yè)面爬取實(shí)現(xiàn),可以為后續(xù)的
數(shù)據(jù)分析提供基礎(chǔ)數(shù)據(jù)。
2.3關(guān)鍵技術(shù)分析
2.3.1網(wǎng)絡(luò)爬蟲技術(shù)
網(wǎng)絡(luò)爬蟲技術(shù)是一種自動(dòng)化獲取互聯(lián)網(wǎng)數(shù)據(jù)的技術(shù),通常用于從網(wǎng)頁(yè)中提
取所需信息。通過訪問網(wǎng)站并解析網(wǎng)頁(yè)內(nèi)容,網(wǎng)絡(luò)爬蟲可以自動(dòng)抓取和提取所
需的數(shù)據(jù),如文本、圖片、視頻等。網(wǎng)絡(luò)爬蟲技術(shù)已經(jīng)成為許多領(lǐng)域的重要工
具,如商業(yè)數(shù)據(jù)分析、學(xué)術(shù)研究、新聞聚合、社交媒體分析等。但是,網(wǎng)絡(luò)爬
蟲技術(shù)的使用需要遵守相關(guān)法律法規(guī)和道德規(guī)范,同時(shí)應(yīng)尊重網(wǎng)站的隱私和版
權(quán),不進(jìn)行惡意訪問和數(shù)據(jù)濫用。
2.3.2文件存取技術(shù)
MySQL是一種流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),常用于Web應(yīng)用程序的開發(fā)
和管理。MySQL數(shù)據(jù)庫(kù)使用文件存儲(chǔ)數(shù)據(jù),每個(gè)數(shù)據(jù)庫(kù)都是一個(gè)目錄,其中包
含多個(gè)文件,包括表結(jié)構(gòu)和數(shù)據(jù)。MySQL還支持多種存儲(chǔ)引擎,包括InnoDB
和MyISAM等,這些引擎對(duì)文件的組織和管理方式不同,可以根據(jù)需要選擇適
合的引擎。MySQL還支持事務(wù)處理和索引優(yōu)化等功能,使得它成為處理大型數(shù)
據(jù)集的理想選擇。
2.3.3可視化技術(shù)
可視化技術(shù)是指通過圖形化方式將數(shù)據(jù)呈現(xiàn)出來,幫助人們更好地理解和
分析數(shù)據(jù)??梢暬夹g(shù)通常包括圖表、圖像、地圖等形式。它的優(yōu)點(diǎn)在于能夠
讓人們更直觀地了解數(shù)據(jù),并快速發(fā)現(xiàn)數(shù)據(jù)中的模式和趨勢(shì)。在數(shù)據(jù)分析領(lǐng)域,
可視化技術(shù)可以幫助人們更好地理解數(shù)據(jù),從而做出更準(zhǔn)確的決策。在現(xiàn)代數(shù)
3
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
據(jù)處理技術(shù)的發(fā)展中,可視化技術(shù)成為數(shù)據(jù)處理技術(shù)不可或缺的一環(huán),它可以
使復(fù)雜數(shù)據(jù)變得易于理解和應(yīng)用。
3數(shù)據(jù)采集
3.1采集頁(yè)面分析
本次數(shù)據(jù)采集的網(wǎng)站是豆瓣電影網(wǎng),該網(wǎng)站中有各個(gè)分類的電影排行榜數(shù)
據(jù),如下圖3-1所示:
圖3-1電影排行榜分類
點(diǎn)擊其中的分類可以跳轉(zhuǎn)到對(duì)應(yīng)的排行榜中,電影按照評(píng)分升序排序,每
一頁(yè)顯示20條記錄。如點(diǎn)擊“劇情”排行榜,如下圖3-2所示。
圖3-2劇情類別排行榜
在向下瀏覽頁(yè)面的過程中,頁(yè)面會(huì)自動(dòng)刷新,并請(qǐng)求下一頁(yè)數(shù)據(jù),根據(jù)這
個(gè)規(guī)則后續(xù)可以指定相應(yīng)的翻頁(yè)策略。
4
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
需要采集的字段有:電影ID、電影名、電影類別、評(píng)分、類別列表、上映
時(shí)間、國(guó)家、排名、演員列表。了解網(wǎng)站結(jié)構(gòu)之后,需要弄清數(shù)據(jù)使用哪個(gè)接
口返回的,打開瀏覽器開發(fā)者工具進(jìn)行抓包分析,發(fā)現(xiàn)數(shù)據(jù)是從top_list接口
返回的,如下圖3-3所示。
圖3-3抓包分析
在請(qǐng)求該接口時(shí),通過改變傳入的參數(shù)請(qǐng)求到對(duì)應(yīng)頁(yè)面,其中type表示分
類編號(hào)、start表示從多少條記錄開始,limit表示返回多少條數(shù)據(jù)。
3.2獲取分類列表
通過初步的網(wǎng)頁(yè)結(jié)構(gòu)分析,已經(jīng)基本明確的爬蟲的策略,所有請(qǐng)求排行榜
首頁(yè),使用xpath獲取到所有的分類url和分類名稱,如下圖3-4所示。
圖3-4各分類所在的html標(biāo)簽
獲取分類列表的代碼如下所示:
defget_type_and_name(self):
response=requests.get(self.start_url,headers=self.headers)
html=etree.HTML(response.text)
category_url_list=html.xpath('//div[@class="types"]/span/a/@href')
category_name_list=html.xpath('//div[@class="types"]/span/a/text()')
type_and_name=list(
zip(map(lambdax:re.search(r"type=(\d+)",x).group(1),category_url_list),
category_name_list))
5
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
returntype_and_name
這段代碼是一個(gè)DoubleSpider類的中的方法,用于從指定的網(wǎng)頁(yè)中獲取電
影分類的名稱和對(duì)應(yīng)的URL。以下是對(duì)代碼的詳細(xì)解釋。
使用requests庫(kù)發(fā)送GET請(qǐng)求,獲取指定URL的網(wǎng)頁(yè)內(nèi)容,
self.start_url為類的實(shí)例變量,存儲(chǔ)了起始URL,self.headers為類的實(shí)例
變量,存儲(chǔ)了HTTP請(qǐng)求頭部信息,包括User-Agent等。
etree.HTML(response.text):使用lxml庫(kù)中的etree模塊將網(wǎng)頁(yè)內(nèi)容解析成
HTML文檔。
使用XPath表達(dá)式提取HTML文檔中所有分類URL所對(duì)應(yīng)的屬性href的值。
具體來說,該XPath表達(dá)式選取了所有具有class屬性為types的div標(biāo)簽的
子元素span標(biāo)簽下的a標(biāo)簽,然后獲取這些a標(biāo)簽的href屬性的值。
使用XPath表達(dá)式提取HTML文檔中所有分類名稱所對(duì)應(yīng)的文本值。與獲取
a標(biāo)簽的步驟類似,該XPath表達(dá)式選取了所有具有class屬性為types的div
標(biāo)簽的子元素span標(biāo)簽下的a標(biāo)簽,然后獲取這些a標(biāo)簽的文本值。
最后將type的值和分類名稱以元組的形式保存到列表中返回,以便于后續(xù)
方法使用。
3.3多線程爬蟲
由于每個(gè)分類的電影數(shù)據(jù)量較大,并且涉及到的分類數(shù)據(jù)較多,如果使用
傳統(tǒng)的單線程爬蟲效率會(huì)極低,為了能夠高效率采集數(shù)據(jù),這里使用多線程爬
蟲。多線程爬蟲代碼如下所示。
defrequest_category(self):
Thread=[]
type_and_name=self.get_type_and_name()
foritemintype_and_name:
type=item[0]
name=item[1]
print("采集類別{name}".format(name=name))
t1=threading.Thread(target=self.turn_page,args=(type,name,1))
Thread.append(t1)
fortinThread:
t.start()
6
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
fortinThread:
t.join()
這段代碼實(shí)現(xiàn)了對(duì)豆瓣電影網(wǎng)站的所有分類進(jìn)行多線程采集數(shù)據(jù)。以下是
對(duì)代碼的詳細(xì)解釋。
Thread=[]:創(chuàng)建一個(gè)空列表Thread,用于存儲(chǔ)線程對(duì)象。
調(diào)用類的get_type_and_name()方法,獲取所有電影分類的名稱和URL,存
儲(chǔ)在type_and_name變量中。
foritemintype_and_name::對(duì)type_and_name中的每個(gè)元素執(zhí)行循環(huán),
其中item表示當(dāng)前元素,其值為一個(gè)包含分類ID和分類名稱的元組。
type=item[0]和name=item[1]:從當(dāng)前元組中分別獲取分類ID和分類
名稱,存儲(chǔ)在變量type和name中。
t1=threading.Thread(target=self.turn_page,args=(type,name,1)):
創(chuàng)建一個(gè)新的線程對(duì)象t1,并將其賦值給變量t1。target參數(shù)指定線程要執(zhí)行
的目標(biāo)函數(shù),即turn_page()方法;args參數(shù)為一個(gè)元組,其中包含turn_page()
方法需要的參數(shù),分別為分類ID、分類名稱和起始頁(yè)碼。
Thread.append(t1):將線程對(duì)象t1添加到Thread列表中。fortin
Thread::對(duì)Thread列表中的每個(gè)線程對(duì)象執(zhí)行循環(huán),其中t表示當(dāng)前線程對(duì)
象。t.start():?jiǎn)?dòng)當(dāng)前線程對(duì)象。fortinThread::對(duì)Thread列表中的每
個(gè)線程對(duì)象執(zhí)行循環(huán),其中t表示當(dāng)前線程對(duì)象。t.join():等待當(dāng)前線程對(duì)
象執(zhí)行完畢。
這段代碼實(shí)現(xiàn)了多線程采集豆瓣電影網(wǎng)站的所有分類數(shù)據(jù),通過對(duì)每個(gè)分
類開啟一個(gè)線程來提高采集效率。采集過程中,會(huì)打印正在采集的分類名稱,
方便用戶了解當(dāng)前采集進(jìn)度。
3.4翻頁(yè)處理
通過改變top_list接口的start參數(shù)和limit參數(shù)控制翻頁(yè)。如下圖3-5
所示:
7
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖3-5top_list接口參數(shù)
通過編寫turn_page方法實(shí)現(xiàn)翻頁(yè),代碼如下所示。
defturn_page(self,type,name,page):
self.param.update(type=type,name=name)
print("采集第{page}頁(yè)".format(page=page))
try:
self.get_data(name)
start=self.param['start']
self.param.update(start=start+20)
self.turn_page(type,name,page+1)
exceptExceptionase:
print("err===>",e)
這段代碼實(shí)現(xiàn)了采集豆瓣電影網(wǎng)站某個(gè)分類下的所有電影數(shù)據(jù),包括電影
名稱、評(píng)分、導(dǎo)演、主演、制片國(guó)家、年份等信息。
self.param.update(type=type,name=name):將分類ID和分類名稱添加到請(qǐng)求
參數(shù)self.param中。self.get_data(name):調(diào)用類的get_data()方法,采集
當(dāng)前頁(yè)的電影數(shù)據(jù),其中name參數(shù)表示當(dāng)前分類名稱。
start=self.param['start']和self.param.update(start=start+20):
從請(qǐng)求參數(shù)self.param中獲取當(dāng)前頁(yè)碼,將頁(yè)碼加20后再次添加到請(qǐng)求參數(shù)
self.param中,以便獲取下一頁(yè)數(shù)據(jù)。
self.turn_page(type,name,page+1):遞歸調(diào)用turn_page()方法,傳
入分類ID、分類名稱和下一頁(yè)碼,以采集下一頁(yè)數(shù)據(jù)。
這段代碼實(shí)現(xiàn)了遞歸方式采集某個(gè)分類下的所有電影數(shù)據(jù),每次采集一頁(yè)
數(shù)據(jù),然后自動(dòng)跳轉(zhuǎn)到下一頁(yè)繼續(xù)采集,直到采集完所有頁(yè)面為止。遞歸的過
程中,會(huì)輸出正在采集的頁(yè)碼,方便用戶了解當(dāng)前采集進(jìn)度。
3.5獲取電影字段并保存
電影的各個(gè)字段都保存在top_list的response對(duì)象中,response的返回
值是一個(gè)json對(duì)象,通過使用python的json解析庫(kù)處理json對(duì)象,可以使
用python字典取值的方式將各個(gè)字段取出。如下圖3-6所示。
8
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖3-6response返回值
通過編寫get_data來解析各個(gè)字段,代碼如下所示。
defget_data(self,name):
response=requests.get(self.data_url,params=self.param,headers=self.headers)
json_objs=json.loads(response.text)
forjson_objinjson_objs:
result={}
result["id"]=json_obj['id']
result["title"]=json_obj['title']
result["category"]=name
result["score"]=json_obj['score']
result["types"]="|".join(json_obj['types'])
result["release_date"]=json_obj['release_date']
result["regions"]="|".join(json_obj['regions'])
result["rank"]=json_obj['rank']
result["actors"]="|".join(json_obj['actors'])
result["actor_count"]=json_obj['actor_count']
print(result)
self.saveData(result)
iflen(json_objs)<20:
self.param.update(start=0)
raiseException("沒有下一頁(yè)了!")
這段代碼實(shí)現(xiàn)了對(duì)某個(gè)分類下的一頁(yè)電影數(shù)據(jù)進(jìn)行解析和保存,其中包括
電影ID、電影名稱、電影分類、電影評(píng)分、電影類型、上映日期、制片國(guó)家/地
區(qū)、排名、主演和主演人數(shù)等信息。以下是對(duì)代碼的詳細(xì)解釋。
通過發(fā)送HTTPGET請(qǐng)求,獲取當(dāng)前頁(yè)面的電影數(shù)據(jù)。將獲取到的數(shù)據(jù)解析
9
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
成JSON對(duì)象,以便后續(xù)操作。forjson_objinjson_objs::遍歷JSON對(duì)象,
依次處理每個(gè)電影數(shù)據(jù)。result={}:創(chuàng)建一個(gè)字典,用于存儲(chǔ)解析后的電影
數(shù)據(jù)。iflen(json_objs)<20::如果當(dāng)前頁(yè)面不足20條電影數(shù)據(jù),則表示已
經(jīng)到達(dá)最后一頁(yè)。
編寫saveData方法用于將數(shù)據(jù)保存到磁盤。代碼如下所示。
defsaveData(self,result):
json_str=json.dumps(result,ensure_ascii=False)
withopen("doubanData2.json","a",encoding="utf-8")asf:
f.write(json_str+"\n")
這個(gè)方法實(shí)現(xiàn)了將采集到的電影信息寫入到文件中的功能。具體的實(shí)現(xiàn)方
式是使用了Python內(nèi)置的json模塊將Python對(duì)象轉(zhuǎn)換為JSON字符串,并將
其寫入到文件中。這個(gè)方法的參數(shù)result是一個(gè)字典類型,包含了采集到的一
條電影信息,其中包括電影的id、標(biāo)題、分類、評(píng)分、類型、上映日期、制片
國(guó)家/地區(qū)、排名、演員和演員人數(shù)等。在寫入到文件時(shí),首先將result轉(zhuǎn)換
為JSON字符串,然后使用文件的追加模式a將其寫入到文件中。由于在采集過
程中,可能會(huì)采集到相同的電影信息,為了避免重復(fù)寫入,這里采用了追加換
行符\n的方式,以便于下一次寫入時(shí),能夠?qū)懭氲叫碌囊恍?。如下圖3-7所示。
圖3-7doubanData.json文件
10
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
4數(shù)據(jù)清洗與處理
4.1數(shù)據(jù)清洗需求
分析并總結(jié)出網(wǎng)站的數(shù)據(jù)清洗需求如下。
1)使用pandas讀取json文件,并進(jìn)行有效的數(shù)據(jù)清洗。
2)根據(jù)電影ID字段對(duì)數(shù)據(jù)進(jìn)行去重處理。
3)將上映時(shí)間release_date字段切分成年月日三個(gè)字段。
4)將處理完成后的數(shù)據(jù)保存到MySQL中。
原始數(shù)據(jù)格式如下圖4-1所示。
圖4-1json格式
4.2數(shù)據(jù)清洗
數(shù)據(jù)清洗的過程從doubanData.json文件中讀取數(shù)據(jù),進(jìn)行清洗,然后將
數(shù)據(jù)保存到MySQL中。具體的清洗過程可能包括去除重復(fù)行或列、刪除無用的
列或行、處理缺失值、轉(zhuǎn)換數(shù)據(jù)格式、合并、分組、排序等操作。清洗后的數(shù)
據(jù)可以更好地適應(yīng)后續(xù)的數(shù)據(jù)分析和處理需求。
將數(shù)據(jù)保存到MySQL中可以更好地管理和分析數(shù)據(jù),同時(shí)可以方便地與其
他數(shù)據(jù)進(jìn)行關(guān)聯(lián)分析。MySQL是一種流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它提供了許
多高級(jí)數(shù)據(jù)管理和分析工具,可以幫助我們更有效地處理和分析大量的數(shù)據(jù)。
通過將清洗過后的數(shù)據(jù)保存到MySQL中,我們可以更好地利用這些工具來分析
數(shù)據(jù),揭示數(shù)據(jù)中的潛在模式和關(guān)系,以幫助我們做出更明智的商業(yè)決策。
11
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
4.3讀取文件并處理數(shù)據(jù)
Pandas是一個(gè)開源的Python數(shù)據(jù)分析庫(kù),提供了快速、靈活、易用的數(shù)據(jù)
結(jié)構(gòu)和數(shù)據(jù)分析工具,被廣泛應(yīng)用于數(shù)據(jù)清洗、數(shù)據(jù)分析、數(shù)據(jù)可視化等領(lǐng)域。
使用pandas讀取文件并進(jìn)行處理,代碼如下所示。
#讀取json文件
df=pd.read_json('doubanData.json',lines=True,encoding="utf-8")
#數(shù)據(jù)清洗
df=df[['id','title','category','score','types','release_date','regions','rank','actors',
'actor_count']]
df.drop_duplicates(subset=['id'],keep='first',inplace=True)
df[['year','month','day']]=df['release_date'].str.split('-',expand=True)
df.drop('release_date',axis=1,inplace=True)
首先使用pandas的read_json函數(shù)讀取名為doubanData.json的JSON文
件,并將其存儲(chǔ)在名為df的pandasDataFrame中。lines=True表示每行數(shù)據(jù)
是一個(gè)JSON對(duì)象,而不是整個(gè)文件都是一個(gè)JSON對(duì)象。
將df中的列限制在指定的列名中,即id、title、category、score、
types、release_date、regions、rank、actors、actor_count。在dfDataFrame
中根據(jù)id列去除重復(fù)的行,保留第一行。inplace=True表示在原始DataFrame
中進(jìn)行更改,而不是創(chuàng)建一個(gè)新的DataFrame。將df中的release_date列按照
-分割成year、month和day三列,并將它們分配給DataFrame中的新列。
最后在dfDataFrame中刪除release_date列。axis=1表示列,而不是行。
inplace=True表示在原始DataFrame中進(jìn)行更改,而不是創(chuàng)建一個(gè)新的
DataFrame。
4.4保存到MySQL數(shù)據(jù)庫(kù)
數(shù)據(jù)清洗完成之后,為了便于后續(xù)的數(shù)據(jù)分析,需要將清洗之后的數(shù)據(jù)保
存到MySQL中,代碼如下所示。
#連接MySQL數(shù)據(jù)庫(kù)
conn=pymysql.connect(host='00',port=3306,user='root',password='mysql',
db='test',charset='utf8mb4')
12
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
#UPDATEdouban_dataSETtitle=CONVERT(titleUSINGutf8mb4);
#建表語(yǔ)句
table_sql='''
CREATETABLEIFNOTEXISTS`douban_data`(
`id`varchar(50),
`title`varchar(255)CHARACTERSETutf8mb4,
`category`varchar(50)CHARACTERSETutf8mb4,
`score`float(2,1),
`types`textCHARACTERSETutf8mb4,
`regions`textCHARACTERSETutf8mb4,
`rank`int(11),
`actors`textCHARACTERSETutf8mb4,
`actor_count`int(11),
`year`varchar(4)DEFAULTNULL,
`month`varchar(2),
`day`varchar(2),
PRIMARYKEY(`id`)
)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATEutf8mb4_unicode_ci;
'''
#執(zhí)行建表語(yǔ)句
withconn.cursor()ascursor:
cursor.execute(table_sql)
#插入語(yǔ)句
insert_sql='''
INSERTINTO`douban_data`(`id`,`title`,`category`,`score`,`types`,`regions`,`rank`,
`actors`,`actor_count`,`year`,`month`,`day`)
VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
'''
#執(zhí)行插入語(yǔ)句
withconn.cursor()ascursor:
forrowindf.itertuples(index=False):
cursor.execute(insert_sql,row)
13
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
#提交事務(wù)
mit()
#關(guān)閉數(shù)據(jù)庫(kù)連接
conn.close()
這段代碼是將清洗過的數(shù)據(jù)通過pymysql庫(kù)連接MySQL數(shù)據(jù)庫(kù),并創(chuàng)建一
個(gè)名為"douban_data"的數(shù)據(jù)表。在創(chuàng)建表時(shí),定義了表的字段名稱、數(shù)據(jù)類型
和約束,并設(shè)置id字段為主鍵,保證數(shù)據(jù)的唯一性。接著,使用INSERTINTO
語(yǔ)句將清洗過的數(shù)據(jù)逐行插入到數(shù)據(jù)表中,完成數(shù)據(jù)的存儲(chǔ)。在插入完成后,
通過mit()語(yǔ)句提交事務(wù),保證數(shù)據(jù)的完整性。最后使用conn.close()
關(guān)閉數(shù)據(jù)庫(kù)連接。
進(jìn)入MySQL客戶端,可以通過SQL查看數(shù)據(jù)是否正確導(dǎo)入,查看數(shù)據(jù)庫(kù)表
語(yǔ)句如下圖4-2所示。
圖4-2查看douban_data表是否創(chuàng)建成功
查看數(shù)據(jù)是否正確導(dǎo)入,如下圖4-3所示。
圖4-3查看數(shù)據(jù)是否正確導(dǎo)入
14
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
5數(shù)據(jù)統(tǒng)計(jì)與分析
5.1數(shù)據(jù)讀取
MySQL是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),是最流行的開源關(guān)系型數(shù)據(jù)庫(kù)管理系
統(tǒng)之一。作為數(shù)據(jù)分析師,MySQL可以用來存儲(chǔ)和管理各種數(shù)據(jù),并對(duì)其進(jìn)行各
種數(shù)據(jù)分析操作。在本項(xiàng)目中主要使用MySQL進(jìn)行數(shù)據(jù)分析處理。
使用pyechart讀取MySQL的分析結(jié)果,并進(jìn)行可視化。Pyecharts是一個(gè)
基于Echarts.js的Python可視化庫(kù),它通過Python代碼生成各種圖表和地圖,
還支持自定義主題、動(dòng)態(tài)數(shù)據(jù)更新和大規(guī)模數(shù)據(jù)可視化等高級(jí)功能,可以滿足
各種數(shù)據(jù)可視化需求。
5.2數(shù)據(jù)展示
5.2.1統(tǒng)計(jì)每個(gè)電影分類的數(shù)量和平均評(píng)分
編寫SQL統(tǒng)計(jì)每個(gè)電影分類的數(shù)量和平均評(píng)分,如下所示:
SELECTcategory,COUNT(*)AScount,AVG(score)ASavg_score
FROMdouban_data
GROUPBYcategory
ORDERBYAVG(score)desc;
使用pyecharts繪制柱狀圖,通過pymysql庫(kù)連接MySQL數(shù)據(jù)庫(kù),需要提
供數(shù)據(jù)庫(kù)的IP地址、端口、用戶名、密碼、數(shù)據(jù)庫(kù)名稱和字符集等信息。構(gòu)建
SQL查詢語(yǔ)句,使用GROUPBY分組統(tǒng)計(jì)每個(gè)電影分類的數(shù)量和平均評(píng)分,再通
過ORDERBY對(duì)平均評(píng)分進(jìn)行降序排序,以便在柱狀圖中展示。使用pandas庫(kù)的
read_sql方法讀取查詢結(jié)果,將結(jié)果保存在DataFrame中。使用Pyecharts的
Bar方法創(chuàng)建一個(gè)柱狀圖實(shí)例bar。代碼如下所示。
importpymysql
importpandasaspd
frompyecharts.chartsimportBar
frompyechartsimportoptionsasopts
conn=pymysql.connect(host='00',port=3306,user='root',password='mysql',
db='test',charset='utf8mb4')
sql='''
15
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
SELECTcategory,COUNT(*)AScount,AVG(score)ASavg_score
FROMdouban_data
GROUPBYcategory
ORDERBYAVG(score)desc;'''
df=pd.read_sql(sql,conn)
bar=Bar()
bar.add_xaxis(df['category'].tolist())
bar.add_yaxis('數(shù)量',df['count'].tolist(),label_opts=opts.LabelOpts(is_show=False))
bar.add_yaxis('平均評(píng)分',df['avg_score'].tolist(),label_opts=opts.LabelOpts(is_show=False))
bar.set_global_opts(
title_opts=opts.TitleOpts(title='電影分類數(shù)量和平均評(píng)分'),
yaxis_opts=opts.AxisOpts(name='數(shù)量/平均評(píng)分'),
xaxis_opts=opts.AxisOpts(name='分類'),)
bar.render('movie_category.html')
conn.close()
柱狀圖如下圖5-1所示。
圖5-1統(tǒng)計(jì)每個(gè)電影分類的數(shù)量和平均評(píng)分
從數(shù)據(jù)中可以看出,紀(jì)錄片是最受歡迎的電影類別之一,共有212部電影,
平均評(píng)分為8.98分。這表明觀眾對(duì)于真實(shí)事件的關(guān)注和認(rèn)知程度較高。電影數(shù)
量排名前三的電影類型分別是劇情、喜劇和動(dòng)作。這些電影類型都是傳統(tǒng)意義
上的大眾電影,是觀眾們最熟悉的電影類型。但是平均評(píng)分中,動(dòng)畫、冒險(xiǎn)和
16
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
紀(jì)錄片等非傳統(tǒng)電影類型也有較高的評(píng)分。
5.2.2統(tǒng)計(jì)每年上映的電影數(shù)量和平均評(píng)分
編寫SQL統(tǒng)計(jì)每年上映的電影數(shù)量和平均評(píng)分,SQL如下所示。
SELECTyear,COUNT(*)AScount,AVG(score)ASavg_score
FROMdouban_data
WHEREyearISNOTNULL
GROUPBYyear
ORDERBYyear,AVG(score)DESC;
使用pycharts繪制折線圖,按年份升序排序,詳細(xì)代碼如下所示:
importpymysql
importpandasaspd
frompyecharts.chartsimportLine
frompyechartsimportoptionsasopts
conn=pymysql.connect(host='00',port=3306,user='root',password='mysql',
db='test',charset='utf8mb4')
sql='''
SELECTyear,COUNT(*)AScount,AVG(score)ASavg_score
FROMdouban_data
WHEREyearISNOTNULL
GROUPBYyear
ORDERBYyear,AVG(score)DESC;'''
df=pd.read_sql(sql,conn)
line=Line()
line.add_xaxis(df['year'].tolist())
line.add_yaxis('數(shù)量',df['count'].tolist(),label_opts=opts.LabelOpts(is_show=False))
line.add_yaxis('平均評(píng)分',df['avg_score'].tolist(),label_opts=opts.LabelOpts(is_show=False))
line.set_global_opts(
title_opts=opts.TitleOpts(title='每年上映電影數(shù)量和平均評(píng)分'),
yaxis_opts=opts.AxisOpts(name='數(shù)量/平均評(píng)分'),
xaxis_opts=opts.AxisOpts(name='年份'),)
line.render('movie_year.html')
conn.close()
17
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
首先連接到MySQL數(shù)據(jù)庫(kù),然后構(gòu)建SQL查詢語(yǔ)句,使用GROUPBY分組統(tǒng)
計(jì)每年上映的電影數(shù)量和平均評(píng)分,并按照平均評(píng)分降序排序,最后使用
Pyecharts繪制折線圖。繪制的折線圖包括兩條折線,一條表示每年上映的電影
數(shù)量,另一條表示每年上映的電影的平均評(píng)分。折線圖如下圖5-2所示。
圖5-2統(tǒng)計(jì)每年上映的電影數(shù)量和平均評(píng)分
電影產(chǎn)業(yè)是在19世紀(jì)末期開始發(fā)展的,但是在最初的幾十年里,每年上映
的電影數(shù)量很少。直到20世紀(jì)初,每年才開始有兩部或更多電影上映。到了1920
年代,電影產(chǎn)業(yè)開始進(jìn)入黃金時(shí)期,每年上映的電影數(shù)量顯著增加,同時(shí)平均
評(píng)分也保持較高水平。盡管電影產(chǎn)業(yè)在1920年代迎來了巨大的發(fā)展,但是在接
下來的幾十年里,每年上映的電影數(shù)量并沒有顯著增長(zhǎng)。這表明電影市場(chǎng)可能
已經(jīng)開始飽和,而且競(jìng)爭(zhēng)越來越激烈。在這個(gè)時(shí)期,電影評(píng)分也開始有所下降,
盡管總體上仍然保持較高的水平。到了1970年代和1980年代,每年上映的電
影數(shù)量再次顯著增加。這一趨勢(shì)在未來幾十年中持續(xù)下去,直到今天。雖然電
影產(chǎn)業(yè)受到越來越多的競(jìng)爭(zhēng),但是在整個(gè)時(shí)期中,平均評(píng)分保持相對(duì)穩(wěn)定的水
平,表明電影制作的質(zhì)量得到了保證。
5.2.3統(tǒng)計(jì)每個(gè)國(guó)家上映電影的數(shù)量
編寫SQL統(tǒng)計(jì)每個(gè)國(guó)家上映電影的數(shù)量,SQL如下所示。
SELECTSUBSTRING_INDEX(SUBSTRING_INDEX(regions,'|',n),'|',-1)AScountry,
COUNT(*)AScount
FROMdouban_data
18
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
CROSSJOIN(SELECT1ASnUNIONALLSELECT2UNIONALLSELECT3UNION
ALLSELECT4UNIONALLSELECT5)ASnums
WHEREn<=LENGTH(regions)-LENGTH(REPLACE(regions,'|',''))+1
GROUPBYcountry
orderbyCOUNT(*)desc
limit10
SUBSTRING_INDEX(regions,'|',n):使用SUBSTRING_INDEX函數(shù)提取
regions字段中第n個(gè)國(guó)家或地區(qū)之前的所有字符(不包含第n個(gè)國(guó)家或地
區(qū)),這樣得到的字符串就是第n個(gè)國(guó)家或地區(qū)的字符串及之前的所有國(guó)家或
地區(qū)字符串。
SUBSTRING_INDEX(SUBSTRING_INDEX(regions,'|',n),'|',-1):在上面
的字符串中,再次使用SUBSTRING_INDEX函數(shù)提取最后一個(gè)|符號(hào)之后的所有字
符,這樣得到的就是第n個(gè)國(guó)家或地區(qū)的字符串。
CROSSJOIN(SELECT1ASnUNIONALLSELECT2UNIONALLSELECT3UNION
ALLSELECT4UNIONALLSELECT5)ASnums:使用CROSSJOIN語(yǔ)句生成一個(gè)
表,包含了數(shù)字1到5,這些數(shù)字用于提取regions字段中的每個(gè)國(guó)家或地區(qū)。
根據(jù)SQL的查詢結(jié)果繪制餅圖,餅圖如下圖5-3所示。
圖5-3統(tǒng)計(jì)每個(gè)國(guó)家上映電影的數(shù)量
可以看到美國(guó)是上映電影數(shù)量最多的國(guó)家,共有1335部電影上映,其次是
中國(guó)大陸和英國(guó),分別有468部和414部電影上映。中國(guó)香港和法國(guó)的電影數(shù)
19
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
量也相當(dāng)接近,分別是354部。日本、德國(guó)、韓國(guó)、加拿大和意大利則分別有
297、175、141、110和108部電影上映。
可以看出,美國(guó)在電影制作和上映方面仍然是世界領(lǐng)先者,中國(guó)大陸也在
快速發(fā)展。中國(guó)香港和法國(guó)的電影數(shù)量相當(dāng),這表明這兩個(gè)地區(qū)在電影制作方
面的實(shí)力也相當(dāng)。此外,日本、德國(guó)、韓國(guó)、加拿大和意大利也在電影制作方
面有所貢獻(xiàn),但與前面幾個(gè)國(guó)家相比,數(shù)量相對(duì)較少。
然而,這些數(shù)字只代表了電影數(shù)量,而不能反映電影質(zhì)量。要全面評(píng)估一
個(gè)國(guó)家的電影產(chǎn)業(yè),還需要考慮其他因素,如票房、口碑和電影節(jié)獲獎(jiǎng)等。
5.2.4統(tǒng)計(jì)出演電影最多的10個(gè)演員
編寫SQL統(tǒng)計(jì)每個(gè)演員出演電影的數(shù)量,SQL如下所示。
SELECTSUBSTRING_INDEX(SUBSTRING_INDEX(actors,'|',numbers.n),'|',-1)AS
actor_name,COUNT(*)AScount
FROMdouban_data
CROSSJOIN(
SELECT1nUNIONALLSELECT2UNIONALLSELECT3UNIONALLSELECT4
UNIONALLSELECT5UNIONALLSELECT6UNIONALLSELECT7UNIONALL
SELECT8UNIONALLSELECT9UNIONALLSELECT10
)ASnumbers
WHEREnumbers.n<=1+(LENGTH(actors)-LENGTH(REPLACE(actors,'|','')))
GROUPBYactor_name
havingactor_name
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版企業(yè)財(cái)務(wù)數(shù)據(jù)保密合作合同版B版
- 2024版影視作品制作與發(fā)行協(xié)議
- 2024自然人互貸現(xiàn)金協(xié)議樣式大全版B版
- 2024門店勞動(dòng)法執(zhí)行標(biāo)準(zhǔn)勞動(dòng)合同范本解析3篇
- 二零二五年度鋼筋班組勞務(wù)分包安全生產(chǎn)責(zé)任合同3篇
- 專業(yè)測(cè)量員招聘協(xié)議樣本2024
- 二零二五版保險(xiǎn)資金股權(quán)質(zhì)押反擔(dān)保貸款合同3篇
- 二零二五年度床上用品原材料進(jìn)口與加工合同3篇
- 二零二五版人工智能應(yīng)用第三方履約擔(dān)保協(xié)議3篇
- 沈陽(yáng)化工大學(xué)《審計(jì)學(xué)A》2023-2024學(xué)年第一學(xué)期期末試卷
- 腦血管疾病三級(jí)預(yù)防
- HSK標(biāo)準(zhǔn)教程5上-課件-L1
- 人教版五年級(jí)下冊(cè)數(shù)學(xué)預(yù)習(xí)單、學(xué)習(xí)單、檢測(cè)單
- JC-T 746-2023 混凝土瓦標(biāo)準(zhǔn)規(guī)范
- 如何落實(shí)管業(yè)務(wù)必須管安全
- 四年級(jí)上冊(cè)三位數(shù)乘除兩位數(shù)計(jì)算題
- 《水電工程招標(biāo)設(shè)計(jì)報(bào)告編制規(guī)程》
- 2023年甘肅蘭州中考道德與法治試題及答案
- 生產(chǎn)工廠管理手冊(cè)
- 項(xiàng)目工地春節(jié)放假安排及安全措施
- 印染廠安全培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論