網絡爬蟲項目實戰(zhàn) 教案 項目六 房產Requests+Parsel+MTC項目實戰(zhàn)_第1頁
網絡爬蟲項目實戰(zhàn) 教案 項目六 房產Requests+Parsel+MTC項目實戰(zhàn)_第2頁
網絡爬蟲項目實戰(zhàn) 教案 項目六 房產Requests+Parsel+MTC項目實戰(zhàn)_第3頁
網絡爬蟲項目實戰(zhàn) 教案 項目六 房產Requests+Parsel+MTC項目實戰(zhàn)_第4頁
網絡爬蟲項目實戰(zhàn) 教案 項目六 房產Requests+Parsel+MTC項目實戰(zhàn)_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

教師備課紙?zhí)K州工業(yè)職業(yè)技術學院教師備課紙SuzhouInstituteOfIndustrialTechnology第

PAGE

19頁教師備課首頁蘇州工業(yè)職業(yè)技術學院教師備課首頁SuzhouInstituteOfIndustrialTechnology第1頁課題項目六房產Requests+Parsel+MTC項目實戰(zhàn)課型理實一體授課班級大數(shù)據(jù)22C1、大數(shù)據(jù)22C2授課時數(shù)8教學目標(1)掌握Requests+Parsel爬蟲用法。(2)掌握XPath語法格式。(3)掌握CSS選擇器。(4)掌握從CSV文件讀取到DataFrame。(5)掌握DataFrame去重去空方法。(6)掌握DataFrame列裂變。(7)掌握DataFrame保存到CSV文件。(8)掌握文件導入MySQL數(shù)據(jù)庫。(9)掌握Flask搭建數(shù)據(jù)可視化服務。(10)了解ECharts柱狀圖和折線圖。教學重點(1)掌握XPath語法格式。(2)掌握CSS選擇器。(3)掌握Flask框架可視化圖表。教學難點Flask框架可視化圖表學情分析學生零基礎,在教學中注重引導學生學會自主學習,培養(yǎng)學生學會查找文獻資料教學效果教后記任務1:Requests+Parsel采集數(shù)據(jù)Parsel是一個Python的第三方庫,可以解析HTML和XML,并支持使用XPath和CSS選擇器對內容進行提取和修改,同時還融合了正則表達式的提取功能。下面以爬取某房產網站為例,介紹Requests配合Parsel采集租房數(shù)據(jù)的詳細步驟。步驟1:轉到Tomcat安裝目錄下的bin目錄,運行startup.bat后,打開Chrome,訪問:50001/findhouse/index1.html,顯示網站頁面,代表Tomcat運行正常。步驟2:打開PyCharm,File->NewProject創(chuàng)建PyCharm項目rent-house,手工填寫項目路徑,選擇Anaconda編譯器(python.exe)。點擊“Create”按鈕,創(chuàng)建空項目rent-house。步驟3:打開網站頁面(:50001/findhouse/index1.html),在頁面任意位置點擊鼠標右鍵后,選擇“檢查”,選擇“Network”選項卡,查看HTTP請求和返回內容。點擊“Clear”按鈕,清除緩存,同時按下Ctrl+R,重新加載頁面。切換到“Doc”選項卡后,左側選擇“index1.html”,查看RequestHeaders,保存User-Agent、cookie(如果有的話)、referer(如果有的話)3個屬性值。步驟4:在項目根目錄下New->PythonFile,創(chuàng)建spider.py。在spider.py中,定義get_page函數(shù),headers的“User-Agent”值使用上面RequestHeaders復制過來的內容。#-*-coding:UTF-8-*-importcsvimportrandomimportrefromtimeimportsleepimportrequestsfromlxmlimportetreefromparselimportSelectorfromrequests.utilsimportget_encodings_from_content#獲取網頁源碼defget_page(url):#設置請求頭信息headers={'Cookie':'','User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36'}#發(fā)送get請求html=requests.get(url,headers=headers)#查看編碼方式enconding=get_encodings_from_content(html.text)#打印網頁內容html_doc=html.content.decode(enconding[0])#返回網頁源碼returnhtml_doc步驟5:打開網站頁面(:50001/findhouse/index1.html),鼠標停留在第1條租房信息,然后點擊鼠標右鍵后,選擇“檢查”,查看租房信息的XPath路徑,一對li標簽對應一條租房信息,先使用CSS選擇器獲取到所有class為“l(fā)istUnit-date”的li標簽,再依次遍歷這個li標簽,獲取li標簽中租房的各項信息。步驟6:在當前頁面,鼠標停留在第1條租房信息中間的文本信息塊部分,然后點擊鼠標右鍵后,選擇“檢查”,查找房屋信息塊的XPath路徑。房屋文本信息塊在li標簽中class為“pro-text”的div標簽中,房屋文本信息塊對應的CSS選擇器為“.pro-text”。步驟7:在當前頁面,鼠標停留在第1條租房信息的標題部分,然后點擊鼠標右鍵后,選擇“檢查”,查找標題的XPath路徑。標題在class為“l(fā)ist-pic-title”的div標簽中,h3標簽下的a標簽中。標題對應的CSS選擇器為“.list-pic-titleh3a::text”。步驟8:在當前頁面,鼠標停留在第1條租房信息的詳細信息部分,然后點擊鼠標右鍵后,選擇“檢查”,查找詳細信息的XPath路徑。詳細信息在class為“l(fā)ist-pic-ps”的p標簽下的span標簽中。詳細信息對應的CSS選擇器為“.list-pic-psspan::text”。步驟9:詳細信息中含區(qū)域、房屋類型、房屋結構、面積和朝向,使用split()進行切分得到具體的分項信息,朝向信息缺失的使用空字符串賦值。步驟10:類似上述步驟,查找離公共交通距離和價格的XPath路徑,得到離公共交通距離的CSS選擇器為“.list-pic-ad::text”,價格的CSS選擇器為“.price-itemsdivspan::text”。步驟11:在spider.py中增加parse_page函數(shù),初始化parsel.Selector()對象,獲取到所有class為“l(fā)istUnit-date”的li標簽,從li標簽中提取出租房的標題、區(qū)域、房屋類型、房屋結構、面積、朝向、交通距離和價格信息。將8個字段信息組合成字典,保存租房信息至house_raw.csv文件中。#爬取數(shù)據(jù)defparse_page(url):#獲取網頁源碼html=get_page(url)#暫停1~3秒的整數(shù)秒,時間區(qū)間:[1,3]sleep(random.randint(1,3))#初始化parsel.Selector()對象selector=Selector(html)#獲取到所有class為listUnit-date的li標簽node_list=selector.css("li.listUnit-date")#打印獲取到的標簽數(shù)量print(len(node_list))#遍歷li標簽,獲取li標簽中租房的各項信息fornodeinnode_list:#房屋信息塊info=node.css(".pro-text")#標題title=info.css(".list-pic-titleh3a::text").get().strip()#詳細信息detail=info.css(".list-pic-psspan::text").getall()detail[1]=re.sub("\\s+","",detail[1])contents=detail[1].split("|")#區(qū)域district=contents[0].strip()#房屋類型house_type=contents[1].strip()#房屋結構structure=contents[2].strip()#面積area=contents[3].strip()#朝向if(len(contents)<5):direction=""else:direction=contents[-1].strip()#離公共交通距離distance=info.css(".list-pic-ad::text").getall()#替換連續(xù)空格到單個空格if(len(distance)==0):distance=""if(len(distance)==1):distance=re.sub("\\s+","",distance[0].strip())if(len(distance)==2):distance=re.sub("\\s+","",distance[1].strip())#價格price=node.css(".price-itemsdivspan::text").get()#組合成字典dict={'標題':title,'區(qū)域':district,'房屋類型':house_type,'房屋結構':structure,'面積':area,'朝向':direction,'交通距離':distance,'價格':price}#保存商品信息withopen('house_raw.csv','a',newline="",encoding='utf-8')asf:csv_write=csv.writer(f)csv_write.writerow([title,district,house_type,structure,area,direction,distance,price])步驟12:在spider.py中定義主函數(shù),設置爬取網站的起始頁。if__name__=='__main__':#獲取起始頁源碼base_url=":50001/findhouse/index1.html"parse_page(base_url)步驟13:運行spider.py,應該在項目根目錄下看到文件house_raw.csv。打開house_raw.csv,看到如下結果:城家公寓北京回龍觀霍營地鐵站店2樓,昌平-回龍觀,公寓,一居室C房東直租+免中介費+整租房型,14M2,朝北,距離8號線霍營地鐵站724米,3800元柚米寓(北京旭輝26街區(qū)店)5樓,順義-順義城區(qū),公寓,復式簡約一居室房型,21M2,朝南,距離15號線南法信地鐵站562米,2530元魔方公寓(百子灣店)2樓,朝陽-百子灣,公寓,開間朝南房型,25M2,朝南,距離7號線百子灣地鐵站803米,3990元魔方公寓(百子灣店)2樓,朝陽-百子灣,公寓,開間朝北房型,25M2,朝北,距離7號線百子灣地鐵站803米,3507元泊寓西直門店5樓,海淀-小西天,公寓,一室戶D配樓房型,25M2,眾多朝向,距離2號線西直門地鐵站1138米,5997.2元泊寓西直門店2樓,海淀-小西天,公寓,一室戶A房型,15M2,眾多朝向,距離2號線西直門地鐵站1138米,4756.4元泊寓西直門店8樓,海淀-小西天,公寓,一室戶D房型,24M2,眾多朝向,距離2號線西直門地鐵站1138米,6514.2元泊寓(亦莊店)1樓,通州-次渠,公寓,LOFT房型,24M2,眾多朝向,距離亦莊線經海路地鐵站652米,2600元泊寓西直門店2樓,海淀-小西天,公寓,COUPLE房型,35M2,眾多朝向,距離2號線西直門地鐵站1138米,6930元柚米寓(北京旭輝26街區(qū)店)8樓,順義-順義城區(qū),公寓,飄窗復式中戶型房型,30M2,朝北,距離15號線南法信地鐵站562米,3380元柚米寓(北京旭輝26街區(qū)店)3樓,順義-順義城區(qū),公寓,雙窗復式兩居室房型,50M2,朝東,距離15號線南法信地鐵站562米,4490元泊寓成壽寺社區(qū)3樓,豐臺-宋家莊,公寓,standard房型,29M2,朝東,距離14號線東段方莊地鐵站821米,4558元城家公寓北京回龍觀霍營地鐵站店1樓,昌平-回龍觀,公寓,一居室A房東直租+免中介費+整租房型,13M2,眾多朝向,距離8號線霍營地鐵站724米,3400元泊寓(亦莊店)2樓,通州-次渠,公寓,Studio房型,20M2,朝南,距離亦莊線經海路地鐵站652米,2800元泊寓(亦莊店)5樓,通州-次渠,公寓,StudioL房型,25M2,朝北,距離亦莊線經海路地鐵站652米,3100元上面結果顯示15條記錄,恰好是1頁數(shù)據(jù),接下來繼續(xù)增強爬蟲,讓它具有翻頁爬取功能。步驟14:打開起始頁,滑動頁面到最底端,鼠標停留在最后一頁的頁碼“5”,然后點擊鼠標右鍵后,選擇“檢查”,查看頁碼“5”的XPath路徑為“//span[@class="pageBtnWrap"]/a[last()-1]/text()”,通過對多頁網址進行分析,找到網址的規(guī)律:index+數(shù)字序列。步驟15:修改spider.py,使爬蟲具有翻頁爬取功能。if__name__=='__main__':#獲取起始頁源碼#base_url=":50001/findhouse/index1.html"parse_page(base_url)#找到總頁數(shù)first_page_doc=get_page(base_url)first_page_tree=etree.HTML(first_page_doc)page_num=first_page_tree.xpath('//span[@class="pageBtnWrap"]/a[last()-1]/text()')page_num=(int)(page_num[0])iflen(page_num)>0else0ifpage_num:page_num=(int)(page_num)#爬取多頁foriinrange(1,page_num+1):current_url=f":50001/findhouse/index{i}.html"parse_page(current_url)運行spider.py,打開house_raw.csv。打開文件,看到如下結果:城家公寓北京回龍觀霍營地鐵站店2樓,昌平-回龍觀,公寓,一居室C房東直租+免中介費+整租房型,14M2,朝北,距離8號線霍營地鐵站724米,3800元柚米寓(北京旭輝26街區(qū)店)5樓,順義-順義城區(qū),公寓,復式簡約一居室房型,21M2,朝南,距離15號線南法信地鐵站562米,2530元魔方公寓(百子灣店)2樓,朝陽-百子灣,公寓,開間朝南房型,25M2,朝南,距離7號線百子灣地鐵站803米,3990元魔方公寓(百子灣店)2樓,朝陽-百子灣,公寓,開間朝北房型,25M2,朝北,距離7號線百子灣地鐵站803米,3507元泊寓西直門店5樓,海淀-小西天,公寓,一室戶D配樓房型,25M2,眾多朝向,距離2號線西直門地鐵站1138米,5997.2元柚米寓(北京旭輝26街區(qū)店)9樓,順義-順義城區(qū),公寓,地鐵直達望京房型,48M2,朝東,距離15號線南法信地鐵站562米,4200元柚米寓(北京旭輝26街區(qū)店)4樓,順義-順義城區(qū),公寓,白領單身公寓房型,20M2,朝南,距離15號線南法信地鐵站562米,2601元柚米寓(北京旭輝26街區(qū)店)1樓,順義-順義城區(qū),公寓,過道窗戶型房型,24M2,朝東,距離15號線南法信地鐵站562米,2575元柚米寓(北京旭輝26街區(qū)店)4樓,順義-順義城區(qū),公寓,溫馨復式一居房型,27M2,朝西,距離15號線南法信地鐵站562米,3308元柚米寓(北京旭輝26街區(qū)店)5樓,順義-順義城區(qū),公寓,空港朝北開間房型,21M2,朝北,距離15號線南法信地鐵站562米,2662元任務2:Pandas清洗數(shù)據(jù)任務1的輸出結果顯示91條記錄,其中前15條是重復數(shù)據(jù),需要刪除。另外,字段“面積”和“價格”單位需要刪除。接下來,采用Pandas完成數(shù)據(jù)清洗任務。步驟1:在項目根目錄New->PythonFile,創(chuàng)建data_clean.py,讀入house_raw.csv到DataFrame類型。#-*-coding:UTF-8-*-importpandasaspd#讀入csv文件到Dataframe對象labels=['標題','區(qū)域','房屋類型','房屋結構','面積','朝向','交通距離','價格']df=pd.read_csv("house_raw.csv",names=labels,encoding='utf-8')print(df.shape)print(df.head())運行data_clean.py,PyCharm控制臺輸出如下結果:標題區(qū)域房屋類型...朝向交通距離價格0城家公寓北京回龍觀霍營地鐵站店2樓昌平-回龍觀公寓...朝北距離8號線霍營地鐵站724米3800元1柚米寓(北京旭輝26街區(qū)店)5樓順義-順義城區(qū)公寓...朝南距離15號線南法信地鐵站562米2530元2魔方公寓(百子灣店)2樓朝陽-百子灣公寓...朝南距離7號線百子灣地鐵站803米3990元3魔方公寓(百子灣店)2樓朝陽-百子灣公寓...朝北距離7號線百子灣地鐵站803米3507元4泊寓西直門店5樓海淀-小西天公寓...眾多朝向距離2號線西直門地鐵站1138米5997.2元步驟2:完善data_clean.py,刪除重復記錄,剔除缺失值。#去重df=df.drop_duplicates()#剔除缺失值df=df.dropna()print(df.shape)運行data_clean.py,PyCharm控制臺輸出如下結果:(42,8)步驟3:完善data_clean.py,從“標題”列抽取出小區(qū)和樓層。#標題裂變?yōu)?列df['小區(qū)']=df['標題'].apply(lambdax:x.split('')[0])df['小區(qū)']=df['小區(qū)'].str.replace('(.*?)','')df['樓層']=df['標題'].apply(lambdax:x.split('')[1])print(df[["小區(qū)","樓層"]].head())運行data_clean.py,PyCharm控制臺輸出如下結果:小區(qū)樓層0城家公寓北京回龍觀霍營地鐵站店2樓1柚米寓5樓2魔方公寓2樓3魔方公寓2樓4泊寓西直門店5樓步驟4:完善data_clean.py,從“區(qū)域”列抽取出區(qū)和域。#區(qū)域裂變?yōu)?列df['區(qū)']=df['區(qū)域'].apply(lambdax:x.split('-')[0])df['域']=df['區(qū)域'].apply(lambdax:x.split('-')[1])print(df[["區(qū)","域"]].head())運行data_clean.py,PyCharm控制臺輸出如下結果:區(qū)域0昌平回龍觀1順義順義城區(qū)2朝陽百子灣3朝陽百子灣4海淀小西天步驟5:完善data_clean.py,去除“面積”和“價格”字段的單位后綴。#去除單位df['面積']=df['面積'].apply(lambdax:x[:-2])df['價格']=df['價格'].apply(lambdax:x[:-1])print(df[["面積","價格"]].head())運行data_clean.py,PyCharm控制臺輸出如下結果:面積價格01438001212530225399032535074255997.2步驟6:完善data_clean.py,去除多余列并更新索引。#去除多余列df=df.drop(['標題','區(qū)域'],axis=1)#更新索引df=df.reset_index(drop=True)df.index=df.index+1print(df.shape)print(df.head())運行data_clean.py,PyCharm控制臺輸出如下結果:(42,10)房屋類型房屋結構面積朝向...小區(qū)樓層區(qū)域1公寓一居室C房東直租+免中介費+整租房型14朝北...城家公寓北京回龍觀霍營地鐵站店2樓昌平回龍觀2公寓復式簡約一居室房型21朝南...柚米寓5樓順義順義城區(qū)3公寓開間朝南房型25朝南...魔方公寓2樓朝陽百子灣4公寓開間朝北房型25朝北...魔方公寓2樓朝陽百子灣5公寓一室戶D配樓房型25眾多朝向...泊寓西直門店5樓海淀小西天步驟7:完善data_clean.py,保存清洗后的數(shù)據(jù)。#保存為csv文件df.to_csv("house_clean.csv",index_label=”id”)任務3:MySQL存儲數(shù)據(jù)下面要轉到MySQL,把凈化后的數(shù)據(jù)導入MySQL。步驟1:使用Navicat軟件,創(chuàng)建數(shù)據(jù)庫house。步驟2:打開house數(shù)據(jù)庫,新建查詢后創(chuàng)建表house_info。CREATETABLEhouse_info(idINT,house_typeVARCHAR(20),structureVARCHAR(20),areaINT,directionVARCHAR(20),distanceVARCHAR(50),priceINT,addrVARCHAR(20),floorVARCHAR(20),districtVARCHAR(20),roadVARCHAR(20),PRIMARYKEY(id))charset=utf8;步驟3:查看MySQL上傳目錄。SHOWVARIABLESLIKE'%secure_file_priv%';步驟4:復制house_clean.csv到MySQL上傳目錄。步驟5:在MySQL上傳目錄中,選擇house_clean.csv文件,右鍵選擇“屬性”->“安全”->“對象名稱”,復制文件的絕對路徑。如果house_clean.csv絕對路徑包含中文路徑,要把文件復制到絕對路徑只包含英文的位置,然后通過選擇文件->右鍵選擇“屬性”->“安全”->“對象名稱”,復制文件絕對路徑。步驟6:將清洗后的csv文件導入house_info表中,路徑中的“\”要換成“\\”,因為“\”在MySQL中是轉義符。LOADDATALOCALINFILE"C:\\ProgramData\\house_clean.csv"INTOTABLEhouse_infoCHARACTERSETutf8FIELDSTERMINATEDBY','OPTIONALLYENCLOSEDBY'"'LINESTERMINATEDBY'\r\n'IGNORE1LINES(id,house_type,structure,area,direction,distance,price,addr,floor,district,road);步驟7:執(zhí)行select語句,檢查前5條記錄。select*fromhouse_infolimit5;任務4:Flask搭建服務數(shù)據(jù)存入MySQL數(shù)據(jù)庫后,下面采用Flask搭建MTC應用。步驟1:在項目根目錄New->PythonPackage,創(chuàng)建app包。步驟2:在app包下New->PythonPackage,創(chuàng)建views包。步驟3:在app包下New->Directory,創(chuàng)建目錄static,然后把echarts.min.js復制到app/static目錄。步驟4:在app包下New->PythonFile,創(chuàng)建extensions.py,定義db變量和config_extensions方法。#-*-coding:UTF-8-*-fromflask_sqlalchemyimportSQLAlchemydb=SQLAlchemy()defconfig_extensions(app):db.init_app(app)步驟5:在app/views包下New->PythonFile,創(chuàng)建main.py,定義blueprint變量。#-*-coding:UTF-8-*-fromflaskimportBlueprintblueprint=Blueprint("main",__name__)步驟6:完善app/views/__init__.py,定義DEFAULT_BLUEPRINT變量。#-*-coding:UTF-8-*-fromapp.views.mainimportblueprintDEFAULT_BLUEPRINT=((blueprint,""))步驟7:完善app/__init__.py,定義Config類、config_blueprint方法、create_app方法。#-*-coding:UTF-8-*-fromflaskimportFlaskfromapp.extensionsimportconfig_extensionsfromapp.viewsimportblueprintclassConfig:SQLALCHEMY_COMMIT_ON_TEARDOWN=TrueSQLALCHEMY_TRACK_MODIFICATIONS=FalseSQLALCHEMY_DATABASE_URI="mysql+pymysql://root:123456@:3306/house?charset=utf8"defconfig_blueprint(app):app.register_blueprint(blueprint,url_prefix="")defcreate_app(config):app=Flask(__name__)app.config.from_object(config)config_extensions(app)config_blueprint(app)returnapp檢查用戶名、密碼和端口,確認輸入值和安裝的MySQL一致,確認連接地址中的數(shù)據(jù)庫名稱與MySQL中創(chuàng)建的數(shù)據(jù)庫名稱一致。步驟8:在app包下New->PythonFile,創(chuàng)建manager.py。#-*-coding:UTF-8-*-fromflask_scriptimportManager,Serverfromappimportcreate_app,Configif__name__=='__main__':app=create_app(Config)manager=Manager(app)manager.add_command('runserver',Server(host='',use_debugger=True,use_reloader=True))manager.run()右鍵選中manager.py,選擇“RunManager”菜單,運行程序,控制臺出現(xiàn)下面結果。在菜單Run->EditConfiguration,選中manager,編輯Parameters,填寫“runserver”。再次右鍵選中manager.py,選擇“RunManager”菜單,運行程序。控制臺出現(xiàn)下面結果,代表Flask配置成功。單擊“停止”按鈕,停止manager運行。步驟9:在app包下New->PythonPackage,創(chuàng)建包models。步驟10:在包app/models下New->PythonFile,創(chuàng)建entities.py,定義House類。#-*-coding:UTF-8-*-fromapp.extensionsimportdb#定義House類classHouse(db.Model):__tablename__='house_info'id=db.Column(db.Integer,primary_key=True)#樓層floor=db.Column(db.String(20))#租金price=db.Column(db.Integer)#區(qū)district=db.Column(db.String(20))步驟11:完善app/models/__init__.py,開放House類。#-*-coding:UTF-8-*-from.entitiesimportHouse步驟12:完善app/views/main.py,定義get_house_num_by_district和api_house_num方法。#-*-coding:UTF-8-*-fromflaskimportBlueprint,jsonifyfromsqlalchemyimportfunc,textfromapp.extensionsimportdbfromapp.modelsimportHouseblueprint=Blueprint("main",__name__)defget_house_num_by_district():rows=db.session.query(House.district,func.count().label('count')).group_by('district').order_by(text('countdesc')).limit(5)x=[]y=[]forrowinrows:x.append(row[0])y.append(row[1])returnx,y@blueprint.route("/api/house_num")defapi_house_num():x,y=get_house_num_by_district()returnjsonify([x,y])步驟13:運行app/manager.py,打開Chrome,訪問:5000/api/house_num,從服務器返回租房數(shù)據(jù)的列表,表示Flask連接數(shù)據(jù)庫正常。任務5:Flask+ECharts可視化數(shù)據(jù)有了Flask提供的數(shù)據(jù),采用ECharts框架的柱狀圖完成區(qū)房源數(shù)的統(tǒng)計顯示。步驟1:完善app/views/main.py,增加定義house_num方法。#-*-coding:UTF-8-*-fromflaskimportBlueprint,jsonify,render_templatefromsqlalchemyimportfunc,textfromapp.extensionsimportdbfromapp.modelsimportHouseblueprint=Blueprint("main",__name__)defget_house_num_by_district():rows=db.session.query(House.district,func.count(1).label('count')).group_by('district').order_by(text('countdesc')).limit(5)x=[]y=[]forrowinrows:x.append(row[0])y.append(row[1])returnx,y@blueprint.route("/api/house_num")defapi_house_num():x,y=get_house_num_by_district()returnjsonify([x,y])@blueprint.route("/house_num")defhouse_num():x,y=get_house_num_by_district()returnrender_template('single_chart.html',x_data=x,y_data=y)步驟2:在app包下N

溫馨提示

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

評論

0/150

提交評論