版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
項目五
爬取動態(tài)網(wǎng)頁通過對本章的學(xué)習(xí),了解動態(tài)網(wǎng)頁應(yīng)用場景,理解動態(tài)網(wǎng)頁特征,理解動態(tài)網(wǎng)頁工作原理,理解AJAX和API,熟悉IE開發(fā)者工具,掌握JSON庫的應(yīng)用,掌握異步GET與POST請求。了解動態(tài)網(wǎng)頁應(yīng)用場景。理解動態(tài)網(wǎng)頁特征。理解動態(tài)網(wǎng)頁工作原理。理解AJAX和API。熟悉IE開發(fā)者工具。掌握JSON庫的應(yīng)用。掌握異步GET與POST請求。在實際過程中,常常會遇到需要爬取動態(tài)網(wǎng)頁數(shù)據(jù)的情況。我們知道每單擊一個鏈接,瀏覽器就會短暫地“白屏”一下,然后才會進入一個新的頁面。不同的頁面,網(wǎng)址也是不一樣的。隨著技術(shù)的不斷進步,現(xiàn)在不少網(wǎng)站已經(jīng)引入了異步加載技術(shù),單擊新的鏈接以后,幾乎看不到“白屏”的現(xiàn)象了。而且更神奇的是,單擊了鏈接,網(wǎng)頁中的內(nèi)容已經(jīng)發(fā)生了改變,但是網(wǎng)址沒有變。還有一些內(nèi)容可以部分變化刷新。在本章中,我們學(xué)習(xí)動態(tài)網(wǎng)頁特征、動態(tài)網(wǎng)頁爬取的相關(guān)知識、通過典型的案例,來詳細介紹爬取動態(tài)網(wǎng)頁數(shù)據(jù)的基本思路和步驟。5.1應(yīng)用場景
現(xiàn)在主流網(wǎng)站基本上都是動態(tài)網(wǎng)頁,這些網(wǎng)頁大多使用JavaScript展現(xiàn)網(wǎng)頁內(nèi)容,與靜態(tài)網(wǎng)頁不同的是,使用JavaScript時,很多內(nèi)容并不會出現(xiàn)在HTML源代碼中。例如,簡書的動態(tài)網(wǎng)頁,網(wǎng)址如下:/,打開頁面如圖5-1所示。5.2動態(tài)網(wǎng)頁特征
首先,簡單看一下動態(tài)網(wǎng)頁的特征:從源代碼的特征看,動態(tài)網(wǎng)頁的數(shù)據(jù)不會出現(xiàn)在網(wǎng)頁源代碼中,而是被“藏”起來了。在瀏覽器地址欄輸入以下網(wǎng)址,可以看到百度翻譯,頁面如圖5-2所示。/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh#auto/zh/動態(tài)網(wǎng)頁的特征:從網(wǎng)址特征看,請求新數(shù)據(jù)時(如下拉或翻頁),當(dāng)前網(wǎng)頁數(shù)據(jù)內(nèi)容已更新變化,而網(wǎng)址不會變化。在瀏覽器地址欄輸入地址“/gallery/”,可以看到豆瓣話題廣場,頁面如圖5-5所示。拖動右側(cè)的下拉滾動條,話題精選動態(tài)內(nèi)容會不斷增加,地址欄的網(wǎng)址始終沒有改變,一直是/gallery/。動態(tài)網(wǎng)頁的特征:從技術(shù)特征看,常用以下4種動態(tài)網(wǎng)頁技術(shù)。(1)CGI(2)ASP(3)PHP(4)JSP當(dāng)用戶請求的是一個動態(tài)網(wǎng)頁時,服務(wù)器要做更多的工作才能把用戶請求的信息發(fā)送回去,服務(wù)器一般按照以下步驟進行工作。步驟1:服務(wù)器端接受請求。步驟2:Web服務(wù)器從服務(wù)器硬盤指定的位置或內(nèi)存中讀取動態(tài)網(wǎng)頁文件。步驟3:執(zhí)行網(wǎng)頁文件的程序代碼,將含有程序代碼的動態(tài)網(wǎng)頁轉(zhuǎn)化為標(biāo)準的靜態(tài)頁面(如HTML)。步驟4:Web服務(wù)器將生成的靜態(tài)頁面代碼發(fā)送給請求瀏覽器。5.3動態(tài)網(wǎng)頁爬取
動態(tài)網(wǎng)頁就是AsynchronousJavascriptAndXML(簡稱“AJAX”),也就是異步JavaScript和XML。動態(tài)網(wǎng)頁在后臺服務(wù)器進行少量數(shù)據(jù)交換就可以使網(wǎng)頁實現(xiàn)異步更新。它是一種使用現(xiàn)有技術(shù)集合的“新”方法,包括HTML
或
XHTML、CSS、JavaScript、
DOM、XML、
XSLT,以及最重要的XMLHttpRequest。使用Ajax技術(shù)網(wǎng)頁應(yīng)用能夠快速地將增量更新呈現(xiàn)在用戶界面上,而不需要重載(刷新)整個頁面,這使得程序能夠更快地回應(yīng)用戶的操作。在具體網(wǎng)頁代碼中,AJAX一般通過XMLHttpRequest對象接口發(fā)送請求,XMLHttpRequest一般被縮寫為“XHR”。用戶點擊網(wǎng)絡(luò)面板上漏斗形的過濾按鈕,可以過濾出XHR請求,再挨個查看每個請求,通過訪問路徑和預(yù)覽,即可找到包含信息的請求。
XMLHttpRequest對象通過responseText、responseBody、responseStream或responseXML屬性獲取響應(yīng)信息,如表5-1所示。響應(yīng)信息描述responseBody將響應(yīng)信息正文以UnsignedByte數(shù)組形式返回responseStream
以ADOStream對象的形式返回響應(yīng)信息responseText將響應(yīng)信息作為字符串返回responseXML將響應(yīng)信息格式化為XML文檔格式返回[例5-1]在百度翻譯中輸入一個單詞,查看翻譯結(jié)果。代碼如下:importrequestsimportjsonif__name__=='__main__':#指定urlurl='/sug'#進行UA偽裝header={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/70.0.3538.25Safari/537.36Core/1.70.3775.400QQBrowser/10.6.4208.400'}#參數(shù)處理#data相當(dāng)于get請求中的params,表示請求所帶的參數(shù)(也是一個字典類型數(shù)據(jù))#post請求參數(shù)處理(和get請求一致)word=input('請輸入要翻譯的單詞:') #這樣翻譯單詞就變成動態(tài)的了data={'kw':word}#請求發(fā)送response=requests.post(url=url,data=data,headers=header)#獲取相應(yīng)數(shù)據(jù)#json()方法返回的是一個對象#如果確定相應(yīng)數(shù)據(jù)是json類型的,才可以使用json()方法進行對象的返回dic_obj=response.json()print(dic_obj)print('數(shù)據(jù)打印結(jié)束!')
輸入單詞people運行結(jié)果如下。請輸入要翻譯的單詞:people{'errno':0,'data':[{'k':'people','v':'n.人民;人,人類;居民;種族vt.居住于,布滿;使住滿人,在…殖民;把動物放養(yǎng)在'},{'k':'People','v':'[人名]皮普爾'},{'k':'peopled','v':'vt.居住于,布滿(people的過去式與過去分詞形式)'},{'k':'peoples','v':'n.人民;人(people的名詞復(fù)數(shù));家人;種族'},{'k':'Peoples','v':'[人名][英格蘭人姓氏]皮普爾斯取自父名,來源于People,含義是“皮普爾之子”(sonof'}]}數(shù)據(jù)打印結(jié)束!輸入單詞sunday
運行結(jié)果如下。請輸入要翻譯的單詞:sunday{'errno':0,'data':[{'k':'Sunday','v':'n.星期日,星期天;每逢星期日出版的報紙;星期日報;[人名]森迪'},{'k':'Sundays','v':'adv.于每星期日n.星期天;星期日(Sunday的名詞復(fù)數(shù));每逢星期日出版的報紙;'},{'k':'Sundayrun','v':'n.長距離,星期日旅行'},{'k':'Sundaypunch','v':'n.對付敵人最厲害的一著'},{'k':'sundaypunch','v':'[體]最厲害的一擊'}]}數(shù)據(jù)打印結(jié)束!請確認修改是否正確?sunday
在動態(tài)網(wǎng)頁的網(wǎng)頁文件中,除了有HTML外,還有一些特定功能的程序代碼。通過這些代碼,瀏覽器跟服務(wù)器可以交互,即服務(wù)器可以根據(jù)瀏覽器的請求生成網(wǎng)頁內(nèi)容。通俗的說就是,當(dāng)我們打開動態(tài)網(wǎng)頁時,服務(wù)器不會一次性返回所有頁面內(nèi)容,我們需要哪些內(nèi)容,通過瀏覽器與服務(wù)器交互,服務(wù)器再返回對應(yīng)的內(nèi)容。這種加載數(shù)據(jù)的方式稱為API加載數(shù)據(jù)。API(ApplicationProgrammingInterface)即應(yīng)用程序編程接口,也就是網(wǎng)頁和服務(wù)器交互的途徑。具體來看,爬取動態(tài)網(wǎng)頁數(shù)據(jù)主要可分為以下步驟。步驟1:分析網(wǎng)頁結(jié)構(gòu),查找數(shù)據(jù)接口;步驟2:構(gòu)造請求頭,請求接口數(shù)據(jù);步驟3:解析接口數(shù)據(jù);步驟4:儲存數(shù)據(jù);如果涉及多頁的數(shù)據(jù),需要分析接口的變化規(guī)律,參看以下步驟。步驟1:分析單頁網(wǎng)頁結(jié)構(gòu),查找數(shù)據(jù)接口;步驟2:分析接口變化規(guī)律,構(gòu)造接口參數(shù);步驟3:循環(huán)請求、獲取并解析數(shù)據(jù);步驟4:儲存數(shù)據(jù)。其實一般我們需要登錄的頁面大多都是動態(tài)頁面,它們是有后臺、有服務(wù)器的,我們所能看見的代碼都是前端他們確認展示的。在動態(tài)網(wǎng)頁爬取數(shù)據(jù),返回數(shù)據(jù)多為JSON型數(shù)據(jù)類型。JSON的全稱是JavaScriptObjectNotation,是一種輕量級的數(shù)據(jù)交換格式。網(wǎng)絡(luò)之間使用HTTP方式傳遞數(shù)據(jù)的時候,絕大多數(shù)情況下傳遞的都是JSON格式的字符串。方法作用json.dumps()將Python對象編碼成JSON字符串json.loads()將JSON字符串解碼成Python對象json.dump()將Python對象轉(zhuǎn)化成JSON格式存儲到文件中json.load()將文件中的JSON格式轉(zhuǎn)化成Python對象提取出來[例5-2]在Python中初始化一個字典和列表進行相互轉(zhuǎn)化。代碼如下:importjson
#一Python中初始化一個字典:
person_dict={
'basic_info':{'name':'張三',
'age':30,
'sex':'male'},
'work_info':{'salary':99999,
'position':'總經(jīng)理',
'department':None}
}
print(person_dict)
#二字典轉(zhuǎn)換為JSON格式的字符串方法
person_json=json.dumps(person_dict)
print(person_json)
#三列表轉(zhuǎn)換為JSON格式的字符串
book_list=[
{'name':'三國演義','price':99.99},
{'name':'西游記','price':100},
{'name':'紅樓夢','price':80},
{'name':'水滸傳','price':45.99},
]
book_json=json.dumps(book_list,indent=4)
print(book_json)
#四把JSON格式的字符串轉(zhuǎn)換為字典方法
person_dict={
'basic_info':{'name':'張三',
'age':30,
'sex':'male'},
'work_info':{'salary':99999,
'position':'總經(jīng)理',
'department':None}
}
#字典轉(zhuǎn)換為JSON格式的字符串
person_json=json.dumps(person_dict)
#把JSON格式的字符串轉(zhuǎn)換為字典
person_json_dict=json.loads(person_json)
print(person_json_dict)
print(person_json_dict['basic_info']['name'])[例5-3]Ajax提取網(wǎng)頁結(jié)果.1.打開網(wǎng)址如下:/kfccda/storelist/index.aspx,該頁面如圖5-11所示。輸入關(guān)鍵字“重慶”查詢結(jié)果如圖5-12所示。.編寫代碼爬取該頁面中的數(shù)據(jù),代碼如下。importrequestsif__name__=='__main__':#指定urlurl='/kfccda/ashx/GetStoreList.ashx?op=keyword'#動態(tài)輸入查找的城市city=input('請輸入您想要查找的城市:')#參數(shù)處理param={'cname':'','pid':'','keyword':city,#城市名稱'pageIndex':'1',#頁面'pageSize':'10',#一頁顯示多少數(shù)據(jù)}#進行UA偽裝header={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/84.0.4147.105Safari/537.36'}#獲取相應(yīng)數(shù)據(jù)response=requests.post(url=url,data=param,headers=header)#這個頁面是一個text,不是jsonpage_text=response.textprint(page_text)print('數(shù)據(jù)爬取成功!')
運行該例結(jié)果如下。請輸入您想要查找的城市:重慶{"Table":[{"rowcount":33}],"Table1":[{"rownum":1,"storeName":"崇智","addressDetail":"重慶路1388號(沃爾瑪購物廣場二樓)","pro":"禮品卡","provinceName":"吉林省","cityName":"長春市"},{"rownum":2,"storeName":"解放東路","addressDetail":"重慶路1367號","pro":"Wi-Fi,禮品卡","provinceName":"吉林省","cityName":"吉林市"},{"rownum":3,"storeName":"民權(quán)","addressDetail":"重慶民權(quán)路1號","pro":"24小時,Wi-Fi,禮品卡","provinceName":"重慶市","cityName":"重慶市"},{"rownum":4,"storeName":"重慶肯德基有限公司大禮堂餐廳","addressDetail":"渝中區(qū)大溪溝街道人民路133號","pro":"Wi-Fi,點唱機,店內(nèi)參觀,禮品卡,手機點餐","provinceName":"重慶市","cityName":"重慶市"},{"rownum":5,"storeName":"縉麓","addressDetail":"重慶北碚區(qū)天生新村63號縉麓商都A棟1-2層","pro":"Wi-Fi,點唱機,禮品卡","provinceName":"重慶市","cityName":"重慶市"},{"rownum":6,"storeName":"雄風(fēng)","addressDetail":"重慶北碚區(qū)嘉陵風(fēng)情街33號1-1號一層","pro":"Wi-Fi,點唱機,店內(nèi)參觀,禮品卡","provinceName":"重慶市","cityName":"重慶市"},{"rownum":7,"storeName":"魚洞","addressDetail":"重慶魚洞新市街80號商社匯1-2層","pro":"24小時,點唱機,禮品卡","provinceName":"重慶市","cityName":"重慶市"},{"rownum":8,"storeName":"重慶萬象城餐廳","addressDetail":"重慶謝家灣正街55號華潤中心萬象城A座LG層和L1層","pro":"Wi-Fi,店內(nèi)參觀,禮品卡","provinceName":"重慶市","cityName":"重慶市"},{"rownum":9,"storeName":"紅星","addressDetail":"重慶兩江新區(qū)金開大道1003號愛情海購物公園負一層肯德基","pro":"Wi-Fi,點唱機,店內(nèi)參觀","provinceName":"重慶市","cityName":"重慶市"},{"rownum":10,"storeName":"北廣場外賣點","addressDetail":"重慶北站渝萬場GA07-1號","pro":null,"provinceName":"重慶市","cityName":"重慶市"}]}數(shù)據(jù)爬取成功!本章首先介紹了動態(tài)網(wǎng)頁的應(yīng)用情景和動態(tài)網(wǎng)頁的特征,然后介紹了動態(tài)網(wǎng)頁的工作原理和動態(tài)網(wǎng)頁相關(guān)的AJAX、API、IE開發(fā)者工具、JSON庫等基本知識,最后介紹了異步GET與POST請求。通過本章的學(xué)習(xí),讀者能夠?qū)討B(tài)網(wǎng)頁以及其相關(guān)特性有一個清晰的認識,重點需要讀者掌握的是動態(tài)網(wǎng)頁爬取的原理和相關(guān)技術(shù)以及如何使用Python爬取動態(tài)網(wǎng)頁的數(shù)據(jù)。5.4本章小結(jié)5.5實訓(xùn)
項目六
爬蟲與數(shù)據(jù)分析通過對本章的學(xué)習(xí),了解文本分詞的特點,理解文本數(shù)據(jù)處理方式,理解數(shù)據(jù)清洗的原理與應(yīng)用,理解數(shù)據(jù)分析的基本操作,熟悉Python爬蟲的排序算法。了解文本分詞的特點。理解文本數(shù)據(jù)處理方式。理解數(shù)據(jù)清洗的原理與應(yīng)用。理解數(shù)據(jù)分析的基本操作。熟悉Python爬蟲的排序算法。隨著計算機技術(shù)的普及,基于機器語言的文本處理方法開始應(yīng)用到各個領(lǐng)域。從大量的文本中提取出有用的信息,并結(jié)合統(tǒng)計學(xué)、計量經(jīng)濟學(xué)等學(xué)科知識,將這些有用的信息進行進一步組織并挖掘其中的價值,逐漸成為各領(lǐng)域展開研究的一門利器。6.1文本分析
在做文本挖掘的時候,首先要做的預(yù)處理就是分詞。文本分詞是將字符串劃分為有意義的單詞的過程,如詞語、句子或主題等。英文單詞天然有空格隔開,容易按照空格分詞,但有時候也需要把多個單詞做為一個分詞,比如“NewYork”等名詞,需要做為一個詞看待。而中文由于沒有空格,分詞就是一個需要專門去解決的問題了。在Python中常用的分詞包有jieba分詞、SnowNLP、THULAC、NLPIR、NLTK等。(1)jieba分詞。jieba分詞是國內(nèi)使用人數(shù)最多的中文分詞工具。該工具可以對中文文本進行分詞、詞性標(biāo)注、關(guān)鍵詞抽取等功能,并且支持自定義詞典。(2)SnowNLP。SnowNLP是一個Python寫的類庫,可以方便地處理中文文本內(nèi)容,該庫是受到了TextBlob的啟發(fā)而寫的。SnowNLP的最大特點是容易上手,用其處理中文文本時能夠得到不少有意思的結(jié)果,但不少功能比較簡單,還有待進一步完善。(3)THULAC。THULAC是由清華大學(xué)研制推出的一套中文詞法分析工具包,具有中文分詞和詞性標(biāo)注功能。處理文本數(shù)據(jù)的常用如下方法。(1)去除數(shù)字數(shù)字在文本分析中一般沒有意義,所以在進一步分析前需要去除它們。(2)去除鏈接地址鏈接地址也需要在進一步分析前被去掉,可以使用正則表達式達到這個目的。(3)去除停用詞停用詞是在每個句子中都很常見,但對分析沒有意義的詞。比如英語中的“is”“but”“shall”“by”,漢語中的“的”“是”“但是”等。語料中的這些詞可以通過匹配文本處理程序包中的停用詞列表來去除。(4)詞干化詞干化,指的是將單詞的派生形式縮減為其詞干的過程,已經(jīng)有許多詞干化的方法。詞干化主要使用在英文中,如“programming”“programmer”“programmed”“programmable”等詞可以詞干化為“program”,目的是將含義相同、形式不同的詞歸并,方便詞頻統(tǒng)計。(5)后綴丟棄后綴丟棄算法可以丟棄一個單詞的后綴部分。如上文提到的“programming”“programmer”“programmed”“programmable”等詞可以詞干化為詞根“program”,但像“rescuing”“rescue”“rescued”這樣的詞則被詞干化為“rescu”,其并非一個單詞或詞根,而是將后綴丟棄后得到的形式。(1)jieba的安裝為了能夠在Python3中顯示中文字符,還需要下載安裝jieba庫,jieba庫也是一個Python第三方庫,用于中文分詞。
安裝jieba庫的命令如下:pipinstalljieba
在下載并安裝jieba庫后,在Windows7命令提示符中輸入以下命令:importjieba
如果運行沒報錯,則表示已經(jīng)成功安裝jieba庫。jieba涉及的算法包括:基于Trie樹結(jié)構(gòu)實現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構(gòu)成的有向無環(huán)圖(DAG);采用了動態(tài)規(guī)劃查找最大概率路徑,找出基于詞頻的最大切分組合;對于未登錄詞,采用了基于漢字成詞能力的HMM模型,使用了Viterbi算法。
[例6-1]使用jieba運行精確模式、全模式和搜索引擎模式。代碼如下:importjiebaseg_str="好好學(xué)習(xí),天天向上。"print("/".join(jieba.lcut(seg_str)))print("/".join(jieba.lcut(seg_str,cut_all=True)))print("/".join(jieba.lcut_for_search(seg_str)))語句含義:print("/".join(jieba.lcut(seg_str))):精確模式,返回一個列表類型的結(jié)果print("/".join(jieba.lcut(seg_str,cut_all=True))):全模式,使用'cut_all=True'指定print("/".join(jieba.lcut_for_search(seg_str))):搜索引擎模式運行該例如圖6-1所示。[例6-2]使用jieba中的詞性標(biāo)注和關(guān)鍵詞提取。代碼如下:importjiebaimportjieba.possegaspsegimportjieba.analyseasanlsseg_list=jieba.lcut_for_search("他畢業(yè)于重慶大學(xué)機電系,后來一直在重慶機電科學(xué)研究所工作")print("【返回列表】:{0}".format(seg_list))
語句含義:importjieba.possegaspseg:詞性標(biāo)注importjieba.analyseasanls:關(guān)鍵詞提取
運行該例如圖6-2所示。[例6-3]使用jieba中的HMM模型。代碼如下:importjiebaimportjieba.possegaspsegimportjieba.analyseasanlsseg_list=jieba.cut("他來到了北京天安門")print("【識別新詞】:"+"/".join(seg_list))
語句含義如下:importjieba.possegaspseg:詞性標(biāo)注importjieba.analyseasanls:關(guān)鍵詞提取seg_list=jieba.cut("他來到了北京天安門"):默認精確模式和啟用HMM,jieba.cut返回的結(jié)構(gòu)是一個可迭代的generator,可使用for循環(huán)來獲得分詞后得到的每一個詞語。
運行該例如圖6-3所示。數(shù)據(jù)清洗的原理為:利用相應(yīng)技術(shù)方法,如統(tǒng)計方法、數(shù)據(jù)挖掘方法、模式規(guī)則方法等將“臟”數(shù)據(jù)轉(zhuǎn)換為滿足數(shù)據(jù)質(zhì)量要求的數(shù)據(jù)。數(shù)據(jù)清洗按照實現(xiàn)方式與范圍,可分為手工清洗和自動清洗。6.2數(shù)據(jù)清洗
數(shù)據(jù)清洗的過程主要包括4個,分別是移除不必要的數(shù)據(jù)、解決結(jié)構(gòu)性錯誤問題、篩選不必要的異常值以及處理缺失數(shù)據(jù)。numpy庫是Python做數(shù)據(jù)處理的底層庫,是高性能科學(xué)計算和數(shù)據(jù)分析的基礎(chǔ),比如著名的Python機器學(xué)習(xí)庫SKlearn就需要numPy的支持。掌握numPy的基礎(chǔ)數(shù)據(jù)處理能力是利用Python做數(shù)據(jù)運算及機器學(xué)習(xí)的基礎(chǔ)。(1)安裝numpy庫在Windows7下安裝Python擴展庫,常用pip命令來實現(xiàn),如輸入命令“pipinstall
numpy”安裝numpy庫。安裝完成后,可在Windows命令行中輸入“Python”,并在進入Python界面后輸入以下命令:import
numpy(2)numpy庫的使用①數(shù)組的創(chuàng)建與查看在numpy庫中創(chuàng)建數(shù)組可以使用如下語法:numpy.array該語句表示通過引入numpy庫創(chuàng)建了一個ndarray對象。[例6-4]創(chuàng)建數(shù)組對象。代碼如下:importnumpyasnpa=np.array([1,2,3])print(a)該例首先引入了numpy庫,接著定義了一個一維數(shù)組a,最后將數(shù)組輸出顯示。運行該程序結(jié)果如圖6-4所示。[例6-5]創(chuàng)建數(shù)組對象并查看屬性。代碼如下:importnumpyasnpa=np.array([10,20,30])print(a)a.shapea.dtype[例6-6]根據(jù)給定維度隨機生成[0,1)之間的數(shù)據(jù),包含0,不包含1。代碼如下:importnumpyasnpa=np.random.rand(3,2)print(a)
該例隨機生成的數(shù)值均在[0,1),rand(3,2)表示3行2列,運行該程序如圖6-6所示。pandas數(shù)據(jù)清洗pandas是Python下的一個集數(shù)據(jù)處理、分析、可視化于一身的擴展庫,使用pandas可以輕松實現(xiàn)數(shù)據(jù)分析與數(shù)據(jù)可視化。(1)安裝pandas庫在Windows7下安裝Python擴展庫,常用pip命令來實現(xiàn),如輸入命令“pipinstall
numpy”來安裝pandas庫。安裝完成后,可在Windows命令行中輸入Python,并在進入Python界面后輸入以下命令:import
pandas(2)pandas庫的使用在pandas庫有兩個最基本的數(shù)據(jù)類型,分別是Series和DataFrame。其中Series數(shù)據(jù)類型表示一維數(shù)組,與numpy中的一維array類似,并且二者與Python基本的數(shù)據(jù)結(jié)構(gòu)List也很相近。而DataFrame數(shù)據(jù)類型則代表二維的表格型數(shù)據(jù)結(jié)構(gòu),也可以將DataFrame理解為Series的容器。Series是能夠保存任何類型的數(shù)據(jù)(整數(shù)、字符串、浮點數(shù)、Python對象等)的一維標(biāo)記數(shù)組,并且每個數(shù)據(jù)都有自己的索引。在pandas庫中僅由一組數(shù)據(jù)即可創(chuàng)建最簡單的Series。DataFrame是一個表格型的數(shù)據(jù)類型。它含有一組有序的列,每列可以是不同的類型(數(shù)值、字符串等)。DataFrame類型既有行索引又有列索引,因此它可以被看作是由Series組成的字典。[例6-13]創(chuàng)建Series。代碼如下:importnumpyasnpx=pd.Series([-1,3,5,8])x運行如圖6-13所示。[例6-14]創(chuàng)建Series并自定義索引。代碼如下:importnumpyasnpx=pd.Series([-1,3,5,8],index=[‘a(chǎn)’,’b’,’c’,’d’])x運行如圖6-14所示。[例6-15]使用常數(shù)創(chuàng)建一個Series。代碼如下:importnumpyasnpx=pd.Series(10,index=[0,1,2,3])x運行如圖6-15所示。使用pandas可以輕松實現(xiàn)數(shù)據(jù)分析與數(shù)據(jù)可視化。(1)pandas處理csv文件使用pandas處理csv文件的方法主要為read_csv()和to_csv()這兩個,其中read_csv()表示讀取csv文件的內(nèi)容并返回DataFrame,to_csv()則是read_csv()的逆過程。
[例6-22]Pandas讀取csv文件。在pandas中讀取csv文件語法如下:pd.read_csv("filename")
其中,filename表示要讀取的csv文件的名稱。使用pandas讀取該文件,代碼如下:importnumpyasnpimportpandasaspddf=pd.read_csv("farequote.csv")print(df.head())print(df.responsetime.describe())該例首先讀取了farequote.csv,代碼如下:df=pd.read_csv("farequote.csv")顯示數(shù)據(jù)集的前5行內(nèi)容,代碼如下:print(df.head())顯示數(shù)據(jù)集中responsetime的統(tǒng)計結(jié)果,代碼如下:print(df.responsetime.describe())此外,在讀取數(shù)據(jù)集的時候,還可以查看數(shù)據(jù)集的特征信息,代碼如下:print(())運行如圖6-28所示。[例6-23]pandas讀取json文件。在Python中如要讀取json文件,需要添加json模塊,代碼如下:json.load(file,encoding=”utf-8”)在這里flie表示要讀取的文件名稱。該例首先將json數(shù)據(jù)寫入到文件中,再用Python來讀取,代碼如下:importjsondata=[{'id':'001','name':'owen','score':'85'}]file=open('e:/json/json1.txt','w')json.dump(data,file)file.close()file=open('e:/json/json1.txt')data=json.load(file,encoding="utf-8")print(data)在這里使用json.dump來存儲文件,json.load來讀取文件,運行如圖6-29所示.(3)pandas繪圖分析Matplotlib是一個
Python
的2D繪圖庫,它以各種硬拷貝格式和跨平臺的交互式環(huán)境生成出版質(zhì)量級別的圖形,在使用Matplotlib之前,首先要將Matplotlib安裝在系統(tǒng)中。使用Matplotlib庫可以繪制各種圖形,其中最基本的是線性圖形,主要由線條組成。
[例6-24]Matplotlib繪制柱狀圖。代碼如下:importmatplotlib.pyplotaspltfrommatplotlib.font_managerimportFontPropertiesfont_set=FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=15)#導(dǎo)入宋體字體文件x=[0,1,2,3,4,5]y=[1,2,3,2,4,3]plt.bar(x,y)#豎的條形圖plt.title("柱狀圖",FontProperties=font_set);#圖標(biāo)題plt.xlabel("x軸",FontProperties=font_set);plt.ylabel("y軸",FontProperties=font_set);plt.show()該例繪制了6個柱狀形狀,用函數(shù)plt.bar()來實現(xiàn),其中參數(shù)為x,y,該程序運行如圖6-30所示。[例6-25]在pandas中使用Series繪制線性圖。代碼如下:frompandasimportDataFrame,Seriesimportpandasaspdimportnumpyasnpimportmatplotlib.pyplotasplts=pd.Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))s.plot()plt.show()
該例首先在Python中導(dǎo)入了pandas庫、numpy庫和Matplotlib庫,并引入了來自pandas庫的DataFrame以及Series數(shù)組,接著將Series對象的索引傳給Matplotlib來繪制圖形。語句“np.random”表示隨機抽樣,“np.random.randn(10)”用于返回一組隨機數(shù)據(jù),該數(shù)據(jù)具有標(biāo)準正態(tài)分布?!癱umsum()”用于返回累加值。語句“np.arange(0,100,10)”用于返回一個有終點和起點的固定步長的排列以顯示刻度值,其中0為起點,100為終點,10為步長,運行該例如圖6-31所示。[例6-26]pandas繪制散點圖檢測異常值。首先構(gòu)造數(shù)據(jù)集,代碼如下:s=pd.DataFrame(np.random.randn(1000)+10,columns=['value'])接著顯示數(shù)據(jù)前幾行:s.head()繪制散點圖:plt.scatter(s.index,s.values)plt.show()運行結(jié)果如圖6-32所示,可以觀察到圖6-32中沒有明顯的異常值。Matplotlib是Python中用于數(shù)據(jù)可視化的圖形庫,該任務(wù)繪制的是折線圖??焖倥判蛩枷肴缦拢和ㄟ^一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)比另外一部分的所有數(shù)據(jù)都小,然后再按此方法對這兩部分數(shù)據(jù)分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數(shù)據(jù)變成有序序列。[例6-22]快速排序。代碼如下:defquick_sort(lists,left,right):ifleft>=right:returnlistskey=lists[left]low=lefthigh=rightwhileleft<right:whileleft<rightandlists[right]>=key:right-=1lists[left]=lists[right]whileleft<rightandlists[left]<=key:left+=1lists[right]=lists[left]lists[right]=keyquick_sort(lists,low,left-1)quick_sort(lists,left+1,high)returnlistsarr=[2,645,1,344,546,442,89,99,76,90,25,100]print(quick_sort(arr,0,len(arr)-1))排序結(jié)果如下。[1,2,25,76,89,90,99,100,344,442,546,645]6.3Python爬蟲排序算法
[例6-23]冒泡排序。代碼如下:defbubble_sort(lists):count=len(lists)foriinrange(0,count):forjinrange(i+1,count):iflists[i]>lists[j]:lists[i],lists[j]=lists[j],lists[i]returnlistsarr=[2,645,1,344,546,442,89,99,76,90,100,41]print(bubble_sort(arr))
運行結(jié)果如下。[1,2,41,76,89,90,99,100,344,442,54
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 落地式鋼管腳手架卸料平臺施工方案
- 工廠供水供應(yīng)協(xié)議模板
- 體育產(chǎn)業(yè)借款合同
- 砌墻工程人員派遣協(xié)議
- 雨水工程整體施工方案
- 2024至2030年中國玻璃編織耐熱電線數(shù)據(jù)監(jiān)測研究報告
- 政府采購股權(quán)投資服務(wù)協(xié)議
- 2024至2030年中國桂花魚行業(yè)投資前景及策略咨詢研究報告
- 信用評級服務(wù)協(xié)議
- 秩序維護部考核制度
- 組態(tài)軟件技術(shù)課程設(shè)計報告書
- 北京市城鄉(xiāng)居民養(yǎng)老保險發(fā)展評估研究報告
- 節(jié)能標(biāo)識使用管理規(guī)定
- 戴姆勒產(chǎn)品開發(fā)質(zhì)量體系
- 通過全球化與世界空間學(xué)習(xí)的收獲
- GB 17675-2021汽車轉(zhuǎn)向系基本要求
- 窗邊的小豆豆-好書推薦
- 決策理論7-多目標(biāo)決策的基本概念課件
- 交互設(shè)計-課件
- 酒店式公寓-課件
- 一年級看圖寫話(教學(xué))課件
評論
0/150
提交評論