• 介绍mongodb

MongoDB是文档数据库,采用BSON的结构来存储数据。
在文档中可嵌套其他文档类型,使得MongoDB具有很强的数据描述能力。

  • 原理解释

本节案例使用的数据为链家的租房信息,源数据来自于链家网站,所以首先要获取网页数据解析出本案例所需要的房源信息,然后将解析后的数据存储到MongoDB中,最后基于这些数据进行城市租房信息的查询和聚合分析等。

  • 所用环境:

OS:Ubuntu16.04
Python3
MongoDB:v3.4.20

  • 准备

安装本实验所需依赖库
下载方式:

python3 -m pip install pymongo -i https://pypi.tuna.tsinghua.edu.cn/simple
python3 -m pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
python3 -m pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple
python3 -m pip install matplotlib==3.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

一:使用python将爬虫数据存入mongodb

分析租房信息首先要获取原始的房源数据,本例使用python爬虫技术获取链家网页的新房楼盘信息。如图所示,对房源信息进行分析需要获取房源所在区域、小区名、房型、面积、具体位置、价格等信息。

1.使用Python的requests爬虫库从链家网站上获取各城市的楼盘信息,并用lxml库来解析网页上的数据。

import requestsimport refrom lxml import htmlres = requests.get(url, headers=headers)content = html.fromstring(res.text)

使用requests库的get方法获取网页内容,第一个参数为爬取的网页地址,第二个参数为get请求的头header。Get方法返回的是html格式的网页内容,使用lxml库对html网页格式化。

2.获取网页上具体字段信息时使用xpath函数解析html标签,如获取某城市所有的区域信息:

areas = content.xpath('//div[@class="filter-by-area-container"]/ul[@class="district-wrapper"]/li/text()')

使用xpath方法从html文档中来查找信息,具体参数格式请参考lxml库文档,这里不作介绍。

3.获取房源信息后,设计文档的存储格式如下:

{"_id" : ObjectId("5c1aebe52ca2902f3cd00c4a"),"area" : "汉南","title" : "绿地城","type" : "住宅","square" : "建面 87-135㎡","detail_area" : "汉南其它","detail_place" : "马影河大道(汉洪高速汉南出口处)","price" : 9400
}

id由系统自动生成,所在区域area、小区名称title、住房类型type等为字符串形式,价格为浮点数。

4.Python连接数据库需要使用到pymongdb库,连接数据库和创建集合的代码片段如下:

import pymongodbclient = MongoClient('localhost', 27017)db = client.get_database("lianjia")col = db.get_collection("loupan")

使用MongoClient类创建连接数据库对象client,本案例使用本地数据库localhost:27017。get_database方法连接数据库,参数lianjia为数据库名,get_collection方法连接集合,参数loupan为集合名称,如果不存在此数据库和集合则新建。本例中爬取城市武汉的租房信息,集合名称为“loupan”,如需其他城市信息可设置URL,

5.网页解析出的源数据需存入MongoDB文档中,可使用单条插入的方式,也可以使用批量插入的方式。使用的函数均为insert()。如下代码展示向文档插入单条房源信息:

item = {"area": area,"title": title,"type": type,"square": square,"detail_area": detail_area,"detail_place": detail_place,"price": int(price),}
col.insert(item)

6.数据存储后可根据不同条件查询数据;如查询该城市有多少个区域,每个区域有多少房源。实现代码如下:

col.distinct("area")                    #查询该城市有多少个区域col. find({'area':'江岸'}).count()     #某个区域有多少房源col. find({'area':'青山'})              #查找某区域所有的房源信息

二:使用python读取mongodb数据并进行可视化分析

房源数据进行存储后,需要进行数据分析,比如获取每个区域房价的平均值和最大值,并以条形图的形式展示出来。

1.以统计每个区域的房价为例,使用MongoDB聚合管道技术对数据进行分组计算,如下代码片段对房源的区域进行分组聚合:

pipeline = [{"$group":{"_id": "$area","avgPrice": {"$avg": "$price"} ,"MaxPrice": {"$max" : "$price"}}},] col.aggregate(pipeline)

