數(shù)據(jù)采集與預(yù)處理(微課版) 課件 第6章 豆瓣電影排行榜數(shù)據(jù)爬取與預(yù)處理_第1頁(yè)
數(shù)據(jù)采集與預(yù)處理(微課版) 課件 第6章 豆瓣電影排行榜數(shù)據(jù)爬取與預(yù)處理_第2頁(yè)
數(shù)據(jù)采集與預(yù)處理(微課版) 課件 第6章 豆瓣電影排行榜數(shù)據(jù)爬取與預(yù)處理_第3頁(yè)
數(shù)據(jù)采集與預(yù)處理(微課版) 課件 第6章 豆瓣電影排行榜數(shù)據(jù)爬取與預(yù)處理_第4頁(yè)
數(shù)據(jù)采集與預(yù)處理(微課版) 課件 第6章 豆瓣電影排行榜數(shù)據(jù)爬取與預(yù)處理_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第六章豆瓣電影排行榜數(shù)據(jù)爬取與預(yù)處理“Python數(shù)據(jù)采集與預(yù)處理目錄CONTENTS豆瓣電影榜數(shù)據(jù)采集目標(biāo)6.1豆瓣網(wǎng)頁(yè)結(jié)構(gòu)分析6.2創(chuàng)建爬蟲(chóng)6.3數(shù)據(jù)預(yù)處理6.4數(shù)據(jù)可視化6.5學(xué)習(xí)目標(biāo)掌握網(wǎng)頁(yè)結(jié)構(gòu)分析方法掌握對(duì)網(wǎng)絡(luò)文本數(shù)據(jù)的爬取操作理解網(wǎng)絡(luò)爬蟲(chóng)請(qǐng)求與相應(yīng)原理掌握對(duì)網(wǎng)絡(luò)采集數(shù)據(jù)的預(yù)處理方法掌握對(duì)文本數(shù)據(jù)可視化的流程豆瓣電影榜數(shù)據(jù)采集目標(biāo)016.1豆瓣電影榜數(shù)據(jù)采集目標(biāo)采集目標(biāo)在本節(jié)中,將會(huì)根據(jù)豆瓣電影Top250的榜單,構(gòu)造爬取的起始頁(yè)面地址,采集每一頁(yè)的電影排行信息,具體包括每部電影的詳情鏈接、影片圖片、影片片名、影片評(píng)分、評(píng)價(jià)人數(shù)、影片概況、相關(guān)信息。6.1豆瓣電影榜數(shù)據(jù)采集目標(biāo)采集目標(biāo)可以很容易的發(fā)現(xiàn),所需要的信息基本上都集中在圖6-2所示紅色方框所組成的容器結(jié)構(gòu)中,通過(guò)后面的結(jié)構(gòu)分析可以發(fā)現(xiàn),每一部電影的信息都被分開(kāi)放在<li>標(biāo)簽的結(jié)構(gòu)中,因此,進(jìn)一步的需求是爬取相應(yīng)<li>標(biāo)簽中的內(nèi)容,實(shí)現(xiàn)從采集到的整塊內(nèi)容中提取出需要的具體信息。準(zhǔn)備工作在準(zhǔn)備爬取數(shù)據(jù)之前,請(qǐng)確保裝已經(jīng)安裝好了Re庫(kù)、BeautifulSoup庫(kù)、Urllib庫(kù)、Xlwt庫(kù)。如果沒(méi)有安裝好,可以參考第二章數(shù)據(jù)采集與存儲(chǔ)的內(nèi)容。豆瓣網(wǎng)頁(yè)結(jié)構(gòu)分析026.2.1宏觀整體頁(yè)面分析從宏觀上整體來(lái)觀察爬取的起始目標(biāo)頁(yè)面。將滾輪滑到頁(yè)面底部,如圖6-3所示,可以發(fā)現(xiàn),一頁(yè)共有25條電影介紹,250條記錄一共被分成了10頁(yè)。一般對(duì)于翻頁(yè)的實(shí)現(xiàn)有兩種方法:①根據(jù)每頁(yè)的電影信息個(gè)數(shù)和每一頁(yè)URL的變化,來(lái)構(gòu)造出新的URL地址,從而進(jìn)行翻頁(yè)操作。②找到頁(yè)面底端的翻頁(yè)數(shù)字按鈕所在的HTML標(biāo)簽,根據(jù)標(biāo)簽中包含的href鏈接,來(lái)實(shí)現(xiàn)跳轉(zhuǎn)到下一頁(yè)。6.2.1宏觀整體頁(yè)面分析從宏觀上整體來(lái)觀察爬取的起始目標(biāo)頁(yè)面。將滾輪滑到頁(yè)面底部,如圖6-3所示,可以發(fā)現(xiàn),一頁(yè)共有25條電影介紹,250條記錄一共被分成了10頁(yè)。一般對(duì)于翻頁(yè)的實(shí)現(xiàn)有兩種方法:①根據(jù)每頁(yè)的電影信息個(gè)數(shù)和每一頁(yè)URL的變化,來(lái)構(gòu)造出新的URL地址,從而進(jìn)行翻頁(yè)操作。②找到頁(yè)面底端的翻頁(yè)數(shù)字按鈕所在的HTML標(biāo)簽,根據(jù)標(biāo)簽中包含的href鏈接,來(lái)實(shí)現(xiàn)跳轉(zhuǎn)到下一頁(yè)。本章使用第一種方法來(lái)進(jìn)行翻頁(yè)操作6.2.1宏觀整體頁(yè)面分析最后,在完成翻頁(yè)操作后便可以思考在每一頁(yè)上該如何爬取信息,也就是從宏觀開(kāi)始逐漸走向微觀。通過(guò)觀察頁(yè)面可以發(fā)現(xiàn),每一條電影信息條目都是整齊且有規(guī)律的垂直排列在一起,通過(guò)開(kāi)發(fā)者控制臺(tái)的元素選取可以尋找它們?cè)贖TML中的擺放規(guī)律,從而達(dá)到自動(dòng)篩選和爬取每一個(gè)電影條目。6.2.2微觀具體信息爬取外層以排行第一的電影“肖申克的救贖”為例,我們選中它可以發(fā)現(xiàn)其整個(gè)電影條目都存在于一個(gè)<li>標(biāo)簽下,而且與其并列的還有多個(gè)<li>標(biāo)簽,這些未展開(kāi)的標(biāo)簽中包含的就是按照名次順序排列的其他電影條目。如圖6-7所示,點(diǎn)開(kāi)前兩個(gè)<li>標(biāo)簽,可以發(fā)現(xiàn)剛好對(duì)應(yīng)的就是前兩名“肖申克的救贖”和“霸王別姬”這兩部電影。6.2.2微觀具體信息爬取內(nèi)層在準(zhǔn)確的找得到所需信息的具體所在位置后,本案例的爬取思路已經(jīng)很明確了:宏觀上爬完每一頁(yè)需要自動(dòng)翻頁(yè),并且需要定位到存放各個(gè)電影條目的<li>標(biāo)簽;微觀上需要以<li>標(biāo)簽為單位遍歷爬取,在每一個(gè)<li>標(biāo)簽下抽取出每一個(gè)條目的具體信息。創(chuàng)建爬蟲(chóng)03爬蟲(chóng)流程04030201保存數(shù)據(jù)在6.3.3提取數(shù)據(jù)中已經(jīng)知道datalist是一個(gè)二維列表,根據(jù)datalist中的數(shù)據(jù)存放結(jié)構(gòu)進(jìn)一步便可以進(jìn)行數(shù)據(jù)保存的工作。提取數(shù)據(jù)獲取到了網(wǎng)頁(yè)內(nèi)容之后,就可以完成有用信息提取工作,提取出最終需要的具體數(shù)據(jù)內(nèi)容。請(qǐng)求與響應(yīng)在準(zhǔn)備好URL之后,便需要進(jìn)行請(qǐng)求發(fā)送以及獲取響應(yīng)數(shù)據(jù)。請(qǐng)求及相應(yīng)操作都使用一個(gè)askURL()函數(shù)來(lái)實(shí)現(xiàn)。準(zhǔn)備url爬蟲(chóng)的第一步便是構(gòu)造出爬取目標(biāo)的起始URL,找到了有效的目標(biāo),繼而才能深入的取抓取想要的數(shù)據(jù)。6.3.1準(zhǔn)備URL6.3.1準(zhǔn)備URL導(dǎo)入包和設(shè)計(jì)主函數(shù)在主函數(shù)中定義出起始URL地址baseurl:/top250?start=。然后,將baseurl作為參數(shù)傳入getData()函數(shù)中,之后在getData()函數(shù)中將實(shí)現(xiàn)start參數(shù)從零開(kāi)始的自增,從而實(shí)現(xiàn)翻頁(yè)。最后,getData()函數(shù)將獲取到的每一頁(yè)數(shù)據(jù)作為一個(gè)整體作為返回值返回。這里將完整的主函數(shù)代碼展示在左方。importrefrombs4importBeautifulSoupimporturllibimportxlwtif__name__=="__main__":baseurl=/top250?start=#爬取網(wǎng)頁(yè)datalist=getData(baseurl)#保存路徑savepath="./豆瓣電影Top250.xls"#保存數(shù)據(jù)saveData(datalist,savepath)6.3.1準(zhǔn)備URL在getData()函數(shù)中將會(huì)進(jìn)一步構(gòu)造URL,再將構(gòu)造好的URL傳遞給調(diào)用的askURL()函數(shù)中,實(shí)現(xiàn)網(wǎng)頁(yè)數(shù)據(jù)的獲取。getData()函數(shù)采用一個(gè)for循環(huán)來(lái)遍歷10次,每一次都爬取一頁(yè)內(nèi)容的數(shù)據(jù),在每次循環(huán)的開(kāi)始,使用字符串拼接的方式來(lái)更新出下一頁(yè)的URL地址,實(shí)現(xiàn)翻頁(yè)操作。foriinrange(0,10):

