版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
requests技術(shù)應(yīng)用案例requests庫技術(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)頁結(jié)構(gòu)和內(nèi)容使用requests庫編寫爬蟲代碼獲取指定的靜態(tài)和動(dòng)態(tài)數(shù)據(jù)使用BeautifulSoup實(shí)現(xiàn)數(shù)據(jù)的解析使用pymysql庫和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)頁主頁顯示的主要的內(nèi)容,有筆記本電腦型號、價(jià)格、配置、評價(jià)分?jǐn)?shù)等,本次任務(wù)案例,我們將要獲取該頁的所有筆記本電腦信息。圖4.3-1網(wǎng)址主頁
判斷此數(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ù),所以可以編寫爬蟲獲取網(wǎng)頁標(biāo)簽內(nèi)容即可圖4.3-2標(biāo)簽檢查數(shù)據(jù)類型天問一號成功登陸火星,對于靜態(tài)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)整體把控和分析要求極高。充分體現(xiàn)勞模精神:勞模精神,是指“愛崗敬業(yè)、爭創(chuàng)一流、艱苦奮斗、勇于創(chuàng)新、淡泊名利、甘于奉獻(xiàn)”的勞動(dòng)模范的精神。
使用python編寫爬蟲獲取網(wǎng)頁靜態(tài)數(shù)據(jù),有針對性地獲得在網(wǎng)頁中的筆記本電腦型號、價(jià)格、配置、評價(jià)分?jǐn)?shù)。具體步驟如下。在python中導(dǎo)入requests庫和bs4庫中的BeautifulSoup,并且定義一個(gè)空列表new_list,用于存儲(chǔ)爬取下來的靜態(tài)數(shù)據(jù),并自定義第一個(gè)列表,這個(gè)列表將作為對應(yīng)數(shù)據(jù)的字段名和后續(xù)數(shù)據(jù)的存儲(chǔ)。importrequestsfrombs4importBeautifulSoupnew_list=[['電腦型號','價(jià)格','配置','評分']]構(gòu)造爬蟲代碼請求該URL的Headers頭部信息。在“開發(fā)者工具”的Network欄目下的Headers中得到該默認(rèn)URL的Headers頭部信息。其目的是為了向業(yè)務(wù)網(wǎng)站A網(wǎng)址的后臺(tái)服務(wù)器隱藏爬蟲代碼的真實(shí)身份,讓爬蟲代碼帶著這些請求信息偽裝成瀏覽器正常訪問該網(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庫的get()方法獲得網(wǎng)址的Response對象,并設(shè)置headers參數(shù),并定義變量req進(jìn)行保存。req=requests.get(url=complete_url,headers=headers)5)使用encoding方法,設(shè)置req變量的編碼方式。req.encoding='GBK'6)使用BeautifulSoup庫解析HTML文檔的代碼。req.txt是一個(gè)包含HTML內(nèi)容的字符串,features定義了解析器為’html.parser’,用于將HTML轉(zhuǎn)換為Python對象,定義變量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)頁結(jié)構(gòu)中,通過分析,我們可以發(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è)空列表,用于分別保存筆記本電腦型號、價(jià)格、配置、評價(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)行測試,由以上代碼可知,列表a,b,c,d中的數(shù)據(jù)被整合在new_list中保存的就是我們從網(wǎng)頁爬取的靜態(tài)數(shù)據(jù),我們打印出來觀察是否正確圖4.3-5運(yùn)行測試1)導(dǎo)入Pandas庫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庫技術(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)頁結(jié)構(gòu)和內(nèi)容使用requests庫編寫爬蟲代碼獲取指定的靜態(tài)和動(dòng)態(tài)數(shù)據(jù)使用BeautifulSoup實(shí)現(xiàn)數(shù)據(jù)的解析使用pymysql庫和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)頁主頁顯示的主要的內(nèi)容,有筆記本電腦型號、價(jià)格、配置、評價(jià)分?jǐn)?shù)等,本次任務(wù)案例,我們將要獲取該頁的所有筆記本電腦信息。圖4.3-1網(wǎng)址主頁
判斷此數(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ù),所以可以編寫爬蟲獲取網(wǎng)頁標(biāo)簽內(nèi)容即可圖4.3-2標(biāo)簽檢查數(shù)據(jù)類型天問一號成功登陸火星,對于靜態(tài)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)整體把控和分析要求極高。充分體現(xiàn)勞模精神:勞模精神,是指“愛崗敬業(yè)、爭創(chuàng)一流、艱苦奮斗、勇于創(chuàng)新、淡泊名利、甘于奉獻(xiàn)”的勞動(dòng)模范的精神。網(wǎng)頁分頁爬取的翻頁操作實(shí)現(xiàn)對保存網(wǎng)頁的變量complete_url進(jìn)行操作,設(shè)置首先觀察網(wǎng)頁,如圖4.3-7所示圖4.3-7翻頁網(wǎng)址變化由此我們可以知道,后綴subcate16_0_list_1_0_99_2_0_X控制網(wǎng)頁的頁數(shù),所以我們可以自定義for循環(huán)使X的值不同,以達(dá)到去到不同頁面的目的,使用str函數(shù)將其拼接在網(wǎng)址后,從而得到新網(wǎng)頁地址。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)址完成翻頁效果4.3.4數(shù)據(jù)預(yù)處理1)導(dǎo)入指定的庫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['評分'].isnull())#2.1.2刪除缺失值laptops.drop(index=laptops[laptops['評分'].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ù),判斷是否超過閾值z_scores=zscore(laptops['評分'])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ù),用于處理包含萬字的數(shù)值列defprocess_wan(value):try:ifre.search(r'萬',value):returnfloat(re.sub(r'萬','',value))*10000else:returnfloat(value)except(ValueError,TypeError):return0#對每一列應(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.評分標(biāo)準(zhǔn)化min_rating=laptops_new['評分'].min()max_rating=laptops_new['評分'].max()#使用Min-Max標(biāo)準(zhǔn)化函數(shù)進(jìn)行標(biāo)準(zhǔn)化laptops_new.loc[:,'評分_normalized']=laptops_new['評分'].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)頁結(jié)構(gòu)和內(nèi)容使用requests庫編寫爬蟲代碼獲取指定的靜態(tài)數(shù)據(jù)使用BeautifulSoup實(shí)現(xiàn)從網(wǎng)頁中提取數(shù)據(jù)使用pymysql庫實(shí)現(xiàn)數(shù)據(jù)的持久化4.4.1頁面分析
使用谷歌瀏覽器進(jìn)入業(yè)務(wù)網(wǎng)站網(wǎng)頁界面可以獲得相關(guān)信息,如電影名(moviename)、導(dǎo)演名(directorname)、年份(movieyear)、國籍(movienation)、電影類型(movietype)等的靜態(tài)數(shù)據(jù),如圖4-1所示。圖4-14.4.2獲取靜態(tài)數(shù)據(jù)
在開發(fā)者工具中Elements選項(xiàng)卡中可以獲取得到電影的相關(guān)信息,如電影名,導(dǎo)演名,點(diǎn)評人數(shù)等,該類信息均為靜態(tài)數(shù)據(jù),如圖4-2所示。因此這里可以使用requests庫和lxml庫編寫自定義的爬蟲代碼對這些靜態(tài)數(shù)據(jù)直接進(jìn)行獲取提供了依據(jù)。圖4-2Elements選項(xiàng)卡中的靜態(tài)數(shù)據(jù)
在“開發(fā)者工具”的network選項(xiàng)卡中可以觀察到該網(wǎng)頁的狀態(tài)碼(statuscode)、請求方式(requestmethod)、瀏覽器信息(User-Agent)等信息,如圖4-3所示。這些信息能夠?yàn)榻酉聛淼呐老x代碼更直接的提取出需要的信息。圖4-3瀏覽器詳細(xì)的Headers信息通過前面對該頁面進(jìn)行了詳細(xì)的結(jié)構(gòu)和內(nèi)容分析之后,現(xiàn)在可以開始使用requests和BeautifulSoup編寫自定義的爬蟲代碼對該部分的靜態(tài)數(shù)據(jù)直接進(jìn)行獲取了,這里主要包含三個(gè)步驟。1.準(zhǔn)備階段1)導(dǎo)入requests和BeautifulSoup,pandas,pymysql等,requests庫用于獲取URL的頁面響應(yīng)數(shù)據(jù),BeautifulSoup用于從網(wǎng)頁中提取數(shù)據(jù)。importrequestsfrombs4importBeautifulSoupimportpandasaspdimportnumpyasnpimportre靜態(tài)數(shù)據(jù)獲取的總體步驟 2)構(gòu)建列表用于臨時(shí)存儲(chǔ)從網(wǎng)頁中爬取出來的相關(guān)信息 movie_names_lst=[] director_names=[] actor_names=[] movie_years=[] movie_nations=[] movie_types=[] lst_data_table=[] 3)構(gòu)造爬蟲代碼請求該URL的Headers頭部信息。在開發(fā)者工具的“Network”選項(xiàng)卡下的“Headers”選項(xiàng)卡中得到該默認(rèn)URL的Headers頭部信息。其目的是豆瓣的后臺(tái)服務(wù)器隱藏爬蟲代碼的真實(shí)身份,讓爬蟲代碼帶著這些請求信息偽裝成瀏覽器正常訪問該網(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ā)送請求并獲取響應(yīng) 1)向服務(wù)端發(fā)起請求,如果成功,服務(wù)端會(huì)返回當(dāng)前頁面的所有內(nèi)容(通常是一個(gè)html文件)然后手動(dò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()方法來查找電影名,并將查找到的數(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)提取評價(jià)人數(shù)、分?jǐn)?shù)、電影導(dǎo)演等信息,在提取電影導(dǎo)演主演等信息的過程中是會(huì)發(fā)現(xiàn)有些數(shù)據(jù)由于導(dǎo)演名過長導(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)頁結(jié)構(gòu)和內(nèi)容使用requests庫編寫爬蟲代碼獲取指定的靜態(tài)數(shù)據(jù)使用BeautifulSoup實(shí)現(xiàn)從網(wǎng)頁中提取數(shù)據(jù)使用pymysql庫實(shí)現(xiàn)數(shù)據(jù)的持久化4.4.3數(shù)據(jù)持久化存儲(chǔ)
為了保證數(shù)據(jù)的可靠性,保障數(shù)據(jù)不會(huì)丟失,并提高應(yīng)用程序的性能讓程序可以直接從存儲(chǔ)介質(zhì)中加載數(shù)據(jù)這是便需要對數(shù)據(jù)進(jìn)行持久化存儲(chǔ)。 1)導(dǎo)入pymysql庫,用于連接Mysql。 importpymysql 2)提前在mysql中創(chuàng)建好test數(shù)據(jù)庫,在test數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表movie_douban包含字段moviename(電影名),directorname(導(dǎo)演名),moiveyear(年份),moivenation(國籍),movietype(電影類型),通過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)入指定的庫importpandasaspd2)自定義方法main(),作為實(shí)現(xiàn)調(diào)用其他數(shù)據(jù)預(yù)處理自定義方法的入口。defmain():#1數(shù)據(jù)讀取column_names=['電影名稱','導(dǎo)演','年份','國籍','類型']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ù)#按年份和國籍分組并計(jì)算每年每個(gè)國籍的電影數(shù)量pivot_table=pd.pivot_table(data_new,values='電影名稱',index='年代',columns='國籍',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處理國籍?dāng)?shù)據(jù)nationalities_split=filtered_movies['國籍'].str.split('',expand=True)filtered_movies['國籍']=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)頁結(jié)構(gòu)和內(nèi)容使用requests庫編寫爬蟲代碼獲取指定的動(dòng)態(tài)數(shù)據(jù)使用urlencode方法編碼使用pymysql庫實(shí)現(xiàn)數(shù)據(jù)的持久化在進(jìn)入業(yè)務(wù)網(wǎng)站C界面時(shí),在切換“城市”時(shí)會(huì)出現(xiàn)不同的汽車信息。通過“開發(fā)者工具”的Network選項(xiàng)卡中的XHR可以發(fā)現(xiàn)出現(xiàn)了一個(gè)動(dòng)態(tài)數(shù)據(jù)請求URL,如圖5-1所示。因此,接下來將圍繞該URL進(jìn)行分析。4.5.1
頁面分析圖5-1動(dòng)態(tài)數(shù)據(jù)請求URL通過“開發(fā)者工具”的Network欄目中的XHR查看該URL的Preview可以看到返回的動(dòng)態(tài)數(shù)據(jù),如圖5-2所示。該數(shù)據(jù)是一個(gè)字典和列表相互嵌套使用的數(shù)據(jù)集合。因此,要獲得指定的數(shù)據(jù)就必須要對該數(shù)據(jù)集合進(jìn)行準(zhǔn)確的解析。圖5-2動(dòng)態(tài)數(shù)據(jù)的結(jié)構(gòu)和內(nèi)容在“Headers”選項(xiàng)卡,可以看見這個(gè)AJAX請求的URL地址是./ashx/AjaxIndexHotCarByDsj.ashx?cityid=110100其中cityid參數(shù)為110100,如圖5-3所示圖5-3切換該網(wǎng)站的城市位置如圖5-4所示,打開“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通過使用“開發(fā)者工具”詳細(xì)查看并分析了頁面內(nèi)容,現(xiàn)在已經(jīng)獲得了動(dòng)態(tài)數(shù)據(jù)的結(jié)構(gòu)和內(nèi)容。因此,這里使用requests庫編寫自定義的爬蟲代碼,針對頁面結(jié)構(gòu)通過使用循環(huán)語句獲取到頁面結(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對象來發(fā)送請求,并返回響應(yīng)的數(shù)據(jù)。fromurllib.parseimporturlencodeimportrequests2)找到需要模擬的AJAX請求的url,并將其復(fù)制給變量original_url。fromurllib.parseimporturlencodeimportrequests3)根據(jù)該AJAX條目的RequestHeaders設(shè)置符合該AJAX的請求基本信息。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請求。在try..except..語句中使用requests的get()方法獲得上面的URL,并通過設(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。通過前面的分析得出,這個(gè)AJAX返回的數(shù)據(jù)是一個(gè)字典列表,因此,通過設(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)頁結(jié)構(gòu)和內(nèi)容使用requests庫編寫爬蟲代碼獲取指定的動(dòng)態(tài)數(shù)據(jù)使用urlencode方法編碼使用pymysql庫實(shí)現(xiàn)數(shù)據(jù)的持久化為了保證數(shù)據(jù)的可靠性,保障數(shù)據(jù)不會(huì)丟失,并提高應(yīng)用程序的性能讓程序可以直接從存儲(chǔ)介質(zhì)中加載數(shù)據(jù)這是便需要對數(shù)據(jù)進(jìn)行持久化存儲(chǔ)。在前面的基礎(chǔ)上用AJAX采集單個(gè)汽車品牌系列的名稱,單個(gè)汽車品牌系列的ID。并將其采集到的數(shù)據(jù)保存到MySQL數(shù)據(jù)庫中。4.5.3
數(shù)據(jù)持久化存儲(chǔ)1) 導(dǎo)入pymysql,用于連接MySQL。importpymysql2) 通過PyMQL建立MySQL連接,創(chuàng)建AJAX數(shù)據(jù)庫和ajax數(shù)據(jù)表。設(shè)置數(shù)據(jù)表字段為car_name和id,id為主鍵。通過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。最后通過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開放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)用通過API接口,可以實(shí)現(xiàn)存儲(chǔ)服務(wù)、消息服務(wù)、計(jì)算服務(wù)等能力,利用這些能力可以開發(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提供了豐富的開放WEBAPI供廣大開發(fā)者使用。通過這些WEBAPI的文檔定義規(guī)范,將有針對性地使用爬蟲工具采集針對“repositories?q=spider”,即庫名為spider的業(yè)務(wù)網(wǎng)站D項(xiàng)目的基本信息,并使用sorted方法根據(jù)所有項(xiàng)目的分?jǐn)?shù)進(jìn)行排名,以及保存至MySQL數(shù)據(jù)庫中。4.2業(yè)務(wù)網(wǎng)站D4.2.1業(yè)務(wù)網(wǎng)站D的概述作為一個(gè)知名的開源分布式版本控制系統(tǒng),業(yè)務(wù)網(wǎng)站D(http://www.github/),能夠快速,高效地處理各種大小項(xiàng)目的版本控制和管理。起初,業(yè)務(wù)網(wǎng)站D只是用于管理Linux內(nèi)核開發(fā),但隨著開源軟件的不斷增多,越來越多的應(yīng)用程序都將自己的項(xiàng)目遷移到業(yè)務(wù)網(wǎng)站D上,目前業(yè)務(wù)網(wǎng)站D擁有超過數(shù)百萬開發(fā)者用戶?,F(xiàn)在,業(yè)務(wù)網(wǎng)站D不僅提供項(xiàng)目的版本控制,還能夠讓開發(fā)者共享已有代碼。如圖4-1所示。圖4-1業(yè)務(wù)網(wǎng)站D首頁4.2.2業(yè)務(wù)網(wǎng)站D的基本用法
在登錄業(yè)務(wù)網(wǎng)站D之后,可以通過搜索控件搜索特定的關(guān)鍵字信息包括作者姓名,項(xiàng)目名稱以及基于特定語言的項(xiàng)目等等,可以單擊“Startaproject”建立一個(gè)自己的項(xiàng)目庫,可以在“Issues”中查看之前項(xiàng)目反饋的處理信息,可以在“Explore”中查找自己感興趣的項(xiàng)目信息,可以在“Marketplace”搜索自己需要的項(xiàng)目工具和資源。如圖4-2所示.圖4-2業(yè)務(wù)網(wǎng)站D用戶首頁
這里將建立一個(gè)項(xiàng)目庫,并在業(yè)務(wù)網(wǎng)站D的WEBAPI中查詢到它。1)單擊“Startaproject”建立一個(gè)的項(xiàng)目庫,選擇一個(gè)“Owner”作為項(xiàng)目的擁有者,并給“Repositoryname”添加一個(gè)項(xiàng)目名稱。同時(shí),還可以給項(xiàng)目附加一些額外的信息描述“Description”。然后選擇“Public”或者“Private”分別表示任何人都能夠看見和使用此庫和只有指定的人群可以看見和使用此庫。最后根據(jù)是創(chuàng)建一個(gè)全新的庫還是通過導(dǎo)入之前已有的庫決定是否打鉤“InitializethisrepositorywithaREADME”。單擊“Createrepository”創(chuàng)建該庫。如圖4-3所示。圖4-3配置項(xiàng)目庫基本信息2)成功創(chuàng)建該項(xiàng)目庫之后,就可以對該項(xiàng)目庫進(jìn)行維護(hù)管理。包括“Createnewfile”創(chuàng)建新文件,“Uploadfiles”上傳文件,“Findfile”找文件,“Cloneordownload”克隆或下載文件等。如圖4-4所示。圖4-4項(xiàng)目庫維護(hù)管理4.3WEBAPI 4.3.1WEBAPI的概述 作為網(wǎng)站的主要組成部分,WEBAPI可以實(shí)現(xiàn)用戶對特定信息的需求。WEBAPI最主要的功能是實(shí)現(xiàn)構(gòu)建基于HTTP的面向各種客戶端的服務(wù)框架。WEBAPI通過基于HTTPREQUEST的各種動(dòng)作GET,POST,PUT,DELETE實(shí)現(xiàn)客戶端向服務(wù)器請求CREATE,RETRIEVE,UPDATE,DELETE操作,并使用HTTPRESPONSE的HttpStatusCode從服務(wù)器獲得HTTPREQUEST的處理結(jié)果狀態(tài)。另外,REQUEST和RESPONSE的數(shù)據(jù)格式是易于處理的JSON或XML格式。因此,WEBAPI對于高度依賴第三方數(shù)據(jù)源的應(yīng)用具有十分重要的使用價(jià)值,特別是對于實(shí)時(shí)性要求比較高的應(yīng)用程序。接下來,將是介紹如何使用WEPAPI獲取GitHub的特定信息。4.3.2業(yè)務(wù)網(wǎng)站D開放API的數(shù)據(jù)特點(diǎn)由于業(yè)務(wù)網(wǎng)站D是一個(gè)分布式系統(tǒng),因此,在業(yè)務(wù)網(wǎng)站D中并不存在主庫這樣的概念,開發(fā)者通過克隆即可將每一個(gè)完整的庫(repositories)復(fù)制到本地機(jī)器中獨(dú)立使用,任何兩個(gè)庫之間的不一致之處都可以進(jìn)行合并。那么如何訪問和使用這些項(xiàng)目庫,就必須要使用到業(yè)務(wù)網(wǎng)站D的開放API。下面是api.github/的WEBAPI列表。如圖4-5所示。圖4-5GitHub開放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鍵對應(yīng)的URL表示用于在GitHub中搜索代碼庫,此外還指明了如何構(gòu)建傳給URL的參數(shù)。其中,q表示需要查詢的庫名稱關(guān)鍵字。page表示限制查詢結(jié)果顯示的總頁數(shù)。per_page表示限制每頁里面顯示查詢到的數(shù)據(jù)個(gè)數(shù)。sort表示根據(jù)一定的篩選方式進(jìn)行顯示。order表示按照一定的排序方式進(jìn)行顯示。參數(shù)之間使用&進(jìn)行分隔。這個(gè)WEBAPI返回的數(shù)據(jù)格式為JSON(JavaScriptObjectNotation,JavaScript對象表示法)格式。JSON是一種“輕量級數(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ù)器代碼使用何種語言,前端使用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開放API中的api.github/search/repositories?q=spider&per_page=1&sort=score&order=desc表示從業(yè)務(wù)網(wǎng)站D的repositories里面查詢q=spider,即庫名關(guān)鍵字是spider。顯示結(jié)果根據(jù)sort=score和order=desc,即按照符合條件的庫的得分以降序的方式顯示。顯示方式根據(jù)per_page=2,即每個(gè)頁面只顯示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ù)格式返回的,并且都具有相同的鍵以及對應(yīng)不同的值。例如,第一個(gè)查詢結(jié)果的鍵“id”是52476585,第二個(gè)查詢結(jié)果的鍵“id”是74628476。這樣可以極大地方便數(shù)據(jù)的統(tǒng)一管理和查詢檢索。4.3.3業(yè)務(wù)網(wǎng)站D的API請求數(shù)據(jù)
1.業(yè)務(wù)網(wǎng)站D的API結(jié)構(gòu)分析下面使用業(yè)務(wù)網(wǎng)站D的WebAPI來實(shí)現(xiàn)數(shù)據(jù)的請求。首先,來分析一下這個(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)過域名服務(wù)器解析之后便可得到服務(wù)器的IP地址。(3)/users/{user}/repos表示該服務(wù)器的文件系統(tǒng)中的文件夾或文件的虛擬路徑。這里的{user}表示需要設(shè)置的用戶名。(4){?type,page,per_page,sort}表示問號后面可以使用的鍵。type表示要查找的文件類型或項(xiàng)目類型。page表示限制查詢結(jié)果顯示的總頁數(shù)。per_page表示限制每頁里面顯示查詢到的數(shù)據(jù)個(gè)數(shù)。sort表示根據(jù)一定的篩選方式進(jìn)行顯示。參數(shù)的目的是向服務(wù)器請求特定的信息。2.業(yè)務(wù)網(wǎng)站D的API請求實(shí)例因此,api.github/users/simonlee1984/repos?type=python&per_page=2這個(gè)WEBAPI的作用是請求使用基于安全的超文本傳輸協(xié)議向名叫api.github的服務(wù)器中的文件夾路徑為/users/simonlee1984/repos?type=python&per_page=2中的用戶名是simonlee1984的用戶所維護(hù)的項(xiàng)目庫數(shù)據(jù)中與python相關(guān)的內(nèi)容,并且以每頁2各個(gè)項(xiàng)目的形式進(jìn)行顯示。這個(gè)WEBAPI在瀏覽器中輸出的結(jié)果如圖4-7所示。圖4-7simonlee1984的python相關(guān)項(xiàng)目庫simonlee1984的python_crawler項(xiàng)目庫b)simonlee1984的python_spider項(xiàng)目庫b)a)從輸出的結(jié)果中可以看到,這個(gè)WEBAPI返回的數(shù)據(jù)格式為JSON。其中,“name”表示每個(gè)項(xiàng)目庫的名稱,全部都是與Python相關(guān)的項(xiàng)目庫。“private”表示該項(xiàng)目庫是否公開讓所有人瀏覽和使用。False表示公開。“owner”表示該項(xiàng)目庫所有者的相關(guān)信息,包括:“url”表示指向該擁有者在GitHub的主頁?!癴ollowers_url”表示關(guān)注該作者的其他作者信息?!癴ollowing_url”表示該作者所關(guān)注的其他作者信息?!皉epos_url”表示該作者所維護(hù)管理的所有項(xiàng)目庫等等。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ù)所包含的值比較多,不便于顯示,所以這里將對獲得的數(shù)據(jù)進(jì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庫。importrequests2)定義指定的WEBAPI的URL,并將其賦給變量api_url。api_url='api.github/search/repositories?q=spider'3)使用requests庫的get方法獲得WEBAPI的Response對象。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ù)對象。req_dic=req.json()6)使用為JSON的數(shù)據(jù)對象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)行清洗,有針對性地獲得在業(yè)務(wù)網(wǎng)站D中所有與spider有關(guān)的項(xiàng)目庫的總數(shù),驗(yàn)證是否完全獲得了本次API的響應(yīng)數(shù)據(jù),返回當(dāng)前瀏覽器頁面所顯示的項(xiàng)目庫數(shù)量,查看第一個(gè)項(xiàng)目中的鍵數(shù)量,獲得第一個(gè)項(xiàng)目中的具體內(nèi)容,獲得第一個(gè)項(xiàng)目作者的登錄名,獲得第一個(gè)項(xiàng)目的全名,獲得第一個(gè)項(xiàng)目的描述,獲得第一個(gè)項(xiàng)目評分。具體步驟如下:(1)Python中導(dǎo)入requests庫importrequests(2)定義指定的WEBAPI的URLapi_url='api.github/search/repositories?q=spider'(3)使用requests庫的get方法獲得WEBAPI的Response對象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ù)對象req_dic=req.json()(6)打印輸出字典對象req_dic的鍵為’total_count’的值,該值表示與spider有關(guān)的庫總數(shù)。print('與spider有關(guān)的庫總數(shù):',req_dic['total_count'])(7)打印輸出字典對象req_dic的鍵為’incomplete_results’的值,該值表示本次WEBAPI請求是否完成。其中,false表示完整,true表示不完整。print('本次請求是否完整:',req_dic['incomplete_results'])(8)獲得字典對象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)前頁面返回的項(xiàng)目數(shù)量:',len(req_dic_items))(10)通過數(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’的值中嵌套的鍵值對’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)目的評分。print('獲得第一個(gè)項(xià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)的庫總數(shù):',req_dic['total_count'])print('本次請求是否完整:',req_dic['incomplete_results'])req_dic_items=req_dic['items']print('當(dāng)前頁面返回的項(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)目評分:',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開放API的數(shù)據(jù)特點(diǎn)了解業(yè)務(wù)網(wǎng)站D的API進(jìn)行數(shù)據(jù)采集和清洗以及持久化存儲(chǔ)13)通過導(dǎo)入pymysql庫的connect方法返回pymysql的數(shù)據(jù)庫連接對象db,在該方法中傳入?yún)?shù),host表示MySQL數(shù)據(jù)庫管理系統(tǒng)所在的主機(jī)名,user表示MySQL數(shù)據(jù)庫管理系統(tǒng)的登錄名,password表示登錄MySQL數(shù)據(jù)庫管理系統(tǒng)的密碼,port表示MySQL數(shù)據(jù)庫管理系統(tǒng)的端口號。然后,通過db對象的cursor方法獲得操作數(shù)據(jù)庫管理系統(tǒng)的cursor游標(biāo),并使用execute方法執(zhí)行具體的SQL語句。該SQL語句表示創(chuàng)建一個(gè)名為WEPAPI4的數(shù)據(jù)庫,默認(rèn)字符集設(shè)置為utf8mb4。最后,使用db對象的close方法關(guān)閉數(shù)據(jù)庫連接。db=pymysql.connect(host='localhost',user='root',password='密碼',port=3306)cursor=db.cursor()cursor.execute("CREATEDATABASEWEBAPI4DEFAULTCHARACTERSETutf8mb4")db.close()14)通過導(dǎo)入pymysql庫的connect方法返回pymysql的數(shù)據(jù)庫連接對象db2,在該方法中傳入?yún)?shù),從左往右分別表示:主機(jī)名,數(shù)據(jù)庫管理系統(tǒng)登錄名,登錄密碼,數(shù)據(jù)庫名,端口號。然后,通過db2對象的cursor方法獲得操作數(shù)據(jù)庫管理系統(tǒng)的cursor2游標(biāo),并使用execute方法執(zhí)行具體的SQL語句。該SQL語句表示在數(shù)據(jù)庫WEBAPI3中,如果已經(jīng)存在一個(gè)名為webapi4的表
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年銷售人員入職培訓(xùn)與職業(yè)發(fā)展合同
- 公開課《土地的誓言》課件
- 區(qū)塊鏈在體育領(lǐng)域的應(yīng)用案例考核試卷
- 2025版學(xué)校浴室熱水供應(yīng)設(shè)備采購與安裝合同3篇
- 2025版土地使用權(quán)出讓居間合同(高端定制版)3篇
- 2025年博主合作廣告合同
- 2025年度健康養(yǎng)生門面店鋪轉(zhuǎn)讓及服務(wù)項(xiàng)目合作協(xié)議4篇
- 2025年博物文化貸款合同
- 2025年高校外國文教專家教學(xué)與研究合作合同3篇
- 2025年公司增資協(xié)議書模板
- 乳腺癌的綜合治療及進(jìn)展
- 【大學(xué)課件】基于BGP協(xié)議的IP黑名單分發(fā)系統(tǒng)
- 2025年八省聯(lián)考高考語文試題真題解讀及答案詳解課件
- 信息安全意識培訓(xùn)課件
- 2024年山東省泰安市初中學(xué)業(yè)水平生物試題含答案
- 美的MBS精益管理體系
- 2024安全員知識考試題(全優(yōu))
- 中國移動(dòng)各省公司組織架構(gòu)
- 昆明手繪版旅游攻略
- 法律訴訟及咨詢服務(wù) 投標(biāo)方案(技術(shù)標(biāo))
- 格式塔心理咨詢理論與實(shí)踐
評論
0/150
提交評論