一、组员职责分工

队员姓名 主要分工
朱庆章 测评福州最受欢迎的商圈(参考人气)
陈梦雪 测评福州最受欢迎的商圈(参考人气)
关文涛 分别测评福州人均消费50以下,50-100、100-200、200以上最佳(性价比最高)的前五家美食餐厅(参考评价与价格)
黄宇航 测评福州最佳美食聚集地
黄奕颂 测评福州最佳美食聚集地
王瑞卿 测评福州服饰类综合评分最高的商圈
胡康 测评福州服饰类综合评分最高的商圈
梅恒权 基本数据可视化
汪倍名 UI界面
杨欢 爬虫数据

二、 github 的提交日志截图

三、程序运行截图

测评福州最佳美食

测评福州服饰类综合评分最高的商圈

爬虫数据

四、程序运行环境

  • python 3
  • webstorm
  • 有网络的电脑 用IE Edge Chrome浏览器打开

五、GUI界面

地图

界面演示

6.基础功能实现

1)爬虫部分

鉴于要获取福州地区受欢迎的商圈,我们首先要得知店铺的相关信息。

  • 爬取美团网站上福州地区的美食与服饰部分的信息,其中主要信息有地址评分点评人数

    部分代码如下:

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格式,部分信息结果:

    {
    "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)评价指标部分

评价一个店铺是否受欢迎,需要从多个方面来考虑,因存在评分高而无人评论或者评分低而评论数过多的情况,

所以需设定一个指标来判断。

  • 首先,将JSON文件转换成文本,对其中每家店铺的评分做一个排序,计算出平均评价人数和平均分

  • 其次,低于平均分和评价人数的商铺直接过滤

  • 再者,将筛选后的店铺根据评价人数做一个排序

  • 最后,选出五个最受欢迎的商铺

    (对于服饰,在评论人数出需稍作改动) 代码如下:

    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.鼓励有想法且有用的功能

  • 对于更高端的操作,类似服务器动态链接,实时显示店铺更新的信息,组内大佬觉得时间来不及回去看比赛了,于是就不做了
  • 对于评价指标,我们思考了很多种方法,赋予权值,各种胡乱数学操作,最后还是按照评分和点评人数乖乖排序...
  • 对于前端网页标题不能指定的问题,点子鬼才杨欢同学提出可以截白色图片将标题垫到顶部

八、遇到的困难及解决方法

  • 组员1:杨欢

​     困难: 美团,大众点评等数据源API获取需要商家资质,个人学生无法获得。

​     解决办法: 通过requests和selenium等爬虫手段获取美团数据 。

  • 组员2:梅恒权

​     困难: js不太熟悉 。

​     解决办法:边用边百度。

  • 组员3:朱庆章

​     困难: 一开始图标会飘到海上,且初始情况下地图显示为中国地图全貌,不能很好反应福州市区情况 。

​     解决办法: 改小图标的分辨率到20×20,改显示地图的中心经纬度,初始情况下地图放大一定比率。

  • 组员4:黄奕颂

​     困难: 我的任务是测评出福州最佳美食聚集地,但是我得到的数据是有限的,只有从美团爬出的万象城、万达、泰禾广场、东街口和五一广场这几个地方的店铺数据,但是福州还是有除了这几个地方的美食聚集地,所以这次遇到的最大的困难就是数据难以收集全面吧 。

​     解决办法: 从百度上找到了需要的数据。

  • 组员5:王瑞卿

​     困难:商圈的店铺存在评价很高但评论数太少,单综合两者排序存在数据污染,结果不合理的情况,需要设计合理算法进行综合考虑现实情况进行评价。

​     解决办法:先经讨论按合理量对评价分评论数等评价受欢迎度的因素进行按权分配所占比例,同时综合考虑物美价廉性价比等因素,进行排序筛选。

  • 组员6:汪倍民

​      困难: 前端排版美观有难度 。

​      解决办法: 问同学和百度 。

九、马后炮

  • 杨欢: 如果我能更懒一点,那我就可以变得更加肥宅了 。

  • 梅恒权: 如果再给我半天,那么可以写出多个统计图可视化出来。

  • 朱庆章: 如果再给我半小时能把显示的框框做好看点的 。

  • 黄奕颂: 如果我知道今天会用到的数据,那么我会先用爬虫爬取到更多的数据来为今天的编程作业服务 。

  • 王瑞卿: 如果我能向队友多学习一点,那么也不会这么菜 。

  • 陈梦雪: 如果我厉害一点,就好了 。

  • 黄宇航: 如果我能再厉害点,就不会呆呆的围观大佬们解题而自己不知道在干嘛。

  • 胡康:如果前端学的更熟练一点,就不会什么忙也帮不上了。

十、评估每位组员的贡献比例

组员 贡献比
梅恒权 12%
王瑞卿 8%
杨欢 12%
汪倍民 12%
关文涛 12%
黄奕颂 9%
陈梦雪 9%
朱庆章 12%
黄宇航 8%
胡康 8%

十一、PSP表格

过程 预估耗时(分钟) 实际耗时(分钟)
计划
估计任务时间
开发
需求分析 (包括学习新技术)
生成设计文档
设计复审
代码规范 (为目前的开发制定合适的规范)
具体设计
具体编码
代码复审
测试(自我测试,修改代码,提交修改)
报告
测试报告
计算工作量
事后总结, 并提出过程改进计划
合计

十二、学习进度表

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
9 200 2000 5 10 尝试使用python对数据库的操纵 ,团队讨论
10 2000 4000 4 14 团队合作,python的使用

第06组 团队Git现场编程实战的更多相关文章

  1. 第11组 团队Git现场编程实战

    第11组 团队Git现场编程实战 组员职责分工: 前端部分: 陈郑铧:构架的搭建,前端模块开发 陈益:前端模块开发 李镇平:前端模块开发 后端部分: 沈国煜:后端模块开发 王泽鸿:后端模块开发 林铮威 ...

  2. 第09组 团队Git现场编程实战

    组长博客链接 1.团队分工 团队成员 分工明细 王耀鑫 博客撰写,数据处理 陈志荣 前端界面,前端功能实现 陈超颖 前端界面,前端功能实现 沈梓耀 前端界面,前端功能实现 林明镇 数据处理 滕佳 前端 ...

  3. 第08组 团队Git现场编程实战

    一.组员职责分工 算法:庄锡荣,林鑫灿 UI:许煌标,蔡峰,林晓锋,陈珊珊,侯雅倩,吴珂雨 博客:陈珊珊,王钟贤 二.github提交日志 三.程序运行截图 运行中爬取到的部分信息 数据库中的部分信息 ...

  4. 第12组 团队Git现场编程实战

    分工及贡献 组内有三人去考证了,只剩下6人 组员 分工 贡献比例 王永福 前后端,爬虫,博客主体 30% 孙承恺 建模,算法设计,统筹 18% 邱畅杰 爬虫 15% 徐祖豪 前端数据可视化 13% 张 ...

  5. 第07组 团队Git现场编程实战

    组员职责分工 团队成员 分工 杨明哲 爬数据,做网页 林兴源 合作编码完成了对美团数据的分析,分析出最有发展潜力的十佳好店 卞永亨 从大众点评分析出了服装商圈 林鑫 合作编码完成了对美团数据的分析,分 ...

  6. 第03组 团队git现场编程实战

    1.组员职责分工 张逸杰:复制监督整个编程任务的进程以及协助组员编程 黄智锋.刘汪洋:负责UI设计 苏凯婷.鲍冰如:爬取数据并负责测评出福州最受欢迎的商圈 陈荣杰.杨锦镔:爬取数据并负责测评出福州人均 ...

  7. 第03组团队Git现场编程实战

    1.组员职责分工 张逸杰:复制监督整个编程任务的进程以及协助组员编程 黄智锋.刘汪洋:负责UI设计 苏凯婷.鲍冰如:爬取数据并负责测评出福州最受欢迎的商圈 陈荣杰.杨锦镔:爬取数据并负责测评出福州人均 ...

  8. 第02组 团队Git现场编程实战

    目录 1. 组员职责分工(2分) 2. github 的提交日志截图(1分) 3. 程序运行截图(3分) 4. 程序运行环境(1分) 5. GUI界面(5分) 6. 基础功能实现(10分) 7. 鼓励 ...

  9. 第01组 团队Git现场编程实战

    目录 一.组员职责分工 二.github 的提交日志截图(鼓励小粒度提交) 三.程序运行截图 四.程序运行环境 五.GUI界面 六.基础功能实现 七.鼓励有想法且有用的功能 八.遇到的困难及解决方法 ...

随机推荐

  1. Swift面试题

    class 和 struct 的区别 1.struct是值类型,class是引用类型. 值类型的变量直接包含它们的数据,对于值类型都有它们自己的数据副本,因此对一个变量操作不可能影响另一个变量. 引用 ...

  2. O - Can you find it?(二分查找)

    O - Can you find it? Time Limit:3000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64 ...

  3. mysql数据库备份,主从复制及半同步复制

    1.使用mysqldump备份数据库并通过备份及二进制日志还原数据(备份完后再写入数据,然后再删库) mysqldump -A --single-transaction -F --master-dat ...

  4. cesium-print 动态打印插件

    Cesium 动态打印插件 cesium-print is a plugin for cesium printing Usage Include it in your code after impor ...

  5. macOS 10.13允许任何来源开启方法

    软件下载网站: http://www.pc6.com/ 软件安装问题: macOS 10.13允许任何来源开启方法: 如果需要恢复允许“任何来源”的选项,即关闭系统的Gatekeeper,我们可以在“ ...

  6. Redis基于主从复制的RCE 4.x/5.x 复现

    0x00 前言 最近期末考试,博客好久没有更新了,这段时间爆了三四个洞,趁着还没去实习,抓紧复现一下,这次复现的是Redis的RCE,复现过程中也遇到很多问题,记录下来和大家分享一下 0x01 拉取镜 ...

  7. Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [VCodeModel]

    2019-08-20 17:53:24,054 [ERROR] [http-nio-8047-exec-1] [HttpResult.java : 143] 系统异常 org.springframew ...

  8. (java)selenium webdriver学习,选择模块,点击下一页,获取当前url

    selenium webdriver学习,选择模块,点击下一页,获取当前url 查找下一页有多种方法,这里列举两种: isSelected()函数用于判断是否点击选中,返回Boolean类型 impo ...

  9. Spring源码窥探之:Spring AOP初步使用

    AOP即面向切面编程.它的底层实际是用了spring的动态代理,具体是JDK的代理还是CGLIB的代理,就视情况而定了.本博客园仅仅作为平时记录,显得有些杂乱无章,如果想了解动态代理,设计模式,请访问 ...

  10. 项目前端 - vue配置 | axios配置 | cookies配置 | element-ui配置 | bootstrap配置

    vue项目创建 环境 1.傻瓜式安装node: 官网下载:https://nodejs.org/zh-cn/ ​ 2.安装cnpm: >: npm install -g cnpm --regis ...