url=baseurl+str(i*25) html=askURL(url) ………………6.3.2請(qǐng)求與響應(yīng)askURL()函數(shù)首先,定義一個(gè)字典header,其中只包含用戶(hù)頭信息User-Agent。接著,將請(qǐng)求對(duì)象req傳入urlopen()函數(shù)中,進(jìn)行請(qǐng)求發(fā)送操作,得到一個(gè)response響應(yīng)對(duì)象。最后,使用read()函數(shù)來(lái)讀取相應(yīng)內(nèi)容,并且按照“UTF-8”的形式來(lái)進(jìn)行解碼,將讀取到的內(nèi)容賦值給字符串html。整個(gè)askURL()函數(shù)的完整代碼如右所示。#得到一個(gè)指定URL網(wǎng)頁(yè)的內(nèi)容defaskURL(url):#設(shè)置請(qǐng)求頭信息

header={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)""Chrome/85.0.4183.83Safari/537.36Edg/85.0.564.44"}#構(gòu)造請(qǐng)求頭對(duì)象

req=urllib.request.Request(url=url,headers=header)html=""6.3.2請(qǐng)求與響應(yīng)askURL()函數(shù)在askURL()函數(shù)中,將最終讀取到的響應(yīng)內(nèi)容的字符串形式作為返回值返回,并且針對(duì)于獲取響應(yīng)這一步驟使用了異常捕獲操作,對(duì)異常信息進(jìn)行打印。try:#發(fā)送請(qǐng)求獲取響應(yīng)

