豆瓣電影數(shù)據(jù)采集與分析_第1頁(yè)
豆瓣電影數(shù)據(jù)采集與分析_第2頁(yè)
豆瓣電影數(shù)據(jù)采集與分析_第3頁(yè)
豆瓣電影數(shù)據(jù)采集與分析_第4頁(yè)
豆瓣電影數(shù)據(jù)采集與分析_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論