![大數(shù)據(jù)采集與預(yù)處理課件:requests技術(shù)應(yīng)用案例_第1頁(yè)](http://file4.renrendoc.com/view14/M01/0C/2B/wKhkGWcNOkKAYUwkAADL80aXTEc009.jpg)
![大數(shù)據(jù)采集與預(yù)處理課件:requests技術(shù)應(yīng)用案例_第2頁(yè)](http://file4.renrendoc.com/view14/M01/0C/2B/wKhkGWcNOkKAYUwkAADL80aXTEc0092.jpg)
![大數(shù)據(jù)采集與預(yù)處理課件:requests技術(shù)應(yīng)用案例_第3頁(yè)](http://file4.renrendoc.com/view14/M01/0C/2B/wKhkGWcNOkKAYUwkAADL80aXTEc0093.jpg)
![大數(shù)據(jù)采集與預(yù)處理課件:requests技術(shù)應(yīng)用案例_第4頁(yè)](http://file4.renrendoc.com/view14/M01/0C/2B/wKhkGWcNOkKAYUwkAADL80aXTEc0094.jpg)
![大數(shù)據(jù)采集與預(yù)處理課件:requests技術(shù)應(yīng)用案例_第5頁(yè)](http://file4.renrendoc.com/view14/M01/0C/2B/wKhkGWcNOkKAYUwkAADL80aXTEc0095.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
requests技術(shù)應(yīng)用案例requests庫(kù)技術(shù)應(yīng)用案例——?jiǎng)討B(tài)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)采集本章學(xué)習(xí)目標(biāo)分析業(yè)務(wù)網(wǎng)站A,B,C和D的網(wǎng)頁(yè)結(jié)構(gòu)和內(nèi)容使用requests庫(kù)編寫爬蟲(chóng)代碼獲取指定的靜態(tài)和動(dòng)態(tài)數(shù)據(jù)使用BeautifulSoup實(shí)現(xiàn)數(shù)據(jù)的解析使用pymysql庫(kù)和pandas實(shí)現(xiàn)數(shù)據(jù)的持久化4.3業(yè)務(wù)網(wǎng)站A靜態(tài)數(shù)據(jù)進(jìn)入網(wǎng)址:/notebook_index/subcate16_0_list_1_0_99_2_0_1.html
我們可以觀察到網(wǎng)頁(yè)主頁(yè)顯示的主要的內(nèi)容,有筆記本電腦型號(hào)、價(jià)格、配置、評(píng)價(jià)分?jǐn)?shù)等,本次任務(wù)案例,我們將要獲取該頁(yè)的所有筆記本電腦信息。圖4.3-1網(wǎng)址主頁(yè)
判斷此數(shù)據(jù)是靜態(tài)數(shù)據(jù)還是動(dòng)態(tài)數(shù)據(jù)。如圖4.3-2所示,由此可知,我們想要獲取的內(nèi)容被標(biāo)簽直接包含在內(nèi),為靜態(tài)數(shù)據(jù),所以可以編寫爬蟲(chóng)獲取網(wǎng)頁(yè)標(biāo)簽內(nèi)容即可圖4.3-2標(biāo)簽檢查數(shù)據(jù)類型天問(wèn)一號(hào)成功登陸火星,對(duì)于靜態(tài)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)整體把控和分析要求極高。充分體現(xiàn)勞模精神:勞模精神,是指“愛(ài)崗敬業(yè)、爭(zhēng)創(chuàng)一流、艱苦奮斗、勇于創(chuàng)新、淡泊名利、甘于奉獻(xiàn)”的勞動(dòng)模范的精神。
使用python編寫爬蟲(chóng)獲取網(wǎng)頁(yè)靜態(tài)數(shù)據(jù),有針對(duì)性地獲得在網(wǎng)頁(yè)中的筆記本電腦型號(hào)、價(jià)格、配置、評(píng)價(jià)分?jǐn)?shù)。具體步驟如下。在python中導(dǎo)入requests庫(kù)和bs4庫(kù)中的BeautifulSoup,并且定義一個(gè)空列表new_list,用于存儲(chǔ)爬取下來(lái)的靜態(tài)數(shù)據(jù),并自定義第一個(gè)列表,這個(gè)列表將作為對(duì)應(yīng)數(shù)據(jù)的字段名和后續(xù)數(shù)據(jù)的存儲(chǔ)。importrequestsfrombs4importBeautifulSoupnew_list=[['電腦型號(hào)','價(jià)格','配置','評(píng)分']]構(gòu)造爬蟲(chóng)代碼請(qǐng)求該URL的Headers頭部信息。在“開(kāi)發(fā)者工具”的Network欄目下的Headers中得到該默認(rèn)URL的Headers頭部信息。其目的是為了向業(yè)務(wù)網(wǎng)站A網(wǎng)址的后臺(tái)服務(wù)器隱藏爬蟲(chóng)代碼的真實(shí)身份,讓爬蟲(chóng)代碼帶著這些請(qǐng)求信息偽裝成瀏覽器正常訪問(wèn)該網(wǎng)站服務(wù)器的狀態(tài)而不被服務(wù)器的反爬措施發(fā)現(xiàn)。headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/74.0.3729.108Safari/537.36'}3)定義變量complete_url用于指定的URL網(wǎng)址complete_url="/notebook_index/subcate16_0_list_1_0_99_2_0_1.html"4)使用requests庫(kù)的get()方法獲得網(wǎng)址的Response對(duì)象,并設(shè)置headers參數(shù),并定義變量req進(jìn)行保存。req=requests.get(url=complete_url,headers=headers)5)使用encoding方法,設(shè)置req變量的編碼方式。req.encoding='GBK'6)使用BeautifulSoup庫(kù)解析HTML文檔的代碼。req.txt是一個(gè)包含HTML內(nèi)容的字符串,features定義了解析器為’html.parser’,用于將HTML轉(zhuǎn)換為Python對(duì)象,定義變量soup進(jìn)行保存。soup=BeautifulSoup(req.text,features="html.parser")7)定位數(shù)據(jù)圖4.3-3包含數(shù)據(jù)的標(biāo)簽結(jié)構(gòu)8)獲取數(shù)據(jù)圖4.3-4數(shù)據(jù)存儲(chǔ)的標(biāo)簽dd第一步:在網(wǎng)頁(yè)結(jié)構(gòu)中,通過(guò)分析,我們可以發(fā)現(xiàn),我們獲取的數(shù)據(jù)都統(tǒng)一存儲(chǔ)在一個(gè)ID名叫J_PicMode的標(biāo)簽中,所以我們只需要找到并保存這個(gè)標(biāo)簽就可以實(shí)現(xiàn)靜態(tài)數(shù)據(jù)的爬取。第二步:聲明及定義4個(gè)空列表,用于分別保存筆記本電腦型號(hào)、價(jià)格、配置、評(píng)價(jià)分?jǐn)?shù)的數(shù)據(jù)。使用for循環(huán)方式將select()方法獲得的數(shù)據(jù)遍歷提取,并使用append()方法追加到4個(gè)空列表中,同時(shí)使用zip()方法將數(shù)組中的數(shù)據(jù)整合在一起,完成靜態(tài)數(shù)據(jù)爬取。運(yùn)行測(cè)試,由以上代碼可知,列表a,b,c,d中的數(shù)據(jù)被整合在new_list中保存的就是我們從網(wǎng)頁(yè)爬取的靜態(tài)數(shù)據(jù),我們打印出來(lái)觀察是否正確圖4.3-5運(yùn)行測(cè)試1)導(dǎo)入Pandas庫(kù)importpandasaspd2)把列表new_list轉(zhuǎn)換為pandas的數(shù)據(jù)結(jié)構(gòu)DataFrame類型,由dataframe保存。dataframe=pd.DataFrame(new_list)3)最后將dataframe保存到excel文件中(正確路徑下的真實(shí)文件)dataframe.to_excel('D:\Requests\zcg.xlsx')圖4.3-6數(shù)據(jù)保存結(jié)果requests庫(kù)技術(shù)應(yīng)用案例——?jiǎng)討B(tài)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)采集本章學(xué)習(xí)目標(biāo)分析業(yè)務(wù)網(wǎng)站A,B,C和D的網(wǎng)頁(yè)結(jié)構(gòu)和內(nèi)容使用requests庫(kù)編寫爬蟲(chóng)代碼獲取指定的靜態(tài)和動(dòng)態(tài)數(shù)據(jù)使用BeautifulSoup實(shí)現(xiàn)數(shù)據(jù)的解析使用pymysql庫(kù)和pandas實(shí)現(xiàn)數(shù)據(jù)的持久化4.3業(yè)務(wù)網(wǎng)站A靜態(tài)數(shù)據(jù)進(jìn)入網(wǎng)址:/notebook_index/subcate16_0_list_1_0_99_2_0_1.html
我們可以觀察到網(wǎng)頁(yè)主頁(yè)顯示的主要的內(nèi)容,有筆記本電腦型號(hào)、價(jià)格、配置、評(píng)價(jià)分?jǐn)?shù)等,本次任務(wù)案例,我們將要獲取該頁(yè)的所有筆記本電腦信息。圖4.3-1網(wǎng)址主頁(yè)
判斷此數(shù)據(jù)是靜態(tài)數(shù)據(jù)還是動(dòng)態(tài)數(shù)據(jù)。如圖4.3-2所示,由此可知,我們想要獲取的內(nèi)容被標(biāo)簽直接包含在內(nèi),為靜態(tài)數(shù)據(jù),所以可以編寫爬蟲(chóng)獲取網(wǎng)頁(yè)標(biāo)簽內(nèi)容即可圖4.3-2標(biāo)簽檢查數(shù)據(jù)類型天問(wèn)一號(hào)成功登陸火星,對(duì)于靜態(tài)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)整體把控和分析要求極高。充分體現(xiàn)勞模精神:勞模精神,是指“愛(ài)崗敬業(yè)、爭(zhēng)創(chuàng)一流、艱苦奮斗、勇于創(chuàng)新、淡泊名利、甘于奉獻(xiàn)”的勞動(dòng)模范的精神。網(wǎng)頁(yè)分頁(yè)爬取的翻頁(yè)操作實(shí)現(xiàn)對(duì)保存網(wǎng)頁(yè)的變量complete_url進(jìn)行操作,設(shè)置首先觀察網(wǎng)頁(yè),如圖4.3-7所示圖4.3-7翻頁(yè)網(wǎng)址變化由此我們可以知道,后綴subcate16_0_list_1_0_99_2_0_X控制網(wǎng)頁(yè)的頁(yè)數(shù),所以我們可以自定義for循環(huán)使X的值不同,以達(dá)到去到不同頁(yè)面的目的,使用str函數(shù)將其拼接在網(wǎng)址后,從而得到新網(wǎng)頁(yè)地址。fornuminrange(1,3):complete_url='/notebook_index/subcate16_0_list_1_0_99_2_0_'+str(num)+'.html'print(complete_url)圖4.3-8新網(wǎng)址完成翻頁(yè)效果4.3.4數(shù)據(jù)預(yù)處理1)導(dǎo)入指定的庫(kù)importreimportpandasaspdfromscipy.statsimportzscorefromtabulateimporttabulate2)自定義方法main(),作為實(shí)現(xiàn)調(diào)用其他數(shù)據(jù)預(yù)處理自定義方法的入口。defmain():#1數(shù)據(jù)讀取laptops=pd.read_excel('zgc_pages.xlsx',skiprows=1,usecols=lambdax:xnotin[0])laptop=pd.read_excel('zgc_new.xlsx')#2數(shù)據(jù)集成lap_con=pd.concat([laptop,laptops],axis=0)#3探索清理數(shù)據(jù)laptops_new=check_data(lap_con)#4數(shù)據(jù)轉(zhuǎn)換result=transform_data(laptops_new)print(tabulate(result,headers='keys',tablefmt='pretty'))3)自定義check_data(laptops)方法用于數(shù)據(jù)探索、數(shù)據(jù)清理和數(shù)據(jù)規(guī)約操作。defcheck_data(laptops):#1.探索數(shù)據(jù)#查看前幾行數(shù)據(jù)print(laptops.head())#查看列名laptops_colmuns=laptops.columnsprint(())#2.數(shù)據(jù)清理#2.1清理缺失值#2.1.1判斷缺失值位置print(laptops['評(píng)分'].isnull())#2.1.2刪除缺失值laptops.drop(index=laptops[laptops['評(píng)分'].isnull()].index,inplace=True)laptops.drop(index=laptops[laptops['配置'].isnull()].index,inplace=True)#2.2清理重復(fù)值#2.2.1判斷重復(fù)值位置print(laptops.duplicated())#2.2.2刪除重復(fù)值print(laptops.drop_duplicates(inplace=True))#2.3.1判斷異常值計(jì)算z分?jǐn)?shù),判斷是否超過(guò)閾值z(mì)_scores=zscore(laptops['評(píng)分'])valid_rating_condition=(z_scores>-3)&(z_scores<3)#2.3.2清理異常值laptops_new=laptops[valid_rating_condition]returnlaptops_new4)自定義transform_data(laptops_new)方法用于數(shù)據(jù)轉(zhuǎn)換操作。deftransform_data(laptops_new):#是否允許鏈?zhǔn)剿饕?。pd.set_option('mode.chained_assignment',None)#1.價(jià)格拆分#將價(jià)格轉(zhuǎn)換為最低價(jià)格和最高價(jià)格#以-為界進(jìn)行分割split_values=laptops_new['價(jià)格'].str.split('-',expand=True)laptops_new[['最低價(jià)','最高價(jià)']]=split_values#定義一個(gè)函數(shù),用于處理包含萬(wàn)字的數(shù)值列defprocess_wan(value):try:ifre.search(r'萬(wàn)',value):returnfloat(re.sub(r'萬(wàn)','',value))*10000else:returnfloat(value)except(ValueError,TypeError):return0#對(duì)每一列應(yīng)用處理函數(shù)laptops_new['最低價(jià)']=laptops_new['最低價(jià)'].apply(process_wan)laptops_new['最高價(jià)']=laptops_new['最高價(jià)'].apply(process_wan)laptops_new.drop(columns='價(jià)格',inplace=True)#定義Min-Max標(biāo)準(zhǔn)化函數(shù)defmin_max_scaling(value,min_value,max_value):return(value-min_value)/(max_value-min_value)#2.評(píng)分標(biāo)準(zhǔn)化min_rating=laptops_new['評(píng)分'].min()max_rating=laptops_new['評(píng)分'].max()#使用Min-Max標(biāo)準(zhǔn)化函數(shù)進(jìn)行標(biāo)準(zhǔn)化laptops_new.loc[:,'評(píng)分_normalized']=laptops_new['評(píng)分'].apply(lambdax:min_max_scaling(x,min_rating,max_rating))returnlaptops_new5)設(shè)置程序入口if__name__=="__main__":main()
綜合案例——爬取業(yè)務(wù)網(wǎng)站B
本章學(xué)習(xí)目標(biāo)分析豆瓣電影Top250的網(wǎng)頁(yè)結(jié)構(gòu)和內(nèi)容使用requests庫(kù)編寫爬蟲(chóng)代碼獲取指定的靜態(tài)數(shù)據(jù)使用BeautifulSoup實(shí)現(xiàn)從網(wǎng)頁(yè)中提取數(shù)據(jù)使用pymysql庫(kù)實(shí)現(xiàn)數(shù)據(jù)的持久化4.4.1頁(yè)面分析
使用谷歌瀏覽器進(jìn)入業(yè)務(wù)網(wǎng)站網(wǎng)頁(yè)界面可以獲得相關(guān)信息,如電影名(moviename)、導(dǎo)演名(directorname)、年份(movieyear)、國(guó)籍(movienation)、電影類型(movietype)等的靜態(tài)數(shù)據(jù),如圖4-1所示。圖4-14.4.2獲取靜態(tài)數(shù)據(jù)
在開(kāi)發(fā)者工具中Elements選項(xiàng)卡中可以獲取得到電影的相關(guān)信息,如電影名,導(dǎo)演名,點(diǎn)評(píng)人數(shù)等,該類信息均為靜態(tài)數(shù)據(jù),如圖4-2所示。因此這里可以使用requests庫(kù)和lxml庫(kù)編寫自定義的爬蟲(chóng)代碼對(duì)這些靜態(tài)數(shù)據(jù)直接進(jìn)行獲取提供了依據(jù)。圖4-2Elements選項(xiàng)卡中的靜態(tài)數(shù)據(jù)
在“開(kāi)發(fā)者工具”的network選項(xiàng)卡中可以觀察到該網(wǎng)頁(yè)的狀態(tài)碼(statuscode)、請(qǐng)求方式(requestmethod)、瀏覽器信息(User-Agent)等信息,如圖4-3所示。這些信息能夠?yàn)榻酉聛?lái)的爬蟲(chóng)代碼更直接的提取出需要的信息。圖4-3瀏覽器詳細(xì)的Headers信息通過(guò)前面對(duì)該頁(yè)面進(jìn)行了詳細(xì)的結(jié)構(gòu)和內(nèi)容分析之后,現(xiàn)在可以開(kāi)始使用requests和BeautifulSoup編寫自定義的爬蟲(chóng)代碼對(duì)該部分的靜態(tài)數(shù)據(jù)直接進(jìn)行獲取了,這里主要包含三個(gè)步驟。1.準(zhǔn)備階段1)導(dǎo)入requests和BeautifulSoup,pandas,pymysql等,requests庫(kù)用于獲取URL的頁(yè)面響應(yīng)數(shù)據(jù),BeautifulSoup用于從網(wǎng)頁(yè)中提取數(shù)據(jù)。importrequestsfrombs4importBeautifulSoupimportpandasaspdimportnumpyasnpimportre靜態(tài)數(shù)據(jù)獲取的總體步驟 2)構(gòu)建列表用于臨時(shí)存儲(chǔ)從網(wǎng)頁(yè)中爬取出來(lái)的相關(guān)信息 movie_names_lst=[] director_names=[] actor_names=[] movie_years=[] movie_nations=[] movie_types=[] lst_data_table=[] 3)構(gòu)造爬蟲(chóng)代碼請(qǐng)求該URL的Headers頭部信息。在開(kāi)發(fā)者工具的“Network”選項(xiàng)卡下的“Headers”選項(xiàng)卡中得到該默認(rèn)URL的Headers頭部信息。其目的是豆瓣的后臺(tái)服務(wù)器隱藏爬蟲(chóng)代碼的真實(shí)身份,讓爬蟲(chóng)代碼帶著這些請(qǐng)求信息偽裝成瀏覽器正常訪問(wèn)該網(wǎng)站服務(wù)器的狀態(tài),而不被服務(wù)器的反爬措施發(fā)現(xiàn)。 headers={ 'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:68.0) Gecko/20100101Firefox/68.0’ }2.發(fā)送請(qǐng)求并獲取響應(yīng) 1)向服務(wù)端發(fā)起請(qǐng)求,如果成功,服務(wù)端會(huì)返回當(dāng)前頁(yè)面的所有內(nèi)容(通常是一個(gè)html文件)然后手動(dòng)指定編碼集最后將請(qǐng)求之后的響應(yīng)傳入解析器。req=requests.get(url='movie.douban/top250?start=0',headers=headers)req.encoding='utf-8'soup=BeautifulSoup(req.text,features="lxml")3.解析需要的數(shù)據(jù) 1)使用BeautifulSoup中的find_all()方法定位到<divclass=”hd”>,從而縮小查找范圍,并將所有符合條件的標(biāo)簽返回的列表數(shù)據(jù)臨時(shí)保存在變量movie_item_hds中。movie_item_hds=soup.find_all('div',class_='hd’) 2)提取電影名稱,利用for循環(huán)遍歷movie_item_hds里面的數(shù)據(jù),再次使用find_all()方法來(lái)查找電影名,并將查找到的數(shù)據(jù)臨時(shí)保存在變量movie_names中。formovie_item_hdinmovie_item_hds:movie_names_sub=[]movie_names=movie_item_hd.find_all('span',class_='title')formovie_nameinmovie_names:print(movie_name.text.strip())movie_names_sub.append(movie_name.text.strip())movie_names_lst.append(movie_names_sub[0]) 3)提取評(píng)價(jià)人數(shù)、分?jǐn)?shù)、電影導(dǎo)演等信息,在提取電影導(dǎo)演主演等信息的過(guò)程中是會(huì)發(fā)現(xiàn)有些數(shù)據(jù)由于導(dǎo)演名過(guò)長(zhǎng)導(dǎo)致主演的信息被覆蓋,需要進(jìn)行一些特殊處理movie_item_bds=soup.find_all('div',class_='bd')formovie_item_bdinmovie_item_bds:director_name_sub=[]actor_names_sub=[]movie_years_sub=[]movie_nations_sub=[]movie_types_sub=[]movie_stars=movie_item_bd.find_all('div',class_='star')formovie_starinmovie_stars:movie_star_spans_comments=movie_star.find_all('span')[3]movie_star_spans_score=movie_star.find_all('span')[1]movie_item_p=movie_item_bd.find_all('p')[0]movie_item_p_string=movie_item_p.text.strip()if'豆瓣'inmovie_item_p_string: continueelse: result=re.split('主演:|主...',movie_item_p_string.strip())director_name_sub.append(result[0].strip().split("導(dǎo)演:")[1]) director_names.append(director_name_sub[0]) result2=re.split('主演:|主...',movie_item_p_string.strip()) movie_year=result2[1].split("\n")[1].strip()[0:4] movie_years_sub.append(movie_year) movie_years.append(movie_years_sub[0]) movie_nation=result2[1].split("\n")[1].strip().split('/')[1].strip() movie_nations_sub.append(movie_nation) movie_nations.append(movie_nations_sub[0])
綜合案例——爬取業(yè)務(wù)網(wǎng)站B
本章學(xué)習(xí)目標(biāo)分析豆瓣電影Top250的網(wǎng)頁(yè)結(jié)構(gòu)和內(nèi)容使用requests庫(kù)編寫爬蟲(chóng)代碼獲取指定的靜態(tài)數(shù)據(jù)使用BeautifulSoup實(shí)現(xiàn)從網(wǎng)頁(yè)中提取數(shù)據(jù)使用pymysql庫(kù)實(shí)現(xiàn)數(shù)據(jù)的持久化4.4.3數(shù)據(jù)持久化存儲(chǔ)
為了保證數(shù)據(jù)的可靠性,保障數(shù)據(jù)不會(huì)丟失,并提高應(yīng)用程序的性能讓程序可以直接從存儲(chǔ)介質(zhì)中加載數(shù)據(jù)這是便需要對(duì)數(shù)據(jù)進(jìn)行持久化存儲(chǔ)。 1)導(dǎo)入pymysql庫(kù),用于連接Mysql。 importpymysql 2)提前在mysql中創(chuàng)建好test數(shù)據(jù)庫(kù),在test數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)表movie_douban包含字段moviename(電影名),directorname(導(dǎo)演名),moiveyear(年份),moivenation(國(guó)籍),movietype(電影類型),通過(guò)for循環(huán)實(shí)現(xiàn)向表中插入數(shù)據(jù)。 db=pymysql.connect(host='localhost',user='root',password='123456',port=3306) cursor=db.cursor() cursor.execute("usetest") cursor.execute("DROPTABLEIFEXISTSmovie_douban")sql1="""CREATETABLE`movie_douban`(`moviename`char(30)NOTNULL,`directorname`char(50)NOTNULL,`movieyear`year(4)NOTNULL,`movienation`char(50)NOTNULL,`movietype`char(30)NOTNULL,PRIMARYKEY(`moviename`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;"""cursor.execute(sql1)print("CreatedtableSuccessfull.")try:cursor.execute(sql,(movie_names_lst[num],director_names[num],movie_years[num],movie_nations[num],movie_types[num]))dbmit()except:db.rollback()db.close()4.4.4數(shù)據(jù)預(yù)處理
1)導(dǎo)入指定的庫(kù)importpandasaspd2)自定義方法main(),作為實(shí)現(xiàn)調(diào)用其他數(shù)據(jù)預(yù)處理自定義方法的入口。defmain():#1數(shù)據(jù)讀取column_names=['電影名稱','導(dǎo)演','年份','國(guó)籍','類型']movies_data=pd.read_csv('豆瓣電影寫入.csv',header=None,names=column_names)#2探索清理數(shù)據(jù)movies_()movies_data.dropna(inplace=True)#3轉(zhuǎn)換數(shù)據(jù)data_new=transform_data(movies_data)#4規(guī)約數(shù)據(jù)#按年份和國(guó)籍分組并計(jì)算每年每個(gè)國(guó)籍的電影數(shù)量pivot_table=pd.pivot_table(data_new,values='電影名稱',index='年代',columns='國(guó)籍',aggfunc='count',fill_value=0)print(pivot_table)3)自定義transform_data(movies_data)方法用于數(shù)據(jù)轉(zhuǎn)換操作。#1處理年份數(shù)據(jù)#1.1數(shù)據(jù)類型轉(zhuǎn)換(這里假設(shè)年份列為字符串類型,需要轉(zhuǎn)換為整數(shù)類型)movies_data['年份']=pd.to_numeric(movies_data['年份'],errors='coerce')#1.2篩選年份在1990和2020之間的電影filtered_movies=movies_data[(movies_data['年份']>=1990)&(movies_data['年份']<2020)]#1.3創(chuàng)建新列表示年代defcategorize_decade(year):ifyear<2000:return'90年代'elifyear<2010:return'00年代'else:return'10年代'filtered_movies['年代']=filtered_movies['年份'].apply(categorize_decade)#2處理國(guó)籍?dāng)?shù)據(jù)nationalities_split=filtered_movies['國(guó)籍'].str.split('',expand=True)filtered_movies['國(guó)籍']=nationalities_split[0]#3處理類型數(shù)據(jù)——獨(dú)熱編碼#3.1將類型列拆分為多個(gè)二進(jìn)制列#types_dummies=filtered_movies['類型'].str.get_dummies('')#3.2將二進(jìn)制列合并到原數(shù)據(jù)框#movies_data=pd.concat([filtered_movies,types_dummies],axis=1)returnfiltered_movies4)設(shè)置程序入口if__name__=="__main__":main()
綜合案例——爬取業(yè)務(wù)網(wǎng)站C本章學(xué)習(xí)目標(biāo)分析業(yè)務(wù)網(wǎng)站C的網(wǎng)頁(yè)結(jié)構(gòu)和內(nèi)容使用requests庫(kù)編寫爬蟲(chóng)代碼獲取指定的動(dòng)態(tài)數(shù)據(jù)使用urlencode方法編碼使用pymysql庫(kù)實(shí)現(xiàn)數(shù)據(jù)的持久化在進(jìn)入業(yè)務(wù)網(wǎng)站C界面時(shí),在切換“城市”時(shí)會(huì)出現(xiàn)不同的汽車信息。通過(guò)“開(kāi)發(fā)者工具”的Network選項(xiàng)卡中的XHR可以發(fā)現(xiàn)出現(xiàn)了一個(gè)動(dòng)態(tài)數(shù)據(jù)請(qǐng)求URL,如圖5-1所示。因此,接下來(lái)將圍繞該URL進(jìn)行分析。4.5.1
頁(yè)面分析圖5-1動(dòng)態(tài)數(shù)據(jù)請(qǐng)求URL通過(guò)“開(kāi)發(fā)者工具”的Network欄目中的XHR查看該URL的Preview可以看到返回的動(dòng)態(tài)數(shù)據(jù),如圖5-2所示。該數(shù)據(jù)是一個(gè)字典和列表相互嵌套使用的數(shù)據(jù)集合。因此,要獲得指定的數(shù)據(jù)就必須要對(duì)該數(shù)據(jù)集合進(jìn)行準(zhǔn)確的解析。圖5-2動(dòng)態(tài)數(shù)據(jù)的結(jié)構(gòu)和內(nèi)容在“Headers”選項(xiàng)卡,可以看見(jiàn)這個(gè)AJAX請(qǐng)求的URL地址是./ashx/AjaxIndexHotCarByDsj.ashx?cityid=110100其中cityid參數(shù)為110100,如圖5-3所示圖5-3切換該網(wǎng)站的城市位置如圖5-4所示,打開(kāi)“network”選項(xiàng)卡發(fā)現(xiàn)XHR中又出現(xiàn)了AJAX條目,并且和上一個(gè)城市的AJAX條目有共同之處。參數(shù)cityid發(fā)生了改變,變?yōu)榱?00100。./ashx/AjaxIndexHotCarByDsj.ashx?cityid=500100圖5-4由此可以分析得出,此處的cityid參數(shù)就是指代不同的城市編碼,并根據(jù)不同的cityid值返回不同城市的汽車信息,如圖5-5所示。圖5-3通過(guò)使用“開(kāi)發(fā)者工具”詳細(xì)查看并分析了頁(yè)面內(nèi)容,現(xiàn)在已經(jīng)獲得了動(dòng)態(tài)數(shù)據(jù)的結(jié)構(gòu)和內(nèi)容。因此,這里使用requests庫(kù)編寫自定義的爬蟲(chóng)代碼,針對(duì)頁(yè)面結(jié)構(gòu)通過(guò)使用循環(huán)語(yǔ)句獲取到頁(yè)面結(jié)構(gòu)中指定的動(dòng)態(tài)數(shù)據(jù)。4.5.2
獲取動(dòng)態(tài)數(shù)據(jù)1)導(dǎo)入urlencode和requests,前者表示使用urlencode方法編碼url,后者表示使用requests對(duì)象來(lái)發(fā)送請(qǐng)求,并返回響應(yīng)的數(shù)據(jù)。fromurllib.parseimporturlencodeimportrequests2)找到需要模擬的AJAX請(qǐng)求的url,并將其復(fù)制給變量original_url。fromurllib.parseimporturlencodeimportrequests3)根據(jù)該AJAX條目的RequestHeaders設(shè)置符合該AJAX的請(qǐng)求基本信息。requests_headers={'Referer':'./beijing/','User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)''Chrome/57.0.2987.133Safari/537.36','X-Requested-With':'XMLHttpRequest',}4)自定義一個(gè)函數(shù)get_one(cityid),講形參設(shè)置為cityid,表示將接收一個(gè)代表城市編碼的參數(shù),并將該參數(shù)傳入字典p中。使用urlencode()方法將字典p的值添加到original_url中,得到完整的URL請(qǐng)求。在try..except..語(yǔ)句中使用requests的get()方法獲得上面的URL,并通過(guò)設(shè)定判斷條件,將得到的response響應(yīng)數(shù)據(jù)格式化為JSON。defget_one(cityid):p={'cityid':cityid}complete_url=original_url+urlencode(p)try:response=requests.get(url=complete_url,params=requests_headers)ifresponse.status_code==200:returnresponse.json()exceptrequests.ConnectionErrorase:print('Error',e.args)5)再自定義一個(gè)函數(shù)parse(json),將形參設(shè)置為Json,表示這里將接收的數(shù)據(jù)格式為JSON。通過(guò)前面的分析得出,這個(gè)AJAX返回的數(shù)據(jù)是一個(gè)字典列表,因此,通過(guò)設(shè)置判斷條件,使用json[0].get(‘name’)將獲得第一個(gè)字典集合中的車型名稱。defparse(json):ifjson: item=json[0].get(‘Name’) print(item)6)編寫運(yùn)行程序入口,將參數(shù)設(shè)置成110100,即表示北京。
if__name__==’__main__’: jo=get_one(110100) parse(jo)
綜合案例——爬取業(yè)務(wù)網(wǎng)站C本章學(xué)習(xí)目標(biāo)分析業(yè)務(wù)網(wǎng)站C的網(wǎng)頁(yè)結(jié)構(gòu)和內(nèi)容使用requests庫(kù)編寫爬蟲(chóng)代碼獲取指定的動(dòng)態(tài)數(shù)據(jù)使用urlencode方法編碼使用pymysql庫(kù)實(shí)現(xiàn)數(shù)據(jù)的持久化為了保證數(shù)據(jù)的可靠性,保障數(shù)據(jù)不會(huì)丟失,并提高應(yīng)用程序的性能讓程序可以直接從存儲(chǔ)介質(zhì)中加載數(shù)據(jù)這是便需要對(duì)數(shù)據(jù)進(jìn)行持久化存儲(chǔ)。在前面的基礎(chǔ)上用AJAX采集單個(gè)汽車品牌系列的名稱,單個(gè)汽車品牌系列的ID。并將其采集到的數(shù)據(jù)保存到MySQL數(shù)據(jù)庫(kù)中。4.5.3
數(shù)據(jù)持久化存儲(chǔ)1) 導(dǎo)入pymysql,用于連接MySQL。importpymysql2) 通過(guò)PyMQL建立MySQL連接,創(chuàng)建AJAX數(shù)據(jù)庫(kù)和ajax數(shù)據(jù)表。設(shè)置數(shù)據(jù)表字段為car_name和id,id為主鍵。通過(guò)for循環(huán)實(shí)現(xiàn)想表插入數(shù)據(jù)。db=pymysql.connect(host='localhost',user='root',password='123456',port=3306)cursor=db.cursor()cursor.execute("CREATEDATABASEAJAXDEFAULTCHARACTERSETutf8mb4")db.close()db2=pymysql.connect(host="localhost",user="root",password="123456",database="AJAX",port=3306)cursor2=db2.cursor()cursor2.execute("DROPTABLEIFEXISTSajax")sql1="""CREATETABLE`ajax`(`car_name`char(20)NOTNULL,`id`int(10)NOTNULLAUTO_INCREMENT,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;"""cursor2.execute(sql1)print("CreatedtableSuccessfull.")3) 自定義一個(gè)函數(shù)parse_three(json),參數(shù)也是json。獲得該城市所有車型的汽車品牌系列名稱和ID。最后通過(guò)for循環(huán)實(shí)現(xiàn)向表中插入數(shù)據(jù)。defparse_three(json):ifjson:foriinjson:forbini.get('SeriesList'):item_list=b.get('Name')item_list2=b.get('Id')print('各城市數(shù)據(jù)采集數(shù)據(jù)展示:'+'=========='+item_list+':'+'==========='+str(item_list2)+'=============')sql2='INSERTINTOajax(car_name,id)VALUES(%s,%s)'try:cursor2.execute(sql2,(item_list,item_list2))db2mit()except:db2.rollback()4) 編寫運(yùn)行入口程序if__name__=='__main__':city_list=[{'北京':'110100'},{'重慶':'500100'}]forcityincity_list:jo=get_one(city.values())parse_three(jo)db2.close()
使用WEBAPI采集數(shù)據(jù)——爬取業(yè)務(wù)網(wǎng)站D
本章學(xué)習(xí)目標(biāo)了解業(yè)務(wù)網(wǎng)站D的基本含義及使用方法了解WEBAPI的基本概念掌握業(yè)務(wù)網(wǎng)站D開(kāi)放API的數(shù)據(jù)特點(diǎn)了解業(yè)務(wù)網(wǎng)站D的API進(jìn)行數(shù)據(jù)采集和清洗以及持久化存儲(chǔ)WebAPI是網(wǎng)絡(luò)應(yīng)用程序接口。它包含了廣泛的功能,網(wǎng)絡(luò)應(yīng)用通過(guò)API接口,可以實(shí)現(xiàn)存儲(chǔ)服務(wù)、消息服務(wù)、計(jì)算服務(wù)等能力,利用這些能力可以開(kāi)發(fā)出功能的強(qiáng)大web應(yīng)用。4.1任務(wù)描述
本任務(wù)將使用業(yè)務(wù)網(wǎng)站D提供的WEBAPI實(shí)現(xiàn)數(shù)據(jù)的采集。業(yè)務(wù)網(wǎng)站D提供了豐富的開(kāi)放WEBAPI供廣大開(kāi)發(fā)者使用。通過(guò)這些WEBAPI的文檔定義規(guī)范,將有針對(duì)性地使用爬蟲(chóng)工具采集針對(duì)“repositories?q=spider”,即庫(kù)名為spider的業(yè)務(wù)網(wǎng)站D項(xiàng)目的基本信息,并使用sorted方法根據(jù)所有項(xiàng)目的分?jǐn)?shù)進(jìn)行排名,以及保存至MySQL數(shù)據(jù)庫(kù)中。4.2業(yè)務(wù)網(wǎng)站D4.2.1業(yè)務(wù)網(wǎng)站D的概述作為一個(gè)知名的開(kāi)源分布式版本控制系統(tǒng),業(yè)務(wù)網(wǎng)站D(http://www.github/),能夠快速,高效地處理各種大小項(xiàng)目的版本控制和管理。起初,業(yè)務(wù)網(wǎng)站D只是用于管理Linux內(nèi)核開(kāi)發(fā),但隨著開(kāi)源軟件的不斷增多,越來(lái)越多的應(yīng)用程序都將自己的項(xiàng)目遷移到業(yè)務(wù)網(wǎng)站D上,目前業(yè)務(wù)網(wǎng)站D擁有超過(guò)數(shù)百萬(wàn)開(kāi)發(fā)者用戶?,F(xiàn)在,業(yè)務(wù)網(wǎng)站D不僅提供項(xiàng)目的版本控制,還能夠讓開(kāi)發(fā)者共享已有代碼。如圖4-1所示。圖4-1業(yè)務(wù)網(wǎng)站D首頁(yè)4.2.2業(yè)務(wù)網(wǎng)站D的基本用法
在登錄業(yè)務(wù)網(wǎng)站D之后,可以通過(guò)搜索控件搜索特定的關(guān)鍵字信息包括作者姓名,項(xiàng)目名稱以及基于特定語(yǔ)言的項(xiàng)目等等,可以單擊“Startaproject”建立一個(gè)自己的項(xiàng)目庫(kù),可以在“Issues”中查看之前項(xiàng)目反饋的處理信息,可以在“Explore”中查找自己感興趣的項(xiàng)目信息,可以在“Marketplace”搜索自己需要的項(xiàng)目工具和資源。如圖4-2所示.圖4-2業(yè)務(wù)網(wǎng)站D用戶首頁(yè)
這里將建立一個(gè)項(xiàng)目庫(kù),并在業(yè)務(wù)網(wǎng)站D的WEBAPI中查詢到它。1)單擊“Startaproject”建立一個(gè)的項(xiàng)目庫(kù),選擇一個(gè)“Owner”作為項(xiàng)目的擁有者,并給“Repositoryname”添加一個(gè)項(xiàng)目名稱。同時(shí),還可以給項(xiàng)目附加一些額外的信息描述“Description”。然后選擇“Public”或者“Private”分別表示任何人都能夠看見(jiàn)和使用此庫(kù)和只有指定的人群可以看見(jiàn)和使用此庫(kù)。最后根據(jù)是創(chuàng)建一個(gè)全新的庫(kù)還是通過(guò)導(dǎo)入之前已有的庫(kù)決定是否打鉤“InitializethisrepositorywithaREADME”。單擊“Createrepository”創(chuàng)建該庫(kù)。如圖4-3所示。圖4-3配置項(xiàng)目庫(kù)基本信息2)成功創(chuàng)建該項(xiàng)目庫(kù)之后,就可以對(duì)該項(xiàng)目庫(kù)進(jìn)行維護(hù)管理。包括“Createnewfile”創(chuàng)建新文件,“Uploadfiles”上傳文件,“Findfile”找文件,“Cloneordownload”克隆或下載文件等。如圖4-4所示。圖4-4項(xiàng)目庫(kù)維護(hù)管理4.3WEBAPI 4.3.1WEBAPI的概述 作為網(wǎng)站的主要組成部分,WEBAPI可以實(shí)現(xiàn)用戶對(duì)特定信息的需求。WEBAPI最主要的功能是實(shí)現(xiàn)構(gòu)建基于HTTP的面向各種客戶端的服務(wù)框架。WEBAPI通過(guò)基于HTTPREQUEST的各種動(dòng)作GET,POST,PUT,DELETE實(shí)現(xiàn)客戶端向服務(wù)器請(qǐng)求CREATE,RETRIEVE,UPDATE,DELETE操作,并使用HTTPRESPONSE的HttpStatusCode從服務(wù)器獲得HTTPREQUEST的處理結(jié)果狀態(tài)。另外,REQUEST和RESPONSE的數(shù)據(jù)格式是易于處理的JSON或XML格式。因此,WEBAPI對(duì)于高度依賴第三方數(shù)據(jù)源的應(yīng)用具有十分重要的使用價(jià)值,特別是對(duì)于實(shí)時(shí)性要求比較高的應(yīng)用程序。接下來(lái),將是介紹如何使用WEPAPI獲取GitHub的特定信息。4.3.2業(yè)務(wù)網(wǎng)站D開(kāi)放API的數(shù)據(jù)特點(diǎn)由于業(yè)務(wù)網(wǎng)站D是一個(gè)分布式系統(tǒng),因此,在業(yè)務(wù)網(wǎng)站D中并不存在主庫(kù)這樣的概念,開(kāi)發(fā)者通過(guò)克隆即可將每一個(gè)完整的庫(kù)(repositories)復(fù)制到本地機(jī)器中獨(dú)立使用,任何兩個(gè)庫(kù)之間的不一致之處都可以進(jìn)行合并。那么如何訪問(wèn)和使用這些項(xiàng)目庫(kù),就必須要使用到業(yè)務(wù)網(wǎng)站D的開(kāi)放API。下面是api.github/的WEBAPI列表。如圖4-5所示。圖4-5GitHub開(kāi)放API列表從輸出的結(jié)果中可以看到,WEBAPI中的映射含有豐富的數(shù)據(jù)。例如,映射包含URL,還有為URL提供參數(shù)的方式。其中示例"repository_search_url":"api.github/search/repositories?q={query}{&page,per_page,sort,order}"中,repository_search_url鍵對(duì)應(yīng)的URL表示用于在GitHub中搜索代碼庫(kù),此外還指明了如何構(gòu)建傳給URL的參數(shù)。其中,q表示需要查詢的庫(kù)名稱關(guān)鍵字。page表示限制查詢結(jié)果顯示的總頁(yè)數(shù)。per_page表示限制每頁(yè)里面顯示查詢到的數(shù)據(jù)個(gè)數(shù)。sort表示根據(jù)一定的篩選方式進(jìn)行顯示。order表示按照一定的排序方式進(jìn)行顯示。參數(shù)之間使用&進(jìn)行分隔。這個(gè)WEBAPI返回的數(shù)據(jù)格式為JSON(JavaScriptObjectNotation,JavaScript對(duì)象表示法)格式。JSON是一種“輕量級(jí)數(shù)據(jù)交換格式”。JSON正在快速成為Web服務(wù)的事實(shí)標(biāo)準(zhǔn)。JSON之所以如此流行,有以下兩個(gè)原因:一是,JSON易于閱讀。與XML等序列化格式相比,JSON很好地平衡了人類可讀性。二是,只需小幅修改,JSON就能在JavaScript中使用。在客戶端和服務(wù)器端都能同樣良好使用的數(shù)據(jù)格式一定會(huì)勝出。在當(dāng)今的WEB程序設(shè)計(jì)中,不論后臺(tái)服務(wù)器代碼使用何種語(yǔ)言,前端使用JavaScript傳遞JSON數(shù)據(jù)可以實(shí)現(xiàn)前端和后臺(tái)服務(wù)器代碼之間數(shù)據(jù)交互的通用模型。因此,在WEB前端和后臺(tái)的數(shù)據(jù)交互中使用占據(jù)了主導(dǎo)地位。這里使用業(yè)務(wù)網(wǎng)站D開(kāi)放API中的api.github/search/repositories?q=spider&per_page=1&sort=score&order=desc表示從業(yè)務(wù)網(wǎng)站D的repositories里面查詢q=spider,即庫(kù)名關(guān)鍵字是spider。顯示結(jié)果根據(jù)sort=score和order=desc,即按照符合條件的庫(kù)的得分以降序的方式顯示。顯示方式根據(jù)per_page=2,即每個(gè)頁(yè)面只顯示2個(gè)查詢結(jié)果。如圖4-6所示。a)b)圖4-6業(yè)務(wù)網(wǎng)站DAPI查詢結(jié)果a)第一個(gè)查詢結(jié)果的部分信息b)第二個(gè)查詢結(jié)果的部分信息從查詢結(jié)果可以看到,兩個(gè)查詢結(jié)果都是以JASON的數(shù)據(jù)格式返回的,并且都具有相同的鍵以及對(duì)應(yīng)不同的值。例如,第一個(gè)查詢結(jié)果的鍵“id”是52476585,第二個(gè)查詢結(jié)果的鍵“id”是74628476。這樣可以極大地方便數(shù)據(jù)的統(tǒng)一管理和查詢檢索。4.3.3業(yè)務(wù)網(wǎng)站D的API請(qǐng)求數(shù)據(jù)
1.業(yè)務(wù)網(wǎng)站D的API結(jié)構(gòu)分析下面使用業(yè)務(wù)網(wǎng)站D的WebAPI來(lái)實(shí)現(xiàn)數(shù)據(jù)的請(qǐng)求。首先,來(lái)分析一下這個(gè)WEBAPI的內(nèi)容。api.github/users/{user}/repos{?type,page,per_page,sort}(1)https表示使用的網(wǎng)絡(luò)協(xié)議是基于安全的超文本傳輸協(xié)議。(2)api.github表示網(wǎng)站的域名,經(jīng)過(guò)域名服務(wù)器解析之后便可得到服務(wù)器的IP地址。(3)/users/{user}/repos表示該服務(wù)器的文件系統(tǒng)中的文件夾或文件的虛擬路徑。這里的{user}表示需要設(shè)置的用戶名。(4){?type,page,per_page,sort}表示問(wèn)號(hào)后面可以使用的鍵。type表示要查找的文件類型或項(xiàng)目類型。page表示限制查詢結(jié)果顯示的總頁(yè)數(shù)。per_page表示限制每頁(yè)里面顯示查詢到的數(shù)據(jù)個(gè)數(shù)。sort表示根據(jù)一定的篩選方式進(jìn)行顯示。參數(shù)的目的是向服務(wù)器請(qǐng)求特定的信息。2.業(yè)務(wù)網(wǎng)站D的API請(qǐng)求實(shí)例因此,api.github/users/simonlee1984/repos?type=python&per_page=2這個(gè)WEBAPI的作用是請(qǐng)求使用基于安全的超文本傳輸協(xié)議向名叫api.github的服務(wù)器中的文件夾路徑為/users/simonlee1984/repos?type=python&per_page=2中的用戶名是simonlee1984的用戶所維護(hù)的項(xiàng)目庫(kù)數(shù)據(jù)中與python相關(guān)的內(nèi)容,并且以每頁(yè)2各個(gè)項(xiàng)目的形式進(jìn)行顯示。這個(gè)WEBAPI在瀏覽器中輸出的結(jié)果如圖4-7所示。圖4-7simonlee1984的python相關(guān)項(xiàng)目庫(kù)simonlee1984的python_crawler項(xiàng)目庫(kù)b)simonlee1984的python_spider項(xiàng)目庫(kù)b)a)從輸出的結(jié)果中可以看到,這個(gè)WEBAPI返回的數(shù)據(jù)格式為JSON。其中,“name”表示每個(gè)項(xiàng)目庫(kù)的名稱,全部都是與Python相關(guān)的項(xiàng)目庫(kù)?!皃rivate”表示該項(xiàng)目庫(kù)是否公開(kāi)讓所有人瀏覽和使用。False表示公開(kāi)?!皁wner”表示該項(xiàng)目庫(kù)所有者的相關(guān)信息,包括:“url”表示指向該擁有者在GitHub的主頁(yè)?!癴ollowers_url”表示關(guān)注該作者的其他作者信息?!癴ollowing_url”表示該作者所關(guān)注的其他作者信息。“repos_url”表示該作者所維護(hù)管理的所有項(xiàng)目庫(kù)等等。4.3.4獲取API的響應(yīng)數(shù)據(jù)
在分析了業(yè)務(wù)網(wǎng)站D的WEBAPI結(jié)構(gòu)之后,本節(jié)將使用Python獲取業(yè)務(wù)網(wǎng)站DWEBAPI的指定數(shù)據(jù),由于將獲得的響應(yīng)數(shù)據(jù)所包含的值比較多,不便于顯示,所以這里將對(duì)獲得的數(shù)據(jù)進(jìn)行簡(jiǎn)單清洗,最后輸出響應(yīng)狀態(tài)碼和響應(yīng)數(shù)據(jù)所有的鍵?!緦?shí)例4-1】下面以這個(gè)業(yè)務(wù)網(wǎng)站D的WEBAPI為例,api.github/search/repositories?q=spider。具體步驟如下:1)Python中導(dǎo)入requests庫(kù)。importrequests2)定義指定的WEBAPI的URL,并將其賦給變量api_url。api_url='api.github/search/repositories?q=spider'3)使用requests庫(kù)的get方法獲得WEBAPI的Response對(duì)象。req=requests.get(api_url)4)查看Response的屬性值。status_code表示服務(wù)器處理后返回值的狀態(tài)(200表示成功)。print('狀態(tài)碼:',req.status_code)5)使用json方法將Response的數(shù)據(jù)轉(zhuǎn)換為JSON的數(shù)據(jù)對(duì)象。req_dic=req.json()6)使用為JSON的數(shù)據(jù)對(duì)象keys方法獲得鍵,并打印輸出結(jié)果。print(req_dic.keys())7)運(yùn)行結(jié)果顯示。狀態(tài)碼:200dict_keys(['total_count','incomplete_results','items'])完整代碼如下:importrequestsapi_url='api.github/search/repositories?q=spider'req=requests.get(api_url)print('狀態(tài)碼:',req.status_code)req_dic=req.json()print(req_dic.keys())1.清洗API的響應(yīng)數(shù)據(jù)【實(shí)例4-2】將進(jìn)一步地處理響應(yīng)的數(shù)據(jù)。本節(jié)將在前一節(jié)的基礎(chǔ)之上,使用Python將獲得API響應(yīng)數(shù)據(jù)進(jìn)行清洗,有針對(duì)性地獲得在業(yè)務(wù)網(wǎng)站D中所有與spider有關(guān)的項(xiàng)目庫(kù)的總數(shù),驗(yàn)證是否完全獲得了本次API的響應(yīng)數(shù)據(jù),返回當(dāng)前瀏覽器頁(yè)面所顯示的項(xiàng)目庫(kù)數(shù)量,查看第一個(gè)項(xiàng)目中的鍵數(shù)量,獲得第一個(gè)項(xiàng)目中的具體內(nèi)容,獲得第一個(gè)項(xiàng)目作者的登錄名,獲得第一個(gè)項(xiàng)目的全名,獲得第一個(gè)項(xiàng)目的描述,獲得第一個(gè)項(xiàng)目評(píng)分。具體步驟如下:(1)Python中導(dǎo)入requests庫(kù)importrequests(2)定義指定的WEBAPI的URLapi_url='api.github/search/repositories?q=spider'(3)使用requests庫(kù)的get方法獲得WEBAPI的Response對(duì)象req=requests.get(api_url)(4)查看Response的屬性值。status_code表示服務(wù)器處理后返回值的狀態(tài)(200表示成功)。print('狀態(tài)碼:',req.status_code)4.3.5處理API的響應(yīng)數(shù)據(jù)
(5)使用json方法將Response的數(shù)據(jù)轉(zhuǎn)換為JSON的數(shù)據(jù)對(duì)象req_dic=req.json()(6)打印輸出字典對(duì)象req_dic的鍵為’total_count’的值,該值表示與spider有關(guān)的庫(kù)總數(shù)。print('與spider有關(guān)的庫(kù)總數(shù):',req_dic['total_count'])(7)打印輸出字典對(duì)象req_dic的鍵為’incomplete_results’的值,該值表示本次WEBAPI請(qǐng)求是否完成。其中,false表示完整,true表示不完整。print('本次請(qǐng)求是否完整:',req_dic['incomplete_results'])(8)獲得字典對(duì)象req_dic的鍵為’items’的值,并將其賦值給變量req_dic_items。注意,req_dic_items也是一個(gè)數(shù)據(jù)類型為字典的數(shù)組。req_dic_items=req_dic['items'](9)打印輸出req_dic_items的元素個(gè)數(shù)print('當(dāng)前頁(yè)面返回的項(xiàng)目數(shù)量:',len(req_dic_items))(10)通過(guò)數(shù)組下標(biāo)獲取req_dic_items的第一個(gè)元素,即第一個(gè)spider的項(xiàng)目信息。req_dic_items_first也是一個(gè)數(shù)據(jù)類型為字典的數(shù)組。req_dic_items_first=req_dic_items[0](11)打印輸出req_dic_items_first的元素個(gè)數(shù)print('查看第一個(gè)項(xiàng)目中的鍵數(shù)量:',len(req_dic_items_first))(12)打印輸出req_dic_items_first的具體內(nèi)容print('第一個(gè)項(xiàng)目中的具體內(nèi)容:',req_dic_items_first)(13)打印輸出req_dic_items_first中鍵為’owner’的值中嵌套的鍵值對(duì)’login’的值。該值表示第一個(gè)項(xiàng)目的作者登錄名。print('獲得第一個(gè)項(xiàng)目作者的登錄名:',req_dic_items_first['owner']['login'])(14)打印輸出req_dic_items_first中鍵為’full_name’的值。該值表示第一個(gè)項(xiàng)目的全名print('獲得第一個(gè)項(xiàng)目的全名:',req_dic_items_first['full_name'])(15)打印輸出req_dic_items_first中鍵為’description’的值。該值表示第一個(gè)項(xiàng)目的描述print('獲得第一個(gè)項(xiàng)目的描述:',req_dic_items_first['description'])(16)打印輸出req_dic_items_first中鍵為’score’的值。該值表示第一個(gè)項(xiàng)目的評(píng)分。print('獲得第一個(gè)項(xiàng)目評(píng)分:',req_dic_items_first['score'])(17)運(yùn)行結(jié)果如圖4-8所示。圖4-8API的處理結(jié)果完整代碼如下所示。importrequestsapi_url='api.github/search/repositories?q=spider'req=requests.get(api_url)print('狀態(tài)碼:',req.status_code)req_dic=req.json()print('與spider有關(guān)的庫(kù)總數(shù):',req_dic['total_count'])print('本次請(qǐng)求是否完整:',req_dic['incomplete_results'])req_dic_items=req_dic['items']print('當(dāng)前頁(yè)面返回的項(xiàng)目數(shù)量:',len(req_dic_items))req_dic_items_first=req_dic_items[0]print('查看第一個(gè)項(xiàng)目中的內(nèi)容數(shù)量:',len(req_dic_items_first))print('第一個(gè)項(xiàng)目中的具體內(nèi)容:',req_dic_items_first)print('獲得第一個(gè)項(xiàng)目作者的登錄名:',req_dic_items_first['owner']['login'])print('獲得第一個(gè)項(xiàng)目的全名:',req_dic_items_first['full_name'])print('獲得第一個(gè)項(xiàng)目的描述:',req_dic_items_first['description'])print('獲得第一個(gè)項(xiàng)目評(píng)分:',req_dic_items_first['score'])
使用WEBAPI采集數(shù)據(jù)——爬取業(yè)務(wù)網(wǎng)站D 本章學(xué)習(xí)目標(biāo)了解業(yè)務(wù)網(wǎng)站D的基本含義及使用方法了解WEBAPI的基本概念掌握業(yè)務(wù)網(wǎng)站D開(kāi)放API的數(shù)據(jù)特點(diǎn)了解業(yè)務(wù)網(wǎng)站D的API進(jìn)行數(shù)據(jù)采集和清洗以及持久化存儲(chǔ)13)通過(guò)導(dǎo)入pymysql庫(kù)的connect方法返回pymysql的數(shù)據(jù)庫(kù)連接對(duì)象db,在該方法中傳入?yún)?shù),host表示MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)所在的主機(jī)名,user表示MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)的登錄名,password表示登錄MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)的密碼,port表示MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)的端口號(hào)。然后,通過(guò)db對(duì)象的cursor方法獲得操作數(shù)據(jù)庫(kù)管理系統(tǒng)的cursor游標(biāo),并使用execute方法執(zhí)行具體的SQL語(yǔ)句。該SQL語(yǔ)句表示創(chuàng)建一個(gè)名為WEPAPI4的數(shù)據(jù)庫(kù),默認(rèn)字符集設(shè)置為utf8mb4。最后,使用db對(duì)象的close方法關(guān)閉數(shù)據(jù)庫(kù)連接。db=pymysql.connect(host='localhost',user='root',password='密碼',port=3306)cursor=db.cursor()cursor.execute("CREATEDATABASEWEBAPI4DEFAULTCHARACTERSETutf8mb4")db.close()14)通過(guò)導(dǎo)入pymysql庫(kù)的connect方法返回pymysql的數(shù)據(jù)庫(kù)連接對(duì)象db2,在該方法中傳入?yún)?shù),從左往右分別表示:主機(jī)名,數(shù)據(jù)庫(kù)管理系統(tǒng)登錄名,登錄密碼,數(shù)據(jù)庫(kù)名,端口號(hào)。然后,通過(guò)db2對(duì)象的cursor方法獲得操作數(shù)據(jù)庫(kù)管理系統(tǒng)的cursor2游標(biāo),并使用execute方法執(zhí)行具體的SQL語(yǔ)句。該SQL語(yǔ)句表示在數(shù)據(jù)庫(kù)WEBAPI3中,如果已經(jīng)存在一個(gè)名為webapi4的表
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 滑雪板固定器行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 2025年中國(guó)高低壓配電柜市場(chǎng)深度分析及投資戰(zhàn)略咨詢報(bào)告
- 業(yè)務(wù)信息傭金合同范例
- 傳統(tǒng)師承合同范本
- 分銷白酒合同范本
- 樂(lè)器供銷合同范例
- 交工驗(yàn)收質(zhì)量檢測(cè)合同范例
- 農(nóng)村小型承包設(shè)備合同范本
- 2025年度房地產(chǎn)項(xiàng)目風(fēng)險(xiǎn)評(píng)估盡職調(diào)查合同
- 2025年度古董鑒定與買賣服務(wù)合同
- 知識(shí)庫(kù)管理規(guī)范大全
- 2024年贛州民晟城市運(yùn)營(yíng)服務(wù)有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 領(lǐng)導(dǎo)干部報(bào)告?zhèn)€人事項(xiàng)
- 9這點(diǎn)挫折算什么(課件)-五年級(jí)上冊(cè)生命與健康
- 價(jià)格監(jiān)督檢查知識(shí)培訓(xùn)課件
- 駐場(chǎng)保潔方案
- 中國(guó)心理衛(wèi)生協(xié)會(huì)家庭教育指導(dǎo)師參考試題庫(kù)及答案
- 智能廣告投放技術(shù)方案
- 知識(shí)產(chǎn)權(quán)保護(hù)執(zhí)法
- 高質(zhì)量社區(qū)建設(shè)的路徑與探索
- 數(shù)字化時(shí)代的酒店員工培訓(xùn):技能升級(jí)
評(píng)論
0/150
提交評(píng)論