response=urllib.request.urlopen(req)html=response.read().decode("utf-8")#print(html)

#捕獲異常信息

excepturllib.error.URLErrorase:ifhasattr(e,"code"):print(e.code)ifhasattr(e,"reason"):print(e.reason)returnhtml6.3.3提取數(shù)據(jù)正則表達(dá)目前我們已經(jīng)知道,每一條電影信息都是按照一定的規(guī)律和結(jié)構(gòu)來(lái)顯示和排列的。同樣的,在網(wǎng)頁(yè)源代碼中也是如此編排,所以,可以使用某種規(guī)范的格式來(lái)提取想要的數(shù)據(jù),因此正則表達(dá)式開(kāi)始發(fā)揮其作用。6.3.3提取數(shù)據(jù)#影片詳情鏈接findlink=pile(r'<ahref="(.*?)">')#影片圖片findImgSrc=pile(r'<img.*src="(.*?)"',re.S)#影片片名findTitle=pile(r'spanclass="title">(.*)</span>')#影片評(píng)分findRating=pile(r'<spanclass="rating_num"property="v:average">(.*)</span>')#評(píng)價(jià)人數(shù)findJudge=pile(r'<span>(\d*)人評(píng)價(jià)</span>')#概況findInq=pile(r'<spanclass="inq">(.*)</span>')#影片相關(guān)內(nèi)容findBD=pile(r'<pclass="">(.*?)</p>',re.S)6.3.3提取數(shù)據(jù)(1)對(duì)于影片詳情鏈接,在圖中可以看到,其包含在<a>標(biāo)簽中的href屬性中,于是我們鎖定了所需信息條目的上下文。而針對(duì)所需提取的內(nèi)容,采用(.*?)的形式來(lái)獲取,括號(hào)內(nèi)是目標(biāo)內(nèi)容,“.*?”表示0個(gè)或多個(gè)任意字符出現(xiàn)0次或1次,也就是說(shuō)要提取出上下文之間的所有字符內(nèi)容。pile()函數(shù)將正則表達(dá)式的字符串形式編譯為一個(gè)Pattern對(duì)象返回給findlink,通過(guò)Pattern對(duì)象提供的一系列方法,可以對(duì)文本進(jìn)行相應(yīng)的匹配查找。(2)同樣找到圖片鏈接的上下文信息,發(fā)現(xiàn)其在img標(biāo)簽的src屬性中,而在img到src之間有很長(zhǎng)一串上下文字符,可以采用“.*”的方式來(lái)替代之間的字符,以簡(jiǎn)化書(shū)寫(xiě)。此外,在向pile()函數(shù)中傳參的時(shí)候,新加入了re.S參數(shù),其作用是將點(diǎn)“.”的作用擴(kuò)展到整個(gè)字符串,包括“\n”。正則表達(dá)式中,“.”的作用是匹配除“\n”以外的任何字符,也就是說(shuō),它是在一行中進(jìn)行匹配。這里的“行”是以“\n”進(jìn)行區(qū)分的。如果不使用re.S參數(shù),則只在每一行內(nèi)進(jìn)行匹配,如果一行沒(méi)有,就換下一行重新開(kāi)始,不會(huì)跨行。而使用re.S參數(shù)以后,正則表達(dá)式會(huì)將這個(gè)字符串作為一個(gè)整體,將“\n”當(dāng)做一個(gè)普通的字符加入到這個(gè)字符串中,在整體中進(jìn)行匹配。(5)評(píng)價(jià)人數(shù)正則書(shū)寫(xiě)時(shí),由于只需要提取人數(shù)數(shù)字,所以將數(shù)字后的“人評(píng)價(jià)”這三個(gè)漢字也作為上下文的一部分顯式的書(shū)寫(xiě)出來(lái),只提取前面的數(shù)字。6.3.3提取數(shù)據(jù)編寫(xiě)getData()外層循環(huán)首先,如前面6.3.1準(zhǔn)備URL小節(jié)中所述,在函數(shù)中用一個(gè)for循環(huán)實(shí)現(xiàn)翻頁(yè)操作,每循環(huán)一次得到一個(gè)指定url網(wǎng)頁(yè)的內(nèi)容;其次,將得到的html網(wǎng)頁(yè)字符串內(nèi)容使用BeautifulSoup(html,“html.parser”)來(lái)創(chuàng)建一個(gè)BeautifulSoup對(duì)象,其中html.parser是我們所指定的解析器;最后就可以使用soup.find_all()函數(shù)在該BeautifulSoup對(duì)象中查找符合要求的內(nèi)容,形成列表,進(jìn)而使用正則表達(dá)式來(lái)提取相關(guān)內(nèi)容。該部分代碼如下所示:#爬取網(wǎng)頁(yè)defgetData(baseurl):datalist=[]foriinrange(0,10):url=baseurl+str(i*25)html=askURL(url)

