链家二手房房价数据存入mongodb并进行分析

实验的目的

1.使用python将爬虫数据存入mongodb

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

实验的原理

MongoDB是文档数据库,采用BSON的结构来存储数据。在文档中可嵌套其他文档类型,使得MongoDB具有很强的数据描述能力。本节案例使用的数据为链家的租房信息,源数据来自于链家网站,所以首先要获取网页数据并解析出本案例所需要的房源信息,然后将解析后的数据存储到MongoDB中,最后基于这些数据进行城市租房信息的查询和聚合分析等。

实验的环境

OS:Windows 10

Python3

MongoDB:v4.4

实验的步骤

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

1.爬取的数据

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

定义了三个函数依次实现此过程:

import requests

import re

import threading

import pandas as pd

from 1xml import etree

# 全部信息列表

count=list()

#生成1-10页url

def url creat():

      #基础url

      ur1 =:https://gl.lianjia.com/ershoufang/pg{}/'

      #生成前10页uP1列表

      links-[url. format (i) for i in range (1,11)]

      return links

#对url进行解析

def url parse(url):

       headers = {

'Accept': text/html,application/xhtml+xml,application/xml;q=0.9, image/avif, image/webp, image/apng,*/*;q=0.8, ap',

'Accept-Encoding': gzip, deflate, br',

'Accept-Language': zh-CN,zh; 9=0.9',

'Cache-Control': 'no-cachel,

'Connection": "keep-alive',

'Cookie': lianjia_uuid=7e346c7c-5eb3-45d9-8b4f-e7cf10e807ba; UM_distinctid-17a365c21243a-0€5b8471aaebf5-63732',

'Host' :"qd.lianjia.com',

'Pragma': 'no-cache',

'Referer': 'https://qd.lianjia.com/',

'sec-ch-ua': "" Not;A Brand"; v="99", "Google Chrome";v-"91", "Chromium";v="91",

'sec-ch-ua-mobile: '?0',

'Sec-Fetch-Dest': "document',

'Sec-Fetch-Mode': "navigate',

'Sec-Fetch-Site': same-origin',

"Sec-Fetch-User': '?1',

Upgrade-Insecure-Requests': '1',

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36'},

response=requests.get(url=url,headers=headers).text

tree=etree.HTML(response)

#ul列表下的全部li标签

li_List=tree.xpath("//*[@class='sellListContent']/li")

#创建线程锁对象

lock = threading.RLock()

#上锁

lock.acquire()

for li in li_List:

      #标题

      title=li.xpath('./div/div/a/text()')[0]

      #网址

      link=li.xpath('./div/div/a/@href')[0]

      #位置

      postion=li.xpath('./div/div[2]/div/a/text()')[0]+li.xpath('./div/div[2]/div/a[2]/text()')[0]

      #类型

      types=li.xpath('./div/div[3]/div/text()')[0].split(' | ')[0]

      #面积

      area=li.xpath('./div/div[3]/div/text()')[0].split(' | ')[1]

      area=area[:-2]

      #房屋信息

      info=li.xpath('./div/div[3]/div/text()')[0].split(' | ')[2:-1]
      info=''.join(info)
      #房屋年份
      year=li.xpath('./div/div[3]/div/text()')[0].split(' | ')[5]
      numbers = re.sub("\D", "",year) # 匹配连续的数字
      year=''.join(numbers)
      #房屋装修情况
      renovation=li.xpath('./div/div[3]/div/text()')[0].split(' | ')[3]
      #总价
      count_price=li.xpath('.//div/div[6]/div/span/text()')[0]
      #单价
      angle_price=li.xpath('.//div/div[6]/div[2]/span/text()')[0]
      angle_price=re.sub("\D", "",angle_price)#只保留数字
      dic={'标题':title,"位置":postion,'房屋类型':types,'面积(平米)':area,"单价(元/平)":angle_price,'总价(万)':count_price,'年份':year,'精/简装':renovation,'介绍':info,"网址":link}
      print(dic)
      #将房屋信息加入总列表中
      count.append(dic)
      #解锁
      lock.release()

def run():
      links = url_creat()
      #多线程爬取
      for i in links:
            x=threading.Thread(target=url_parse,args=(i,))
            x.start()
    x.join()
    #将全部房屋信息转化为excel
    data=pd.DataFrame(count)
    data.to_excel('桂林房屋信息.xlsx',index=False)
if __name__ == '__main__':
    run()

爬虫细节参考:【Python爬虫项目】链家房屋信息抓取(超详细适合新手练习附源码)

2.数据清洗

爬出下来的数据存在空缺的情况,并需要去除部分信息【不清洗也可以】
使用python进行数据清洗。首先读取数据

import pandas as pd
data = pd.read_excel("桂林房屋信息.xlsx")
data.head(5)
#data.info()

去掉标题、介绍和网址列,去掉年份为空的行

data_db=data[["位置","房屋类型","面积(平米)","单价(元/平)","总价(万)","年份","精/简装"]].dropna()
data_db["年份"]=data_db["年份"].astype('int')#年份变成整型
data_db = data_db.sort_values(by="年份", ascending=False)#按年份进行排序
data_db

3.数据存储

将清洗好的数据存储到mongodb中:将数据转换成字典列表形式,通过insert_many方法写入

import pandas as pd
from pymongo import MongoClient
 
# 创建MongoDB客户端
client = MongoClient('localhost', 27017) # 根据自己的配置修改主机名和端口号
db = client['lianjia'] # 选择或创建数据库
collection = db['ershoufang'] # 选择或创建集合
 
# 读取DataFrame数据
# 转换DataFrame为字典列表形式
documents = data_db.to_dict(orient='records')
 
# 向集合中插入文档
collection.insert_many(documents)
 
print("Data stored in MongoDB successfully!")

成功写入

二、使用 python 读取 mongodb 数据并进行可视化分析
房源数据进行存储后,需要进行数据分析,比如获取不同年份房价(单价)的最小值和最大值,并以条形图的形式展示出来。
1.以统计不同年份的房价为例,使用 MongoDB 聚合管道技术对数据进行分组计算,如下代码片段对房源的不同年份进行分组聚合:

出现了问题:

也就是nongodb聚合出来的结果python不能直接提取到列表,这个问题我也不知道如何解决。。。

.

所以,比较笨拙的办法为,把聚合的结果先存储到新的集合中:

其中,{ $sort : { “_id” : 1 } }为按照_id字段排序,即为按照年份排序, {“$out”:{“db”:“lianjia”,“coll”:“tongji”}} 为把聚合结果作文新文档存放在数据库lianjia的集合tongji中。

这样就可以提取文档的字段到列表中了,进行下一步:绘图。

2.基于聚合统计出的数据使用 python 绘制条形图,使用到 matplotlib 库,具体代
码如下:

39.

40.#显示条形图

41.plt.show()  这是接着截图里的  可以看序号衔接 因为没截长屏  T.T

结果如图所示:

一些容易出现的问题:
1.数据类型问题:爬虫阶段下载的数据可能是文本类型的或者带单位,数据分析需要改为浮点型或者整型,当然也可以在下载的时候处理好
2.下载的数据若要以年份进行排序,需要提前处理,否则画图会出现问题

到这里就结束了,感谢大家的参考!蟹蟹大家!

作者是一名刚诞生的小白!

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值