此聚合使用group分组操作符对区域area进行聚合,计算区域楼盘价格的平均值和最大值,area进行聚合,计算区域楼盘价格的平均值和最大值,area进行聚合,计算区域楼盘价格的平均值和最大值,avg根据分组数据进行求取房价平均值,$max根据分组获取房租最大值。聚合结果如下所示:
{ “_id” : “黄冈”, “avgPrice” : 0, “MaxPrice” : 0 }
{ “_id” : “鄂州”, “avgPrice” : 6250, “MaxPrice” : 11000 }
{ “_id” : “洪山”, “avgPrice” : 5343.0, “MaxPrice” : 45000 }
{ “_id” : “汉阳”, “avgPrice” : 5694.1, “MaxPrice” : 47000 }
{ “_id” : “东湖高新”, “avgPrice” : 5031.5, “MaxPrice” : 40000 }
{ “_id” : “咸宁”, “avgPrice” : 10000, “MaxPrice” : 10000 }
{ “_id” : “青山”, “avgPrice” : 5375, “MaxPrice” : 28000 }
{ “_id” : “武昌”, “avgPrice” : 7996.7, “MaxPrice” : 57000 }
{ “_id” : “东西湖”, “avgPrice” : 4083.9, “MaxPrice” : 40000 }
{ “_id” : “硚口”, “avgPrice” : 9036.1, “MaxPrice” : 70000 }
{ “_id” : “沌口开发区”, “avgPrice” : 5055.0, “MaxPrice” : 45000 }
{ “_id” : “黄陂”, “avgPrice” : 3199.7, “MaxPrice” : 40000 }
{ “_id” : “新洲”, “avgPrice” : 1675.8, “MaxPrice” : 26000 }
{ “_id” : “江汉”, “avgPrice” : 9441.1, “MaxPrice” : 85000 }
{ “_id” : “黄石”, “avgPrice” : 6380, “MaxPrice” : 8900 }
{ “_id” : “江岸”, “avgPrice” : 6774.0, “MaxPrice” : 48000 }
{ “_id” : “江夏”, “avgPrice” : 2749.3, “MaxPrice” : 35000 }
{ “_id” : “蔡甸”, “avgPrice” : 3965.6, “MaxPrice” : 32000 }
{ “_id” : “汉南”, “avgPrice” : 3451.8, “MaxPrice” : 18000 }
上述结果可以看到此聚合计算出来的平均房价和最高房价显示与实际不符,在武汉,江汉和江岸区的房价实际上是咸宁地区的房价高很多的,此聚合得出此结果的原因是有些楼盘的价格待定,数据库里price值为0,还有些楼盘是商业的或别墅,价格定位不一样,这都导致最终的平均值不对,因此接下来对进行过滤后再统计房租。

2.以下代码展示匹配楼盘类型为住宅,已给出房价的楼盘信息:

