第06組 團隊Git現場編程實戰

1、組員職責分工

隊員姓名 主要分工
朱慶章 測評福州最受歡迎的商圈(參考人氣)
陳夢雪 測評福州最受歡迎的商圈(參考人氣)
關文濤 分別測評福州人均消費50如下,50-100、100-200、200以上最佳(性價比最高)的前五家美食餐廳(參考評價與價格)
黃宇航 測評福州最佳美食彙集地
黃奕頌 測評福州最佳美食彙集地
王瑞卿 測評福州服飾類綜合評分最高的商圈
胡康 測評福州服飾類綜合評分最高的商圈
梅恆權 基本數據可視化
汪倍名 UI界面
楊歡 爬蟲數據

2、 github 的提交日誌截圖

3、程序運行截圖

測評福州最佳美食

測評福州服飾類綜合評分最高的商圈

爬蟲數據

4、程序運行環境

  • python 3
  • webstorm
  • 有網絡的電腦 用IE Edge Chrome瀏覽器打開

5、GUI界面

地圖

界面演示

6.基礎功能實現

1)爬蟲部分

鑑於要獲取福州地區受歡迎的商圈,咱們首先要得知店鋪的相關信息。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號萬象城購物中心一,二"
        }

2)評價指標部分

評價一個店鋪是否受歡迎,須要從多個方面來考慮,因存在評分高而無人評論或者評分低而評論數過多的狀況,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

3)地圖製做

對於測評出福州最受歡迎的商圈,大佬決定採用地圖控件的方式粗暴、直觀的將位置展示給你們

  • 地圖製做採用高德地圖的控件,點我看刺激精彩內容
  • 首先,定義一個Map渲染基礎地圖
  • 其次,設定中心,地圖中心位置座標大體是119.35,26 使顯示中心大體在福州市
  • 而後,自定義一個座標列表,列表內容是商圈的經緯度和一個顯示詳情的文本窗體
  • 最後,實例化提示信息的窗體

4)數據可視化

​ 題目要求採用基本數據可視化,組內大佬們以爲太EASY了,就要弄點高級的東西,因而採用ECharts繪製,所謂ECharts,縮寫來自 Enterprise Charts,商業級數據圖表,是百度的一個開源的數據可視化工具,一個純 Javascript 的圖表庫,可以在 PC 端和移動設備上流暢運行,兼容當前絕大部分瀏覽器(IE6/7/8/9/10/11,chrome,firefox,Safari等),底層依賴輕量級的 Canvas 庫 ZRender,ECharts 提供直觀,生動,可交互,可高度個性化定製的數據可視化圖表。

Ecchats特色:

  • ECharts 屬於開源軟件,而且提供了很是炫酷的圖形界面,特點是地圖,另外還提供了柱狀圖、折線圖、餅圖、氣泡圖及四象限圖等;

  • ECharts 使用簡單,在官網中封裝了 JS,只要會引用就會獲得完美的展現效果;
  • ECharts 種類多,ECharts 實現簡單,各種圖形都有;相應的模板,還有豐富的 API 及文檔說明,很是詳細;
  • ECharts 兼容性好,基於HTML5,有着良好的動畫渲染效果。
  • 經過隊友對數據分析出來的商鋪排名結果,參數直接植入,畫出條形圖,具備比較好的可視化效果。

7.鼓勵有想法且有用的功能

  • 對於更高端的操做,相似服務器動態連接,實時顯示店鋪更新的信息,組內大佬以爲時間來不及回去看比賽了,因而就不作了
  • 對於評價指標,咱們思考了不少種方法,賦予權值,各類胡亂數學操做,最後仍是按照評分和點評人數乖乖排序...
  • 對於前端網頁標題不能指定的問題,點子鬼才楊歡同窗提出能夠截白色圖片將標題墊到頂部

8、遇到的困難及解決方法

  • 組員1:楊歡

​     困難: 美團,大衆點評等數據源API獲取須要商家資質,我的學生沒法得到。

​     解決辦法: 經過requests和selenium等爬蟲手段獲取美團數據 。

  • 組員2:梅恆權

​     困難: js不太熟悉 。

​     解決辦法:邊用邊百度。

  • 組員3:朱慶章

​     困難: 一開始圖標會飄到海上,且初始狀況下地圖顯示爲中國地圖全貌,不能很好反應福州市區狀況 。

​     解決辦法: 改小圖標的分辨率到20×20,改顯示地圖的中心經緯度,初始狀況下地圖放大必定比率。

  • 組員4:黃奕頌

​     困難: 個人任務是測評出福州最佳美食彙集地,可是我獲得的數據是有限的,只有從美團爬出的萬象城、萬達、泰禾廣場、東街口和五一廣場這幾個地方的店鋪數據,可是福州仍是有除了這幾個地方的美食彙集地,因此此次遇到的最大的困難就是數據難以收集全面吧 。

​     解決辦法: 從百度上找到了須要的數據。

  • 組員5:王瑞卿

​     困難:商圈的店鋪存在評價很高但評論數太少,單綜合二者排序存在數據污染,結果不合理的狀況,須要設計合理算法進行綜合考慮現實狀況進行評價。

​     解決辦法:先經討論按合理量對評價分評論數等評價受歡迎度的因素進行按權分配所佔比例,同時綜合考慮物美價廉性價比等因素,進行排序篩選。

  • 組員6:汪倍民

​      困難: 前端排版美觀有難度 。

​      解決辦法: 問同窗和百度 。

9、馬後炮

  • 楊歡: 若是我能更懶一點,那我就能夠變得更加肥宅了 。

  • 梅恆權: 若是再給我半天,那麼能夠寫出多個統計圖可視化出來。

  • 朱慶章: 若是再給我半小時能把顯示的框框作好看點的 。

  • 黃奕頌: 若是我知道今天會用到的數據,那麼我會先用爬蟲爬取到更多的數據來爲今天的編程做業服務 。

  • 王瑞卿: 若是我能向隊友多學習一點,那麼也不會這麼菜 。

  • 陳夢雪: 若是我厲害一點,就行了 。

  • 黃宇航: 若是我能再厲害點,就不會呆呆的圍觀大佬們解題而本身不知道在幹嗎。

  • 胡康:若是前端學的更熟練一點,就不會什麼忙也幫不上了。

10、評估每位組員的貢獻比例

組員 貢獻比
梅恆權 12%
王瑞卿 8%
楊歡 12%
汪倍民 12%
關文濤 12%
黃奕頌 9%
陳夢雪 9%
朱慶章 12%
黃宇航 8%
胡康 8%

11、PSP表格

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

12、學習進度表

第N周 新增代碼(行) 累計代碼(行) 本週學習耗時(小時) 累計學習耗時(小時) 重要成長
第N周 新增代碼(行) 累計代碼(行) 本週學習耗時(小時) 累計學習耗時(小時) 重要成長
9 100 1800 20 100 學會了一些簡單的爬蟲知識
相關文章
相關標籤/搜索