App02项目

  • 需求分析
  • 架构选型
  • 开发环境及需要的其他的插件
  • 数据来源
  • 数据存储
  • 数据处理 (项目重点)
    • 数据格式问题
  • 数据可视化
  • 项目代码地址:[github](https://github.com/dssit/App02)
  • 项目成员
  • 更多信息

需求分析

1:爬取厦门市租房网的信息
2 : 对厦门市各个区的租房的价格进行分析
3:通过数据的可视化,来让别人清楚了解厦门市各个区的租房价格的水平

架构选型

开发环境及需要的其他的插件

数据来源

网页url:http://fangzi.xmfish.com/web/search_hire.html?h=&hf=&ca=59201&r=&s=&a=&rm=&f=&d=&tp=&l=0&tg=&hw=&o=&ot=0&tst=0&page=2

程序结构图:

爬虫程序(Crawling_Data.py):

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import csv# num表示记录序号
Url_head = "http://fangzi.xmfish.com/web/search_hire.html?h=&hf=&ca=5920"
Url_tail = "&r=&s=&a=&rm=&f=&d=&tp=&l=0&tg=&hw=&o=&ot=0&tst=0&page="
Num = 0
Filename = "rent.csv"# 把每一页的记录写入文件中
def write_csv(msg_list):out = open(Filename, 'a', newline='')csv_write = csv.writer(out, dialect='excel')for msg in msg_list:csv_write.writerow(msg)out.close()# 访问每一页
def acc_page_msg(page_url):web_data = requests.get(page_url).content.decode('utf8')soup = BeautifulSoup(web_data, 'html.parser')address_list = []area_list = []num_address = 0num_area = 0msg_list = []# 得到了地址列表,以及区域列表for tag in soup.find_all(attrs="list-addr"):for em in tag:count = 0for a in em:count += 1if count == 1 and a.string != "[":address_list.append(a.string)elif count == 2:area_list.append(a.string)num_area += 1elif count == 4:if a.string is not None:address_list[num_address] = address_list[num_address] + "-" + a.stringelse:address_list[num_address] = address_list[num_address] + "-Null"num_address += 1# 得到了价格列表price_list = []for tag in soup.find_all(attrs="list-price"):price_list.append(tag.b.string)# 组合成为一个新的tuple——list并加上序号for i in range(len(price_list)):txt = (address_list[i], area_list[i], price_list[i])msg_list.append(txt)# 写入csvwrite_csv(msg_list)# 爬所有的页面
def get_pages_urls():urls = []# 思明可访问页数134for i in range(134):urls.append(Url_head + "1" + Url_tail + str(i + 1))# 湖里可访问页数134for i in range(134):urls.append(Url_head + "2" + Url_tail + str(i + 1))# 集美可访问页数27for i in range(27):urls.append(Url_head + "3" + Url_tail + str(i + 1))# 同安可访问页数41for i in range(41):urls.append(Url_head + "4" + Url_tail + str(i + 1))# 翔安可访问页数76for i in range(76):urls.append(Url_head + "5" + Url_tail + str(i + 1))# 海沧可访问页数6for i in range(6):urls.append(Url_head + "6" + Url_tail + str(i + 1))return urlsdef run():print("开始爬虫")out = open(Filename, 'a', newline='')csv_write = csv.writer(out, dialect='excel')title = ("address", "area", "price")csv_write.writerow(title)out.close()url_list = get_pages_urls()for url in url_list:try:acc_page_msg(url)except:print("格式出错", url)print("结束爬虫")

数据存储

数据处理 (项目重点)

spark 数据处理程序(SparkBatch_Data.py)

# -*- coding: utf-8 -*-from pyspark.sql import SparkSession
from pyspark.sql.types import IntegerTypedef spark_analyse(filename):# 程序主入口spark = SparkSession.builder.master("local").appName("DataBatch").getOrCreate()df = spark.read.csv(filename, header=True, encoding="GBK")print(df)df.show()# max_list存储各个区的最大值,0海沧,1为湖里,2为集美,3为思明,4为翔安,5为同安;同理的mean_list, 以及min_list,approxQuantile中位数max_list = [0 for i in range(6)]# 平均值mean_list = [1.2 for i in range(6)]# minmin_list = [0 for i in range(6)]# 中位数mid_list = [0 for i in range(6)]# 类型转换,十分重要,保证了price列作为int用来比较,否则会用str比较, 同时排除掉一些奇怪的价格,比如写字楼的出租超级贵# 或者有人故意标签1元,其实要面议, 还有排除价格标记为面议的df = df.filter(df.price != '面议').withColumn("price", df.price.cast(IntegerType()))#df = df.filter(df.price >= 50).filter(df.price <= 40000)## print(df.filter(df.area == "海沧"))#mean_list[0] = df.filter(df.area == "海沧").agg({"price": "mean"}).first()['avg(price)']# print(mean_list[0].collect())#mean_list[1] = df.filter(df.area == "湖里").agg({"price": "mean"}).first()['avg(price)']mean_list[2] = df.filter(df.area == "集美").agg({"price": "mean"}).first()['avg(price)']mean_list[3] = df.filter(df.area == "思明").agg({"price": "mean"}).first()['avg(price)']mean_list[4] = df.filter(df.area == "翔安").agg({"price": "mean"}).first()['avg(price)']mean_list[5] = df.filter(df.area == "同安").agg({"price": "mean"}).first()['avg(price)']min_list[0] = df.filter(df.area == "海沧").agg({"price": "min"}).first()['min(price)']min_list[1] = df.filter(df.area == "湖里").agg({"price": "min"}).first()['min(price)']min_list[2] = df.filter(df.area == "集美").agg({"price": "min"}).first()['min(price)']min_list[3] = df.filter(df.area == "思明").agg({"price": "min"}).first()['min(price)']min_list[4] = df.filter(df.area == "翔安").agg({"price": "min"}).first()['min(price)']min_list[5] = df.filter(df.area == "同安").agg({"price": "min"}).first()['min(price)']#max_list[0] = df.filter(df.area == "海沧").agg({"price": "max"}).first()['max(price)']max_list[1] = df.filter(df.area == "湖里").agg({"price": "max"}).first()['max(price)']max_list[2] = df.filter(df.area == "集美").agg({"price": "max"}).first()['max(price)']max_list[3] = df.filter(df.area == "思明").agg({"price": "max"}).first()['max(price)']max_list[4] = df.filter(df.area == "翔安").agg({"price": "max"}).first()['max(price)']max_list[5] = df.filter(df.area == "同安").agg({"price": "max"}).first()['max(price)']print(max_list[1])# 返回值是一个list,所以在最后加一个[0]mid_list[0] = df.filter(df.area == "海沧").approxQuantile("price", [0.5], 0.01)[0]mid_list[1] = df.filter(df.area == "湖里").approxQuantile("price", [0.5], 0.01)[0]mid_list[2] = df.filter(df.area == "集美").approxQuantile("price", [0.5], 0.01)[0]mid_list[3] = df.filter(df.area == "思明").approxQuantile("price", [0.5], 0.01)[0]mid_list[4] = df.filter(df.area == "翔安").approxQuantile("price", [0.5], 0.01)[0]mid_list[5] = df.filter(df.area == "同安").approxQuantile("price", [0.5], 0.01)[0]all_list = []all_list.append(min_list)all_list.append(max_list)all_list.append(mean_list)all_list.append(mid_list)print("结束spark分析")# print(all_list.printSchema())return all_list

数据处理的时候遇到问题

数据格式问题


导致spark的DataFrame读到的数据格式出现问题
filter的算子把数据都过滤掉了,如下程序截图所示。

spark的filter算子他会过滤不符合的数据,如果我们的DataFrame的数据不是正常的显示 ,而是如下的乱码的格式。
那么filter算子会把数据全部过滤掉, 最终数据会是None

在read数据的时候加上编码就可以避免这样的问题

转成GBK就可以显示正常了

数据可视化

数据可视化生成界面程序(Draw.py)

# -*- coding: utf-8 -*-
import Draw
# -*- coding: utf-8 -*-from pyecharts import Map
# 1. 准备数据
def draw_bar(all_list):print("开始绘图")attr = ["海沧", "湖里", "集美", "思明", "翔安", "同安"]v0 = all_list[0]v1 = all_list[1]v2 = all_list[2]v3 = all_list[3]# 信阳地图 数据为信阳市下的区县attrlist= ["海沧区", "湖里区", "集美区", "思明区", "翔安区", "同安区"]map3 = Map("厦门地图", '厦门', width=1600, height=800)map3.add("厦门", attrlist, v2, visual_range=[1000, 4000], maptype='厦门', is_visualmap=True, visual_text_color='#000')map3.render("厦门租房价格分析地图.html")

总程序启动(main.py)

# -*- coding: utf-8 -*-
import Draw
import Crawling_Data
import SparkBatch_Dataif __name__ == '__main__':print("开始总程序")Filename = "rent.csv"# Crawling_Data.run()all_list = SparkBatch_Data.spark_analyse(Filename)Draw.draw_bar(all_list)# print("结束总程序")

项目代码地址:github

项目成员

更多信息

厦门市租房情况分析App02项目相关推荐

  1. 安居客检测到网页抓取_安居客天津租房情况分析

    本篇文章通过对安居客官网天津市租房信息的进行抓取,然后对房价信息进行了简单的描述性统计分析. 工具和技术:VBA知识.Power Bi 一.采集数据过程抓取思路: 安居客租房信息网址为简单的静态网页, ...

  2. python共享单车案例分析_python分析数据分析项目:共享单车租用情况影响因素探索分析...

    python分析数据分析项目:共享单车租用情况影响因素探索分析

  3. ARX项目lib依赖默认使用情况分析

    #lib文件在arxheaders.h中包含的情况分析 默认情况下arx向导生成的项目包含arxheaders.h即可使用大部分lib文件. arxheaders.h包含 dbxheaders.h , ...

  4. AI视频行为分析系统项目复盘——技术篇3:tensorRT技术梳理

    0 背景 见<AI视频行为分析系统项目复盘--技术篇1> 1 tensorRT 介绍 NVIDIA®TensorRT™是一个深度学习平台,用于模型推理加速(仅支持NVIDIA自家GPU,C ...

  5. AI视频行为分析系统项目复盘——技术篇2:视频流GPU硬解码

    0 项目背景 见<AI视频行为分析系统项目复盘--技术篇1> https://blog.csdn.net/weixin_42118657/article/details/118105545 ...

  6. js自动触发onclick_每日一题JS中最基本的this情况分析

    关注"前端学苑" ,坚持每天进步一点点 「~this情况分析 ~」 每日一题,希望让爱学习.思考的前端技术伙伴在一起学习.复盘.成长. 基础知识要夯实,原理源码要深入,深度广度要扩 ...

  7. 电信业务分类目录2019_2019年1月国内增值电信业务许可情况分析报告,市场区域发展不均衡...

    近日,中国信息通信研究院发布了2019年1月国内增值电信业务许可情况分析报告,报告显示,截至2019年1月底,全国增值电信业务经营许可企业共62708家,但从全国来看,我国增值电信业务市场区域发展不均 ...

  8. 阿里天池:Airbnb短租房数据集分析

    阿里天池:Airbnb短租数据集分析 1.项目介绍 2.字段介绍 3.分析目的和思路 4.模块导入与数据读取 5.探索性分析 (一)整体分析 (二)按区域划分 (三)按房型划分 1.项目介绍 数据来源 ...

  9. 文本分析简历项目收集-----机器学习(仅供参考)

    文本分析 项目3:基于自然语言处理的影评分析 项目简介:通过大量的正面和负面的电影评论对计算机进行自然语言训练,实现计算机对电影评论的基本情感分析,使其能够快速判断出评论是否积极 个人职责:1. 对正 ...

最新文章

  1. memcache和memcached安装
  2. 注意:你智能机中的流氓APP
  3. nginx 转将http跳转到https
  4. 在ubuntu16安装supervisor 并 启动 .net core.
  5. java面试题八 传值传引用
  6. Spring中的ModelAndView
  7. favicon图标制作
  8. 不花钱、不买服务器可以搭建个人博客吗?快进来,给你安排!
  9. windows上使用Git bash详细图文教程
  10. shiro框架的UsernamePasswordToken与对应Realm中的AuthenticationToken的一点比较
  11. 机器学习基础-朴素贝叶斯分类
  12. Django积木块八——三级联动
  13. const again and again
  14. .NET Framework 4.5 ZipArchive类压缩解压
  15. 非常强的用户体验的网站功能
  16. 二进制BIN文件比较工具,也适合用来对比解析BIN文件,发现数据存储规律,更改数据。
  17. python num函数,python函数
  18. 三、Allan方差分析
  19. AMS中控推送系统安装使用说明
  20. 工业场景知识图谱落地实战

热门文章

  1. Yar的RPC的应用-php
  2. html上下键移动单元格,如何用键盘的上下键盘来移动 表格的每一行
  3. 思科无线路由器Cisco AIR-AP1230A-A-K9、Cisco AIR-AP1242AG-C-K9、Cisco AIR-LAP1131AG-C-K9系列配置方法
  4. C语言实现:输入一个数字判断其是否为素数
  5. 电脑很大,电脑声音很大怎么回事
  6. Oracle入门精读43-表空间数据文件自动扩展(autoextend on/off)
  7. idea结合git使用和冲突问题的解决
  8. ueditor多图片上传中去掉在线管理和图片搜索Tab页功能
  9. Ps使用技巧--(一)
  10. Pico VR 实时预览工具 Preview Tool,终于发布