#逐一解析數(shù)據(jù)

soup=BeautifulSoup(html,"html.parser")#查找符合要求的內(nèi)容,形成列表

foriteminsoup.find_all('div',class_="item"):①……6.3.3提取數(shù)據(jù)編寫(xiě)getData()外層循環(huán)在上面代碼①處的循環(huán)中,使用soup.find_all(‘div’,class_=“item”)來(lái)提取出soup中所有div標(biāo)簽中class屬性為item的內(nèi)容,并且是返回所有匹配到的結(jié)果(如果只是soup.find()函數(shù),則只返回查找到的第一個(gè)結(jié)果),其將所有匹配到的bs4.element.Tag對(duì)象拼接為一個(gè)列表,之后將在循環(huán)中對(duì)列表中的元素進(jìn)行遍歷。如圖所示,可以看到class屬性為item的標(biāo)簽內(nèi)容有多個(gè),而且每一個(gè)<divclass=”item”>的內(nèi)容即為一個(gè)電影條目,所以該匹配結(jié)果列表即為所有電影條目的集合,其中每一個(gè)元素即為一個(gè)電影條目。接下來(lái),在for循環(huán)中遍歷每一個(gè)匹配到的結(jié)果,也就是每一個(gè)電影條目信息,從中使用前面寫(xiě)好的正則表達(dá)式來(lái)提取出具體的每一個(gè)信息。6.3.3提取數(shù)據(jù)編寫(xiě)getData()內(nèi)層循環(huán)定義一個(gè)空列表data,用來(lái)保存每次循環(huán)所匹配到的結(jié)果,并且將之前在soup中查找到的bs4.element.Tag對(duì)象轉(zhuǎn)化為字符串,以方便后面的正則匹配。有了data與轉(zhuǎn)型后的item后,便可以開(kāi)始進(jìn)行正則匹配。使用re模塊中的findall()函數(shù)來(lái)進(jìn)行匹配,其第一個(gè)參數(shù)findlink是影片詳情的正則表達(dá)式,第二個(gè)參數(shù)item是要匹配的內(nèi)容,函數(shù)匹配到的結(jié)果會(huì)是一個(gè)字符串?dāng)?shù)組。findall()函數(shù)返回item中所有與正則pattern匹配的全部字符串,以數(shù)組的形式返回,但我們只需要取返回?cái)?shù)組中的第一個(gè)結(jié)果元素。data=[]item=str(item)#影片詳情的鏈接link=re.findall(findlink,item)[0]data.append(link)#圖片詳情的鏈接imgSrc=re.findall(findImgSrc,item)[0]data.append(imgSrc)6.3.3提取數(shù)據(jù)編寫(xiě)getData()內(nèi)層循環(huán)接下來(lái)進(jìn)行對(duì)影片片名findTitle的提取。通過(guò)觀察可以發(fā)現(xiàn),影片片名通常不止一個(gè),還有除了中文名的英文原名,以及其他地區(qū)對(duì)該電影的不同中文翻譯。這里我們只提取屬性為title的大陸中文譯名和英文原名。在書(shū)寫(xiě)代碼的時(shí)候,需要將中文名與英文名分開(kāi)保存,于是需要使用if語(yǔ)句來(lái)判斷匹配結(jié)果中的元素個(gè)數(shù),如果title的長(zhǎng)度為2,這說(shuō)明有中英兩個(gè)片名,如果title的長(zhǎng)度為1,則說(shuō)明只有一個(gè)中文名,但此時(shí)仍需要將英文名的位置空出,用空格占位即可,以此來(lái)保證片名的存儲(chǔ)格式相同。此外在匹配到的英文名內(nèi)容中,經(jīng)常會(huì)有“/”這個(gè)特殊字符,使用replace()函數(shù)將其替換去掉即可。#影片片名titles=re.findall(findTitle,item)#判斷是否有英文名iflen(titles)==2:ctitle=titles[0]data.append(ctitle)#去掉特殊字符otitle=titles[1].replace("/","")data.append(otitle)else:data.append(titles[0])#只有一個(gè)中文名的時(shí)候,將英文名的位置用空格占位data.append("")6.3.3提取數(shù)據(jù)編寫(xiě)getData()內(nèi)層循環(huán)繼續(xù)對(duì)影片評(píng)分findRating和影片評(píng)價(jià)人數(shù)findJudge以及影片概況finInq進(jìn)行匹配。同理,取數(shù)組第一個(gè)元素內(nèi)容。在影片概況匹配時(shí),將句末句號(hào)去掉。#影片評(píng)分rating=re.findall(findRating,item)[0]data.append(rating)#評(píng)價(jià)人數(shù)judgeNum=re.findall(findJudge,item)[0]data.append(judgeNum)#影片概況inq=re.findall(findInq,item)iflen(inq)!=0:#去掉句號(hào)

