隊員姓名 | 主要分工 |
---|---|
朱慶章 | 測評福州最受歡迎的商圈(參考人氣) |
陳夢雪 | 測評福州最受歡迎的商圈(參考人氣) |
關文濤 | 分別測評福州人均消費50如下,50-100、100-200、200以上最佳(性價比最高)的前五家美食餐廳(參考評價與價格) |
黃宇航 | 測評福州最佳美食彙集地 |
黃奕頌 | 測評福州最佳美食彙集地 |
王瑞卿 | 測評福州服飾類綜合評分最高的商圈 |
胡康 | 測評福州服飾類綜合評分最高的商圈 |
梅恆權 | 基本數據可視化 |
汪倍名 | UI界面 |
楊歡 | 爬蟲數據 |
鑑於要獲取福州地區受歡迎的商圈,咱們首先要得知店鋪的相關信息。javascript
爬取美團網站上福州地區的美食與服飾部分的信息,其中主要信息有地址、評分和點評人數html
部分代碼以下:前端
def down(keyword,txtpath=''): browser.get('https://fz.meituan.com/') time.sleep(2) text=browser.find_element_by_xpath('/html/body/header/div[2]/div[2]/div[1]/input') text.send_keys(keyword) btn=browser.find_element_by_xpath('/html/body/header/div[2]/div[2]/div[1]/button') btn.click() time.sleep(3) array = [] if os.path.exists(txtpath): os.remove(txtpath) try: for i in range(30): print("第{0}頁".format(i), end=' ') renqi=browser.find_element_by_xpath('/html/body/div[1]/div/div/div[2]/div[1]/div[2]/div[1]/div/div[3]/a') renqi.click() time.sleep(3) try: # '/html/body/div[1]/div/div/div[2]/div[1]/div[2]/div[2]/div[1]' # '/html/body/div[1]/div/div/div[2]/div[1]/div[2]/div[2]/div[1]' lists = browser.find_elements_by_xpath('/html/body/div[1]/div/div/div[2]/div[1]/div[2]/div[2]/div') except Exception as e: print('4',e) print(len(lists)) time.sleep(2) try: for j in lists: try: dic = {} try: href = j.find_element_by_xpath('./div/div/div/div/a') except Exception as e: print('href',e) dic["href"] = href.get_attribute('href') # print(dic["href"],href.text) dic["name"] = href.text dic["data-id"] = json.loads(href.get_attribute("data-lab")) try: level = j.find_elements_by_xpath('./div/div/div/div/div[@class="item-eval-info clearfix"]/span') except Exception as e:# print(len(level)) print('level') dic["level"] = [] dic["price"]='' try: dic["price"]=j.find_element_by_xpath('./div/div/div/div/div[3]/div/span[@class="avg-price"]').text print(dic["price"]) except: pass for k in level: dic["level"].append(k.text) dic["address"] = j.find_element_by_xpath( './div/div/div/div/div[@class="item-site-info clearfix"]/div/span[@class="address ellipsis"]').text # print(dic["address"]) except Exception as e: print('2',e) array.append(dic) except Exception as e: print('1', e) nextPage = browser.find_element_by_xpath('/html/body/div/div/div/div[2]/div[1]/nav/ul/li[7]') time.sleep(3) nextPage.click() time.sleep(3) except Exception as e: print('2', e) print(array) with open(txtpath, 'a+', encoding="gbk", errors='ignore') as f: f.write(json.dumps(array, ensure_ascii=False, indent=4))
爬取的數據爲JSON格式,部分信息結果:java
{ "href": "https://www.meituan.com/meishi/5427649/", "name": "肯德基(萬象店)", "data-id": { "keyword": "寶龍萬象城美食", "poi_id": 5427649, "custom": { "cat_id": 1, "sort_type": "人氣最高", "index": 1 } }, "level": [ "不錯", "4分", "0人評論" ], "price": "人均29", "address": "臺江區工業路691號萬象城購物中心一,二" }
評價一個店鋪是否受歡迎,須要從多個方面來考慮,因存在評分高而無人評論或者評分低而評論數過多的狀況,python
因此需設定一個指標來判斷。git
首先,將JSON文件轉換成文本,對其中每家店鋪的評分作一個排序,計算出平均評價人數和平均分github
其次,低於平均分和評價人數的商鋪直接過濾web
再者,將篩選後的店鋪根據評價人數作一個排序算法
最後,選出五個最受歡迎的商鋪chrome
(對於服飾,在評論人數出需稍做改動) 代碼以下:
for i in fd: if len(i['price'])==0 or len(i['level'])<3 or len(i['level'][2])==0: continue pl=int(i['level'][2][:-3]) pllist.append(pl) avg+=pl #print(pl) pllist.sort(reverse=True) avg=avg/len(pllist) print('pl max:',pllist[0]) print('pl mid:',pllist[int(len(pllist)/2)] ) print('pl avg:',avg ) pllist50=[] pllist100=[] pllist200=[] pllist200plus=[] for i in fd: if len(i['price'])==0 or len(i['level'])<3 or len(i['level'][2])==0: continue pl=int(i['level'][2][:-3]) #print(pl,avg) if pl>avg: name = i['name'] rawdata = i['level'] rawprice = i['price'] rawlist = [name, rawdata, rawprice] #print(pl) if(int(i['price'][2:])<=50): pllist50.append(rawlist) elif (int(i['price'][2:])<=100): pllist100.append(rawlist) elif (int(i['price'][2:])<=200): pllist200.append(rawlist) else: pllist200plus.append(rawlist) print(pllist50[0]) def cmp(elem1,elem2): if(elem1[1][1][:-1]!=elem2[1][1][:-1]): return float(elem1[1][1][:-1])-float(elem2[1][1][:-1]) else: return float(elem1[1][2][:-3])-float(elem2[1][2][:-3]) def key2(elem): return elem[1][:-1] key=cmp_to_key(cmp) pllist50.sort(key=key,reverse=True) news_ids = [] for id in pllist50: if id not in news_ids: news_ids.append(id) pllist50=news_ids pllist100.sort(key=key,reverse=True) news_ids = [] for id in pllist100: if id not in news_ids: news_ids.append(id) pllist100=news_ids pllist200.sort(key=key,reverse=True) news_ids = [] for id in pllist200: if id not in news_ids: news_ids.append(id) pllist200=news_ids pllist200plus.sort(key=key,reverse=True) news_ids = [] for id in pllist200plus: if id not in news_ids: news_ids.append(id) pllist200plus=news_ids
對於測評出福州最受歡迎的商圈,大佬決定採用地圖控件的方式粗暴、直觀的將位置展示給你們
題目要求採用基本數據可視化,組內大佬們以爲太EASY了,就要弄點高級的東西,因而採用ECharts繪製,所謂ECharts,縮寫來自 Enterprise Charts,商業級數據圖表,是百度的一個開源的數據可視化工具,一個純 Javascript 的圖表庫,可以在 PC 端和移動設備上流暢運行,兼容當前絕大部分瀏覽器(IE6/7/8/9/10/11,chrome,firefox,Safari等),底層依賴輕量級的 Canvas 庫 ZRender,ECharts 提供直觀,生動,可交互,可高度個性化定製的數據可視化圖表。
Ecchats特色:
ECharts 屬於開源軟件,而且提供了很是炫酷的圖形界面,特點是地圖,另外還提供了柱狀圖、折線圖、餅圖、氣泡圖及四象限圖等;
經過隊友對數據分析出來的商鋪排名結果,參數直接植入,畫出條形圖,具備比較好的可視化效果。
困難: 美團,大衆點評等數據源API獲取須要商家資質,我的學生沒法得到。
解決辦法: 經過requests和selenium等爬蟲手段獲取美團數據 。
困難: js不太熟悉 。
解決辦法:邊用邊百度。
困難: 一開始圖標會飄到海上,且初始狀況下地圖顯示爲中國地圖全貌,不能很好反應福州市區狀況 。
解決辦法: 改小圖標的分辨率到20×20,改顯示地圖的中心經緯度,初始狀況下地圖放大必定比率。
困難: 個人任務是測評出福州最佳美食彙集地,可是我獲得的數據是有限的,只有從美團爬出的萬象城、萬達、泰禾廣場、東街口和五一廣場這幾個地方的店鋪數據,可是福州仍是有除了這幾個地方的美食彙集地,因此此次遇到的最大的困難就是數據難以收集全面吧 。
解決辦法: 從百度上找到了須要的數據。
困難:商圈的店鋪存在評價很高但評論數太少,單綜合二者排序存在數據污染,結果不合理的狀況,須要設計合理算法進行綜合考慮現實狀況進行評價。
解決辦法:先經討論按合理量對評價分評論數等評價受歡迎度的因素進行按權分配所佔比例,同時綜合考慮物美價廉性價比等因素,進行排序篩選。
困難: 前端排版美觀有難度 。
解決辦法: 問同窗和百度 。
楊歡: 若是我能更懶一點,那我就能夠變得更加肥宅了 。
梅恆權: 若是再給我半天,那麼能夠寫出多個統計圖可視化出來。
朱慶章: 若是再給我半小時能把顯示的框框作好看點的 。
黃奕頌: 若是我知道今天會用到的數據,那麼我會先用爬蟲爬取到更多的數據來爲今天的編程做業服務 。
王瑞卿: 若是我能向隊友多學習一點,那麼也不會這麼菜 。
陳夢雪: 若是我厲害一點,就行了 。
黃宇航: 若是我能再厲害點,就不會呆呆的圍觀大佬們解題而本身不知道在幹嗎。
胡康:若是前端學的更熟練一點,就不會什麼忙也幫不上了。
組員 | 貢獻比 |
---|---|
梅恆權 | 12% |
王瑞卿 | 8% |
楊歡 | 12% |
汪倍民 | 12% |
關文濤 | 12% |
黃奕頌 | 9% |
陳夢雪 | 9% |
朱慶章 | 12% |
黃宇航 | 8% |
胡康 | 8% |
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
Planning | 計劃 | 10 | 20 |
Estimate | 估計這個任務須要多少時間 | 5 | 5 |
Development | 開發 | 10 | 10 |
Analysis | 需求分析 (包括學習新技術) | 60 | 50 |
Design Spec | 生成設計文檔 | 0 | 0 |
Design Review | 設計複審 | 0 | 0 |
Coding Standard | 代碼規範 (爲目前的開發制定合適的規範) | 10 | 10 |
Design | 具體設計 | 10 | 15 |
Coding | 具體編碼 | 60 | 140 |
Code Review | 代碼複審 | 10 | 10 |
Test | 測試(自我測試,修改代碼,提交修改) | 30 | 20 |
Reporting | 報告 | 0 | 0 |
Test Repor | 測試報告 | 0 | 0 |
Size Measurement | 計算工做量 | 0 | 0 |
Postmortem & Process Improvement Plan | 過後總結, 並提出過程改進計劃 | 10 | 10 |
合計 | 215 | 300 |
第N周 | 新增代碼(行) | 累計代碼(行) | 本週學習耗時(小時) | 累計學習耗時(小時) | 重要成長 |
---|---|---|---|---|---|
第N周 | 新增代碼(行) | 累計代碼(行) | 本週學習耗時(小時) | 累計學習耗時(小時) | 重要成長 |
9 | 100 | 1800 | 20 | 100 | 學會了一些簡單的爬蟲知識 |