安居客scrapy房产信息爬取到数据可视化(下)-可视化代码

本文介绍使用Scrapy爬取安居客房产信息,并利用PyEcharts和MongoDB进行数据可视化的过程,包括新房分布、房价平均值、户型比例及全国新房地理热力图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

先看看保存的数据吧~

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

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

 

第一张图柱状图

第一张图代码解析:

#encoding:utf-8
import random
from pyecharts import Bar
from pymongo import MongoClient


conn = MongoClient('127.0.0.1',27017)  #创建于MongoDB的连接
db = conn.anjuke  #选择数据库
collection=db.AnjukeItem  #选择数据库下的集合
all = []
res = collection.aggregate([
        {'$group':{'_id':'$city',
                   'count':{'$sum':1}}},
        {'$sort':{'count':-1}},])
conn.close()
#上面是mongodb聚合统计的语句
#$group:按照给定表达式组合结果,这里的_id字段表示你要基于哪个字段来进行分组,这里的$city就表示要基于city字段来进行分组
#下面的count字段的值$sum: 1表示的是获取--满足city字段相同的这一组的数量--乘以后面给定的值(本例为1,那么就是同组的数量)。
#$sort:按照给定的字段排序结果,即按计算好的count排序,-1为降序来排列

for i in res:
    #print(i)
    #{'_id': '成都', 'count': 2074}
    all.append((i['_id'].strip(),i['count']))

attr = [i[0] for i in all[:30] ]  #取前三十城市的名字
v1 = [i[1] for i in all[:30]]  #取前三十城市的值
print(attr)
bar = Bar('新房分布柱状图')  #柱状图
bar.add('各城市新楼盘数',attr,v1,is_label_show=True,is_datazoom_show=True,xaxis_rotate=65, label_color=['#87CEEB',])
#attr  下面的城市名
#v1  数值
#is_label_show -> bool  是否正常显示标签,默认不显示。即各柱上的数字
#is_datazoom_show -> bool  是否使用区域缩放组件,默认为 False
#xaxis_rotate -> int  x 轴刻度标签旋转的角度,默认为 0,即不旋转。旋转的角度从 -90 度到 90 度。
#label_color  柱的颜色
bar.render('bar.html')  #html生成

第二张图柱状图

第二图代码解析:

#encoding:utf-8
from pymongo import MongoClient
from pyecharts import Bar


conn = MongoClient('127.0.0.1',27017)
db = conn.anjuke
collection=db.AnjukeItem
res = collection.find()
conn.close()
#连接mongodb的逻辑,同上~

all = {}
for i in res:
    city = i['city']  #获取城市名
    try:

        if i['price'][1].isdecimal():  #判断i['price'][1]是不是数字型的价格
            price_type = i['price'][0]  #获取价格类型
            price = i['price'][1]
            price = int(price)  #str价格转int价格
        elif i['price'][2].isdecimal():  #判断i['price'][2]是不是数字型的价格
            price_type = i['price'][1]  #获取价格类型
            price = i['price'][2]
            price = int(price)  #str价格转int价格
    except:
        continue


    if '均价' in price_type:  #只取均价
        if city in all:
            all[city].append(price)
        else:
            all[city] = [price,]
print(all)
#{'_id': '黑河', 'count': 17}
#{'_id': '甘南', 'count': 17}
#{'_id': '陇南', 'count': 16}
all_avg = []
for city,prices in all.items():
    all_avg.append((city,sum(prices)/len(prices)))  #计算所有的城市房价平均值,all_avg里的元素为元组(城市名,均价)
all_avg = sorted(all_avg,key=lambda x:x[1],reverse=True)  #降序排序 

print(all_avg)
#[('深圳', 59192.21692307692), ('上海', 50811.7504091653), ...



attr = [i[0] for i in all_avg[:30] ]  #获取前30城市名
v1 = ['{:.1f}'.format(i[1]) for i in all_avg[:30]]  #获取前30名的值
bar = Bar('各城市房价平均值')
bar.add('单位面积价格(元/平米)',attr,v1,is_label_show=True,is_datazoom_show=True)
#画图逻辑,同上
bar.render('bar2.html')

第三张图玫瑰图

第三张图代码解析:

from pyecharts import Pie
from pymongo import MongoClient