inq=inq[0].replace("。","")data.append(inq)else:#如果沒(méi)有一句話概況,空格占位,保持格式一致

data.append("")6.3.3提取數(shù)據(jù)編寫(xiě)getData()內(nèi)層循環(huán)最后,對(duì)影片相關(guān)內(nèi)容findBD進(jìn)行匹配。使用finall()函數(shù)提取出所需要的內(nèi)容,但將得到的bd中內(nèi)容輸出后可以看到,目前所提取出的內(nèi)容中有很多空格和“/”字符以及<br/>換行符,這些都是不需要的,于是采用re模塊中的sub()函數(shù)來(lái)進(jìn)行替換。sub()函數(shù)常用的參數(shù)為前三個(gè)。第一個(gè)參數(shù)為正則中的模式字符串,也就是我們想要替換的內(nèi)容;第二個(gè)參數(shù)為想要替換成的字符串,也可以是個(gè)函數(shù);第三個(gè)參數(shù)為表示要被處理(查找替換)的原始字符串。在去掉<br/>換行符時(shí)需要注意,我們使用了正則表達(dá)“<br(\s+)?/>(\s+)?”來(lái)進(jìn)行替換,其中的“(\s+)?”表示匹配一個(gè)或多個(gè)出現(xiàn)了0次或1次的空白字符,“\s”表示匹配任意空白字符。這樣做的目的是防止<br/>標(biāo)簽中或者后面出現(xiàn)空格而導(dǎo)致某些換行符無(wú)法匹配。6.3.3提取數(shù)據(jù)#影片相關(guān)內(nèi)容bd=re.findall(findBD,item)[0]#去掉<br/>換行符bd=re.sub('<br(\s+)?/>(\s+)?',"",bd)#去掉/bd=re.sub('/',"",bd)#去掉前后文中的空格data.append(bd.strip())datalist.append(data)至此,單個(gè)電影條目的信息提取工作都已經(jīng)完成,每次循環(huán)都會(huì)將一個(gè)處理好的電影條目信息存儲(chǔ)在data列表中,在循環(huán)末尾,我們將data作為一個(gè)整體再次存放到getData()函數(shù)開(kāi)頭時(shí)定義的datalist列表中,這樣在datalist列表中便分門(mén)別類(lèi)的存儲(chǔ)了每一個(gè)電影條目的各類(lèi)信息。將datalist作為getData(baseurl)函數(shù)的返回值返回后,就可以在datalist的基礎(chǔ)上進(jìn)行數(shù)據(jù)保存的工作了。6.3.4保存數(shù)據(jù)在6.3.3提取數(shù)據(jù)中已經(jīng)知道datalist是一個(gè)二維列表,根據(jù)datalist中的數(shù)據(jù)存放結(jié)構(gòu)進(jìn)一步便可以進(jìn)行數(shù)據(jù)保存的工作。通過(guò)saveData(datalist,savepath)函數(shù)來(lái)將數(shù)據(jù)保存到本地,在該函數(shù)中使用到了Xlwt庫(kù),它是一個(gè)操作Excel的擴(kuò)展工具。通過(guò)這個(gè)三方庫(kù)的使用,可以很容易的對(duì)Excel進(jìn)行一系列的創(chuàng)建、設(shè)置、保存等操作,例如其可以創(chuàng)建表單、寫(xiě)入指定單元格、指定單元格樣式等人工實(shí)現(xiàn)的功能,在Excel中常用的功能,該擴(kuò)展包都可以實(shí)現(xiàn),達(dá)到了Excel工作自動(dòng)化的目標(biāo)。此外Xlwt庫(kù)主要用于對(duì)Excel進(jìn)行編輯,其只能用于寫(xiě)Excel,當(dāng)需要讀取Excel內(nèi)容的時(shí)候則需要使用Xlrd模塊,其用于讀取Excel中的數(shù)據(jù),兩個(gè)庫(kù)相互配套使用。存儲(chǔ)數(shù)據(jù)為.xls文件6.3.4保存數(shù)據(jù)defsaveData(datalist,savepath):#創(chuàng)建一個(gè)Workbook對(duì)象,并設(shè)置編碼

