接上篇:安居客scrapy房产信息爬取到数据可视化(下)-可视化代码,可视化的实现~

先看看保存的数据吧~

本人之前都是习惯把爬到的数据保存到本地json文件,

这次保存到数据库后发现使用mongodb的聚合统计省去了好多自己用python写计算逻辑的步骤,好方便啊~~

第一张图柱状图

第一张图代码解析:

  1. #encoding:utf-8
  2. import random
  3. from pyecharts import Bar
  4. from pymongo import MongoClient
  5.  
  6. conn = MongoClient('127.0.0.1',27017) #创建于MongoDB的连接
  7. db = conn.anjuke #选择数据库
  8. collection=db.AnjukeItem #选择数据库下的集合
  9. all = []
  10. res = collection.aggregate([
  11. {'$group':{'_id':'$city',
  12. 'count':{'$sum':1}}},
  13. {'$sort':{'count':-1}},])
  14. conn.close()
  15. #上面是mongodb聚合统计的语句
  16. #$group:按照给定表达式组合结果,这里的_id字段表示你要基于哪个字段来进行分组,这里的$city就表示要基于city字段来进行分组
  17. #下面的count字段的值$sum: 1表示的是获取--满足city字段相同的这一组的数量--乘以后面给定的值(本例为1,那么就是同组的数量)。
  18. #$sort:按照给定的字段排序结果,即按计算好的count排序,-1为降序来排列
  19.  
  20. for i in res:
  21. #print(i)
  22. #{'_id': '成都', 'count': 2074}
  23. all.append((i['_id'].strip(),i['count']))
  24.  
  25. attr = [i[0] for i in all[:30] ] #取前三十城市的名字
  26. v1 = [i[1] for i in all[:30]] #取前三十城市的值
  27. print(attr)
  28. bar = Bar('新房分布柱状图') #柱状图
  29. bar.add('各城市新楼盘数',attr,v1,is_label_show=True,is_datazoom_show=True,xaxis_rotate=65, label_color=['#87CEEB',])
  30. #attr 下面的城市名
  31. #v1 数值
  32. #is_label_show -> bool 是否正常显示标签,默认不显示。即各柱上的数字
  33. #is_datazoom_show -> bool 是否使用区域缩放组件,默认为 False
  34. #xaxis_rotate -> int x 轴刻度标签旋转的角度,默认为 0,即不旋转。旋转的角度从 -90 度到 90 度。
  35. #label_color 柱的颜色
  36. bar.render('bar.html') #html生成

第二张图柱状图

第二图代码解析:

  1. #encoding:utf-8
  2. from pymongo import MongoClient
  3. from pyecharts import Bar
  4.  
  5. conn = MongoClient('127.0.0.1',27017)
  6. db = conn.anjuke
  7. collection=db.AnjukeItem
  8. res = collection.find()
  9. conn.close()
  10. #连接mongodb的逻辑,同上~
  11.  
  12. all = {}
  13. for i in res:
  14. city = i['city'] #获取城市名
  15. try:
  16.  
  17. if i['price'][1].isdecimal(): #判断i['price'][1]是不是数字型的价格
  18. price_type = i['price'][0] #获取价格类型
  19. price = i['price'][1]
  20. price = int(price) #str价格转int价格
  21. elif i['price'][2].isdecimal(): #判断i['price'][2]是不是数字型的价格
  22. price_type = i['price'][1] #获取价格类型
  23. price = i['price'][2]
  24. price = int(price) #str价格转int价格
  25. except:
  26. continue
  27.  
  28. if '均价' in price_type: #只取均价
  29. if city in all:
  30. all[city].append(price)
  31. else:
  32. all[city] = [price,]
  33. print(all)
  34. #{'_id': '黑河', 'count': 17}
  35. #{'_id': '甘南', 'count': 17}
  36. #{'_id': '陇南', 'count': 16}
  37. all_avg = []
  38. for city,prices in all.items():
  39. all_avg.append((city,sum(prices)/len(prices))) #计算所有的城市房价平均值,all_avg里的元素为元组(城市名,均价)
  40. all_avg = sorted(all_avg,key=lambda x:x[1],reverse=True) #降序排序
  41.  
  42. print(all_avg)
  43. #[('深圳', 59192.21692307692), ('上海', 50811.7504091653), ...
  44.  
  45. attr = [i[0] for i in all_avg[:30] ] #获取前30城市名
  46. v1 = ['{:.1f}'.format(i[1]) for i in all_avg[:30]] #获取前30名的值
  47. bar = Bar('各城市房价平均值')
  48. bar.add('单位面积价格(元/平米)',attr,v1,is_label_show=True,is_datazoom_show=True)
  49. #画图逻辑,同上
  50. bar.render('bar2.html')