conn = MongoClient('127.0.0.1',27017)
db = conn.anjuke
collection=db.AnjukeItem
#Mongodb的连接
all = []
res = collection.aggregate(
    [
    {
        '$unwind': '$type_'
    },{
        '$group': {
            '_id': '$type_',
            'count': {'$sum': 1}
        }
    }
    ]
)
#上面是mongodb聚合统计的语句
#'$unwind': '$type_'因为type_是一个列表这里是将type_拆分了,用以下面的计算
#$group:按照给定表达式组合结果,这里的_id字段表示你要基于哪个字段来进行分组,这里的$type_就表示要基于type_字段来进行分组
#下面的count字段的值$sum: 1表示的是获取--满足type_字段相同的这一组的数量--乘以后面给定的值(本例为1,那么就是同组的数量)。
conn.close()

all = []
for i in res:
    print(i)
    #{'_id': '商业', 'count': 337}
    #{'_id': '商办', 'count': 158}
    #{'_id': '8室', 'count': 76}
    if '' in i['_id']:  #只取有'室'关键字的数据
        all.append((i['_id'],i['count']))
all = sorted(all,key=lambda x:x[1],reverse=True)  #以数量进行排序
print(all)


attr = [i[0] for i in all][:6]  #取前六的类型名
v1 = [i[1] for i in all][:6]  #取前六的数值

pie =Pie("户型比例", title_pos='center', width=900)
#pie.add("商品A", attr, v1, center=[25, 50], is_random=True, radius=[30, 75], rosetype='radius')
pie.add("商品B", attr, v1, is_random=True, radius=[30, 75], rosetype='area', is_legend_show=False, is_label_show=True)
#is_random为是否随即排列颜色列表
#radius为半径,第一个为内半径,第二个是外半径;
#rosetype为是否展示成南丁格尔图( 'radius' 圆心角展现数据半分比,半径展现数据大小;'area' 圆心角相同,为通过半径展现数据大小)
#is_label_show为是否显示标签(各个属性的数据信息)
#is_legend_show:是否显示图例
pie.render('pie.html')

第四张图地理热力图

 第四张图代码解析:

#coding=utf-8
from pymongo import MongoClient
from pyecharts import Geo
import json

conn = MongoClient('127.0.0.1',27017)
db = conn.anjuke
collection=db.AnjukeItem
#res=collection.distinct("city")
all = []
res = collection.aggregate([
        {'$group':{'_id':'$city',
                   'count':{'$sum':1}}},
        {'$sort':{'count':-1}},])
for i in res:
    all.append((i['_id'].strip(),i['count']))
conn.close()
#连接查询,和图一一样


new_all =[]
with open('city_coordinates.json','r',encoding='utf-8') as f:
    #这里是复制到pyecharts的地理json数据和爬到的城市名对比,因为好多爬到的城市其实在pyecharts是没有记录的,直接绘图会报错
    #位置在\Python36\Lib\site-packages\pyecharts\datasets\city_coordinates.json
    all_city = json.loads(f.read(),encoding='utf-8')
for i in all:
    if i[0] in all_city:
        new_all.append(i)

geo = Geo(
    "全国新房分布",  #图标题
    "",  #副标题
    title_color="#fff",  #标题颜色
    title_pos="center",  #标题位置
    width=1200,  #图宽
    height=600,  #
    background_color="#404a59",  #背景颜色
)
attr, value = geo.cast(new_all)  #分开城市名和数值


geo.add(
"",
attr,
value,
visual_range=[100, 1200],  #显示的数值范围
visual_text_color="#fff",  #鼠标放上去后显示的文字颜色
symbol_size=15,  #标记的大小
type='heatmap',  #类型为热力图
is_visualmap=True,
)

geo.render()

End...

转载于:https://www.cnblogs.com/byadmin/p/10841673.html