book=xlwt.Workbook(encoding="utf-8",style_compression=0)#創(chuàng)建一個(gè)worksheetsheet=book.add_sheet('豆瓣電影Top250',cell_overwrite_ok=True)#設(shè)置每列列名

col=("電影詳情連接","圖片鏈接","影片中文名","影片外國(guó)名","評(píng)分","評(píng)價(jià)數(shù)","概況","相關(guān)信息")foriinrange(0,8):sheet.write(0,i,col[i])foriinrange(0,250):#外層循環(huán)定位行print("第%d條"%i)data=datalist[i]forjinrange(0,8):#內(nèi)層循環(huán),定位列sheet.write(i+1,j,data[j])book.save(savepath)數(shù)據(jù)預(yù)處理04#導(dǎo)入包importpandasaspdimportnumpyasnpimportmatplotlib.pyplotasplt6.4數(shù)據(jù)預(yù)處理導(dǎo)入所需包#讀取本地?cái)?shù)據(jù)file='豆瓣電影Top250.xls'temp=pd.read_excel(file)temp.head(10)讀取數(shù)據(jù)#數(shù)據(jù)探索temp.shape()數(shù)據(jù)探索6.4數(shù)據(jù)預(yù)處理數(shù)據(jù)探索info()函數(shù)數(shù)據(jù)探索describe()函數(shù)讀取數(shù)據(jù)#統(tǒng)計(jì)數(shù)據(jù)缺失值temp.isnull().sum()6.4數(shù)據(jù)預(yù)處理數(shù)據(jù)缺失值檢測(cè)#統(tǒng)計(jì)重復(fù)值temp.duplicated().sum()重復(fù)值檢測(cè)#屬性規(guī)約data=temp[['影片中文名','評(píng)分','評(píng)價(jià)數(shù)','概況']]異常值檢測(cè)和屬性規(guī)約6.4數(shù)據(jù)預(yù)處理異常值檢測(cè)和屬性規(guī)約數(shù)據(jù)缺失值檢測(cè)#評(píng)價(jià)人數(shù)排序data.sort_values(by='評(píng)價(jià)數(shù)',ascending=False)6.4數(shù)據(jù)預(yù)處理數(shù)據(jù)排序#根據(jù)評(píng)分這一字段進(jìn)行分組group=data.groupby("評(píng)分")foriinlist(group):print(i)group_count=group.count()group_count.sort_index(inplace=True)分組聚合6.4數(shù)據(jù)預(yù)處理數(shù)據(jù)排序使用sort_value()函數(shù)對(duì)“評(píng)價(jià)數(shù)”這一列排序,并指定了按照降序排列,該函數(shù)默認(rèn)是升序。分組聚合通過(guò)count()函數(shù)則可以對(duì)每一個(gè)分組統(tǒng)計(jì)其中的條目個(gè)數(shù),并且使用sort_index()函數(shù)對(duì)索引進(jìn)行排序,讓分?jǐn)?shù)從上至下依次遞增。數(shù)據(jù)可視化056.5數(shù)據(jù)可視化#設(shè)置繪圖顯示中文字體plt.rcParams['font.sans-serif']=['MicrosoftYaHei']#對(duì)數(shù)據(jù)取步長(zhǎng)x=data.iloc[::4,0]y=data.iloc[::4,2]#設(shè)置

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論