第三张图玫瑰图

第三张图代码解析:

  1. from pyecharts import Pie
  2. from pymongo import MongoClient
  3.  
  4. conn = MongoClient('127.0.0.1',27017)
  5. db = conn.anjuke
  6. collection=db.AnjukeItem
  7. #Mongodb的连接
  8. all = []
  9. res = collection.aggregate(
  10. [
  11. {
  12. '$unwind': '$type_'
  13. },{
  14. '$group': {
  15. '_id': '$type_',
  16. 'count': {'$sum': 1}
  17. }
  18. }
  19. ]
  20. )
  21. #上面是mongodb聚合统计的语句
  22. #'$unwind': '$type_'因为type_是一个列表这里是将type_拆分了,用以下面的计算
  23. #$group:按照给定表达式组合结果,这里的_id字段表示你要基于哪个字段来进行分组,这里的$type_就表示要基于type_字段来进行分组
  24. #下面的count字段的值$sum: 1表示的是获取--满足type_字段相同的这一组的数量--乘以后面给定的值(本例为1,那么就是同组的数量)。
  25. conn.close()
  26.  
  27. all = []
  28. for i in res:
  29. print(i)
  30. #{'_id': '商业', 'count': 337}
  31. #{'_id': '商办', 'count': 158}
  32. #{'_id': '8室', 'count': 76}
  33. if '室' in i['_id']: #只取有'室'关键字的数据
  34. all.append((i['_id'],i['count']))
  35. all = sorted(all,key=lambda x:x[1],reverse=True) #以数量进行排序
  36. print(all)
  37.  
  38. attr = [i[0] for i in all][:6] #取前六的类型名
  39. v1 = [i[1] for i in all][:6] #取前六的数值
  40.  
  41. pie =Pie("户型比例", title_pos='center', width=900)
  42. #pie.add("商品A", attr, v1, center=[25, 50], is_random=True, radius=[30, 75], rosetype='radius')
  43. pie.add("商品B", attr, v1, is_random=True, radius=[30, 75], rosetype='area', is_legend_show=False, is_label_show=True)
  44. #is_random为是否随即排列颜色列表
  45. #radius为半径,第一个为内半径,第二个是外半径;
  46. #rosetype为是否展示成南丁格尔图( 'radius' 圆心角展现数据半分比,半径展现数据大小;'area' 圆心角相同,为通过半径展现数据大小)
  47. #is_label_show为是否显示标签(各个属性的数据信息)
  48. #is_legend_show:是否显示图例
  49. pie.render('pie.html')

第四张图地理热力图

第四张图代码解析:

  1. #coding=utf-8
  2. from pymongo import MongoClient
  3. from pyecharts import Geo
  4. import json
  5.  
  6. conn = MongoClient('127.0.0.1',27017)
  7. db = conn.anjuke
  8. collection=db.AnjukeItem
  9. #res=collection.distinct("city")
  10. all = []
  11. res = collection.aggregate([
  12. {'$group':{'_id':'$city',
  13. 'count':{'$sum':1}}},
  14. {'$sort':{'count':-1}},])
  15. for i in res:
  16. all.append((i['_id'].strip(),i['count']))
  17. conn.close()
  18. #连接查询,和图一一样
  19.  
  20. new_all =[]
  21. with open('city_coordinates.json','r',encoding='utf-8') as f:
  22. #这里是复制到pyecharts的地理json数据和爬到的城市名对比,因为好多爬到的城市其实在pyecharts是没有记录的,直接绘图会报错
  23. #位置在\Python36\Lib\site-packages\pyecharts\datasets\city_coordinates.json
  24. all_city = json.loads(f.read(),encoding='utf-8')
  25. for i in all:
  26. if i[0] in all_city:
  27. new_all.append(i)
  28.  
  29. geo = Geo(
  30. "全国新房分布", #图标题
  31. "", #副标题
  32. title_color="#fff", #标题颜色
  33. title_pos="center", #标题位置
  34. width=1200, #图宽
  35. height=600, #高
  36. background_color="#404a59", #背景颜色
  37. )
  38. attr, value = geo.cast(new_all) #分开城市名和数值
  39.  
  40. geo.add(
  41. "",
  42. attr,
  43. value,
  44. visual_range=[100, 1200], #显示的数值范围
  45. visual_text_color="#fff", #鼠标放上去后显示的文字颜色
  46. symbol_size=15, #标记的大小
  47. type='heatmap', #类型为热力图
  48. is_visualmap=True,
  49. )
  50.  
  51. geo.render()