### 安居客出租房(武汉为例)爬虫+数据分析+可视化 这个爬虫是我前段时间在淘宝上做单子的时候遇见的一个客户需求。本来以为就是一个简单的爬虫项目。但后面客户加了数据清洗和数据分析的要求。而后又加了要详细代码解释的需求等等。直到最后客户坦白说这是他们大专的毕设.......但是这个单子坐下来只有200左右,我想了一下,感觉好亏啊。在淘宝上随便找一个做毕设的都要好多钱的,而且客户本身的代码能力、数学、逻辑能力都很差,导致我每行都给注释以及看不懂,在我交付代码后又纠缠了我一个多礼拜。反正总体做下来的感觉就是烦躁。头一次感觉到了客户需求变更带来的巨大麻烦。 总之这是一次不是很愉快的爬虫经历。但是作为我写爬虫以来注释最详细的一次,以及第一次真正使用像matplotlib这种数据分析库的代码,我认为还是有必要分享出来给大家当个参考的(PS:大佬轻拍~)。爬虫本身几乎没有什么难度,写的也比较乱,敬请见谅。 **功能** 爬取安居客上的出租房信息(武汉地区的),并通过爬取的数据进行数据清洗以及数据分析。给出四个不同层面的可视化图。最终结果如下图所示: ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/1.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/2.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/3.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/4.png) **环境** 1. Windows 10 2. python3.7 **使用方法** 首先声明该爬虫由于是特定情况下写的,所以本身的通用性特别差,仅可以对安居客网站上的武汉的出租房信息进行爬取,且需要自己手动更新cookie。同时在对数据进行分析及可视化的时候由于也是特别针对武汉出租房的进行的,所以针对性也比较强。如果别的需求需要自己进行更改。 1. 访问[安居客网址](https://wuhan.anjuke.com/),获取cookie。 > tip:获取cookie的方法可根据[此链接](https://jingyan.baidu.com/article/5d368d1ea6c6e33f60c057ef.html) 2. 在项目中找到`spider.py`的文件,将第12行的cookie换成你自己的cookie。 3. 运行`spider.py`,获取房源信息。运行后应会产生一个`武汉出租房源情况.csv`的文件。此文件为我们从安居客爬取的房源信息,其中包含`房屋租住链接、房屋描述、房屋地址、房屋详情(户型)以及经纪人、房屋价格`五个属性。 4. 在获取了数据之后我们运行`matplotlib.py`文件。进行数据清洗,分析,可视化。运行后即可获得**功能**中展示四个图片。 **技术栈** 1. request 2. parsel 3. pandas 4. matplotlib **进步(相比之前)** 此次爬虫相比之前的技术上可以说有减无增。但其中注释相当详细,可谓是每行代码都有注释。所以对于初学者应该有一些用处。同时使用matplotlib进行了数据分析可视化等。对于数据处理的代码的注释也是几乎每行都有注释的。
为了解答你关于使用Python和scrapy框架爬取北京二手房信息并进行数据清洗的问题,我们推荐你查阅《北京二手房房价预测:Python机器学习实战案例分析》一书。这本书详细介绍了如何从链家和安居客等第三方网站爬取数据,利用Python及其相关库进行数据分析和机器学习模型的构建。在数据爬取方面,scrapy框架能够高效地处理网页数据爬取任务,它通过定义Item和编写Spider来抓取网页内容,并通过Pipeline进行数据处理。 参考资源链接:[北京二手房房价预测:Python机器学习实战案例分析](https://wenku.youkuaiyun.com/doc/4fg5pcvpkc) 首先,你需要定义一个Item,列出需要抓取的数据字段,如房屋价格、位置、面积等。接下来,编写一个Spider,指定开始爬取的URL,并定义如何解析每个网页中的数据。例如,使用CSS选择器或XPath来定位房屋信息元素。 在数据清洗方面,pandas库是一个强大的工具。爬取下来的数据通常需要去除重复项、填充缺失值、转换数据类型等操作。你可以使用pandas的DataFrame对象进行这些操作。例如,使用.drop_duplicates()去除重复数据,使用.fillna()方法填充缺失值,以及使用.astype()方法转换数据类型。 此外,还可以利用numpy进行更高效的数值计算,以及matplotlib进行数据可视化分析。通过这些步骤,你将能够获得清洗后的数据,为后续的机器学习预测模型准备良好的数据基础。 在学习了如何爬取和清洗数据之后,你还可以通过《北京二手房房价预测:Python机器学习实战案例分析》来深入了解如何使用scikit-learn库构建预测模型,完成从数据分析到模型预测的整个流程。这份资源不仅覆盖了你的问题,还为你提供了全面学习的素材。 参考资源链接:[北京二手房房价预测:Python机器学习实战案例分析](https://wenku.youkuaiyun.com/doc/4fg5pcvpkc)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值