pipeline = [{"$match":{"type": "住宅","price": {"$ne": 0}}},#过滤掉房价待定且不是住宅用途的楼盘{"$group":{"_id": "$area","avgPrice": {"$avg": "$price"},"MaxPrice": {"$max": "$price"}}},]col.aggregate(pipeline)

使用match操作符数据进行过滤,过滤出符合条件的租房信息后再使用group功能进行分组统计,得出的结果为:
{ “_id” : “鄂州”, “avgPrice” : 8833.333333333334, “MaxPrice” : 10000 }
{ “_id” : “洪山”, “avgPrice” : 20662.5, “MaxPrice” : 32000 }
{ “_id” : “汉阳”, “avgPrice” : 17877.7, “MaxPrice” : 29000 }
{ “_id” : “东湖高新”, “avgPrice” : 19607.5, “MaxPrice” : 27500 }
{ “_id” : “青山”, “avgPrice” : 24333.3, “MaxPrice” : 28000 }
{ “_id” : “武昌”, “avgPrice” : 31760, “MaxPrice” : 39000 }
{ “_id” : “东西湖”, “avgPrice” : 15353.3, “MaxPrice” : 18500 }
{ “_id” : “硚口”, “avgPrice” : 23371.4, “MaxPrice” : 39000 }
{ “_id” : “沌口开发区”, “avgPrice” : 15100, “MaxPrice” : 17000 }
{ “_id” : “黄陂”, “avgPrice” : 10600, “MaxPrice” : 12500 }
{ “_id” : “新洲”, “avgPrice” : 7120, “MaxPrice” : 9200 }
{ “_id” : “江汉”, “avgPrice” : 30076.9, “MaxPrice” : 38000 }
{ “_id” : “黄石”, “avgPrice” : 7975, “MaxPrice” : 8900 }
{ “_id” : “江岸”, “avgPrice” : 25050, “MaxPrice” : 42000 }
{ “_id” : “江夏”, “avgPrice” : 11666.6, “MaxPrice” : 14500 }
{ “_id” : “蔡甸”, “avgPrice” : 9660, “MaxPrice” : 12500 }
{ “_id” : “汉南”, “avgPrice” : 7775, “MaxPrice” : 9500 }

3.基于聚合统计出的数据使用python绘制条形图,使用到matplotlib库,具体代码参考代码清单的rentAnaly.py文件,展示出的结果如图所示:

附代码

  1. 爬取链家新房楼盘信息并存入mongodb:wget http://10.90.3.2/HUP/NoSQL/WinQSB/pyloupan.py
  2. 读取mongodb数据进行房价分析wget http://10.90.3.2/HUP/NoSQL/WinQSB/loupanAnaly.py

爬取链家房价信息存储并分析——mongodb存储和聚合查询相关推荐

  1. python爬虫requests源码链家_python爬虫——爬取链家房价信息(未完待续)

    爬取链家房价信息(未完待续) items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # ...

  2. python爬取链家房价消息_Python的scrapy之爬取链家网房价信息并保存到本地

    因为有在北京租房的打算,于是上网浏览了一下链家网站的房价,想将他们爬取下来,并保存到本地. 先看链家网的源码..房价信息 都保存在 ul 下的li 里面 ​ 爬虫结构: ​ 其中封装了一个数据库处理模 ...

  3. 爬取链家网北京房源及房价分析

    爬取链家网北京房源及房价分析 文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍 1.数据获取 # 获取某市区域的所有 ...

  4. python爬取南京市房价_Python的scrapy之爬取链家网房价信息并保存到本地

    因为有在北京租房的打算,于是上网浏览了一下链家网站的房价,想将他们爬取下来,并保存到本地. 先看链家网的源码..房价信息 都保存在 ul 下的li 里面 ​ 爬虫结构: ​ 其中封装了一个数据库处理模 ...

  5. 基于python多线程和Scrapy爬取链家网房价成交信息

    文章目录 知识背景 Scrapy- spider 爬虫框架 SQLite数据库 python多线程 爬取流程详解 爬取房价信息 封装数据库类,方便多线程操作 数据库插入操作 构建爬虫爬取数据 基于百度 ...

  6. 爬取链家北京租房数据并做简单分析

    在一个来北京不久的学生眼中,北京是一个神秘又充满魅力的大城市.它无比美好,但又无时无刻不再觊觎这你薄弱的钱包. 租房是很多人都离不开的硬性需求,这里就对从链家爬取的北京地区房屋出租数据进行一个简单分析 ...

  7. 多进程+多线程爬取链家武汉二手房价

    因为数据分析的需要,就写了爬取链家武汉的数据.因为用scrapy框架感觉太慢了,就自己写了个多进程同步执行的代码. 1.数据量:20000+ 2.程序环境:Python3.6--->用的Anac ...

  8. python爬房源信息_用python爬取链家网的二手房信息

    题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...

  9. python 爬取链家数据_用python爬取链家网的二手房信息

    题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...

  10. 如何高效地爬取链家的房源信息(四)

    "Python实现的链家网站的爬虫第四部分,最后一部分." 本系列文将以链家南京站为例,使用Python实现链家二手房源信息的爬虫,将数据爬取,并存入数据库中,以便使用. 本系列第 ...

最新文章

  1. 学 JavaScript 伤不起……| 每日趣闻
  2. MySQL介绍与语言结构
  3. Netty源码分析第6章(解码器)----第4节: 分隔符解码器
  4. 关于Oracle full outer join 的bug问题分析及处理
  5. Win7 配置Android开发环境
  6. 应云而生,幽灵的威胁 - 云原生应用交付与运维的思考
  7. 使用script命令自动录屏用户操作
  8. mupdf java_mupdf库学习
  9. 简单计算机面试题库及答案_试讲可以看教案吗?必看的面试考前问题解答
  10. 网站显示网页加载时间代码-Typecho
  11. JS的三大组成(ES,DOM,BOM)
  12. Django讲课笔记09:使用QuerySet新增和更新数据
  13. MySQL-30道面试题
  14. AJAX在VS2005下的基本使用第一篇
  15. python编程-Python 编程速成(推荐)
  16. BI工具的优势存在于哪些方面
  17. 对话CDN巨头Akamai:携手金山云,意欲何为?
  18. lamp phpstudy mysql_Phpstudy 搭建服务器教程
  19. Base64编码(java)
  20. 《Software Testing》英文原著阅读 单词

热门文章

  1. OpenGL超级宝典(第7版)笔记15 前三章实例 下个五子棋全代码 (附)
  2. 爱企人事工资管理系统 v8.1 免费下载
  3. 【C/C++】使用PDFLIB创建一个带中文的pdf文件
  4. C++面向对象程序设计实践——任务与指导书(1)
  5. 纯干货分享 | 考PMP留下来的一些重要资料(收藏下载)
  6. 如果无法使用软件打开.mmap文件,解决办法
  7. Java排序算法代码集(7个)
  8. python正则表达式 身份证_正则表达式实现身份证信息验证
  9. mysql分页查询sql语句_mysql 分页查询的sql语句
  10. 最新支付宝扫码点餐系统小程序源码带部署教程