End...

安居客scrapy房产信息爬取到数据可视化(下)-可视化代码的更多相关文章

  1. 安居客scrapy房产信息爬取到数据可视化(上)-scrapy爬虫

    出发点 想做一个地图热力图,发现安居客房产数据有我要的特性.emmm,那就尝试一次好了~ 老规矩,从爬虫,从拿到数据开始... scrapy的配置 创建一个项目(在命令行下敲~): scrapy st ...

  2. 如何使用Python爬取基金数据,并可视化显示

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于Will的大食堂,作者打饭大叔 前言 美国疫情越来越严峻,大选也进入 ...

  3. 中国大学MOOC课程信息爬取与数据存储

    版权声明:本文为博主原创文章,转载 请注明出处: https://blog.csdn.net/sc2079/article/details/82016583 10月18日更:MOOC课程信息D3.js ...

  4. python爬取旅游数据+matplotlib简单可视化

    题目如下: 共由6个函数组成: 第一个函数爬取数据并转为DataFrame: 第二个函数爬取数据后存入Excel中,对于解题来说是多余的,仅当练手以及方便核对数据: 后面四个函数分别对应题目中的四个m ...

  5. 利用Python爬取疫情数据并使用可视化工具展示

    import requests, json from pyecharts.charts import Map, Page, Pie, Bar from pyecharts import options ...

  6. 使用selenium再次爬取疫情数据(链接数据库)

    爬取网页地址: 丁香医生 数据库连接代码: def db_connect(): try: db=pymysql.connect('localhost','root','zzm666','payiqin ...

  7. 毕设之Python爬取天气数据及可视化分析

    写在前面的一些P话:(https://jq.qq.com/?_wv=1027&k=RFkfeU8j) 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向. ...

  8. 爬虫 (6)- Scrapy 实战案例 - 爬取不锈钢的相关钢卷信息

    超详细创建流程及思路 一. 新建项目 1.创建文件夹,然后在对应文件夹创建一个新的python项目 2.点击Terminal命令行窗口,运行下面的命令创建scrapy项目 scrapy startpr ...

  9. Scrapy项目 - 实现腾讯网站社会招聘信息爬取的爬虫设计

    通过使Scrapy框架,进行数据挖掘和对web站点页面提取结构化数据,掌握如何使用Twisted异步网络框架来处理网络通讯的问题,可以加快我们的下载速度,也可深入接触各种中间件接口,灵活的完成各种需求 ...

随机推荐

  1. do-while-zero 结构在宏定义中的应用

    do while 语句在使用宏定义时是一个有用的技巧,说明如下: 假设有这样一个宏定义 #define macro(condition) / if(condition) dosomething() 现 ...

  2. 【Facebook】等差子序列个数

    题目: 给定一整数数列,问数列有多少个子序列是等差数列. 即对于包含N个数的数列A,A(0),A(1),……,A(N-1),有多少组(P(0),P(1),……,P(k))满足0<=P(0)< ...

  3. 洛谷【P1138】第k小整数

    题目传送门:https://www.luogu.org/problemnew/show/P1138 桶排: 对于值域在可以接受的范围内时,我们可以用不依赖比较的桶排去将数据排序.因为桶排不依赖比较排序 ...

  4. 洛谷 P4525 & P4526 [模板] 自适应辛普森积分

    题目:https://www.luogu.org/problemnew/show/P4525 https://www.luogu.org/problemnew/show/P4526 学习辛普森积分:h ...

  5. bzoj 2597 剪刀石头布 —— 拆边费用流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2597 不合法的三个人之间的关系就是一个人赢了两次: 记 \( deg[i] \) 表示第 \ ...

  6. 研华 RISC超低功耗3.5”单板电脑

    产品简介: 这是一款搭载TI Sitara AM3358 Cortex-A8 1GHz高性能处理器的RISC 3.5”单板电脑.RSB-4221是一款稳定可靠.性能强大的低功耗平台,专为各种需要丰富I ...

  7. Java中读取输入方式的性能比较

    程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这 ...

  8. 广度优先搜索(BFS)

    广度优先搜索算法(Breadth-First-Search),又译作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索算法.简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点 ...

  9. 加固mysql服务器

    实验环境:CentOS7 [root@~ localhost]#yum -y install mariadb-server [root@~ localhost]#mysql_secure_instal ...

  10. 【转载】ruby 中数组函数示例(1)(转)

    函数名称 说明 示例 &      数组与,返回两数组的交集 [1,2] & [2,3] =>[2]   * 复制数组n次 [1,2]*2       => [1,2,1, ...