【python爬虫专项(31)】链家二手房源数据采集4(噪声数据处理)

清洗数据来源

数据是来自于python爬虫专项(28)和(29)里面采集的分页信息和深度信息,如下
1) data_1表格下面获取的分页信息
在这里插入图片描述
2) data_2表格下面获取的深度信息
在这里插入图片描述

清洗逻辑:【函数式编程】–> 【分开清洗保留原数据】

函数构建

函数1:data_cleaning1(table,table_new) → 【分页数据清洗】函数
         table:源数据mongo里data_1集合对象
         table_new:清洗后数据mongo里data_1_new集合对象

函数2:data_cleaning2(table,table_new) → 【详细信息数据清洗】函数
         table:源数据mongo里data_2集合对象
         table_new:清洗后数据mongo里data_2_new集合对象

前期准备与数据库配置

import re
import pymongo


if __name__ == '__main__':
        
    myclient = pymongo.MongoClient("mongodb://localhost:27017/")
    db = myclient['链家二手房_1']
    datatable_1 = db['data_1']
    datatable_2 = db['data_2']
    
    datatable_1_new = db['data_1_new']
    datatable_1_new.delete_many({})
    datatable_2_new = db['data_2_new']
    datatable_2_new.delete_many({})

该部分实现的功能是:相关库的导入,代码分区和数据库的配置(分布信息和深度信息数据的加载以及创建新的数据储存表格)

封装第一个函数

在数据清洗过程中,要以简单便捷为主,不要强行使用一种方式,当一种方式不行的时候,记得及时转换思路

def data_cleaning1(table,table_new):
    '''【列表数据清洗】函数
    table:源数据mongo集合对象
    table_new:清洗后数据mongo集合对象
    '''
    dlst = table.find()
    #加载数据对象,可迭代
    n = 1
    for i in dlst[:499]:
        i['关注量'] = int(re.search(r'(\d+)',i['关注量']).group(1))
        i['面积'] = float(re.search(r'([\d.]+)',i['面积']).group(1))
        i['年份'] = int(re.search(r'(\d+)年',i['建筑完工时间']).group(1))
        #del i['建筑完工时间']
        i['总价_万'] = int(re.search(r'(\d+)万',i['价钱']).group(1))
        #del i['价钱']
        i['单价_元'] = int(re.search(r'单价(\d+)',i['每平米价钱']).group(1))
        #del i['每平米价钱']
        i['楼层高度'] = int(re.search(r'(\d+)',i['楼层']).group(1))
        i['所属楼层'] = i['楼层'].split('(')[0]
        del i['_id']
        del i['价钱']
        del i['每平米价钱']
        del i['建筑完工时间']
        del i['楼层']
        table_new.insert_one(i)
        n += 1
    return n
print(data_cleaning1(datatable_1,datatable_1_new))

输出结果为:500(下面就是修改过后的数据库中的内容)
在这里插入图片描述

封装第二个函数

第二个函数是对深度信息数据进行清洗

def data_cleaning2(table,table_new):
    '''【详细信息数据清洗】函数
    table:源数据mongo集合对象
    table_new:清洗后数据mongo集合对象  
    '''
    dlst = table.find()
    n = 0
    for i in dlst[:500]:
        i['lng'] = float(i['lng'])
        i['lat'] = float(i['lat'])
        i['建筑面积'] = float(re.search(r'([\d.]+)',i['建筑面积']).group(1))
        i['总价_万'] = float(i['总价_万'])
        i['单价_元'] = float(i['单价_元'])
        i['产权年限'] = int(re.search(r'(\d+)',i['产权年限']).group(1))
        mod_area = re.search(r'([\d.]+)',i['套内面积'])
        if mod_area:
            i['套内面积'] = float(mod_area.group(1))
        else:
            del i['套内面积']
        #不是所有的数据都有套内面积的
        i['楼层高度'] = int(re.search(r'(\d+)',i['所在楼层']).group(1))
        i['所属楼层'] = i['所在楼层'].split('(')[0]
        del i['_id']
        del i['所在楼层']
        
        table_new.insert_one(i)
        n += 1
    return n

全部代码

import re
import pymongo

def data_cleaning1(table,table_new):
    '''【列表数据清洗】函数
    table:源数据mongo集合对象
    table_new:清洗后数据mongo集合对象
    '''
    dlst = table.find()
    n = 0
    for i in dlst[:500]:
        i['关注量'] = int(re.search(r'(\d+)',i['关注量']).group(1))
        i['面积'] = float(re.search(r'([\d.]+)',i['面积']).group(1))
        i['年份'] = int(re.search(r'(\d+)年',i['建筑完工时间']).group(1))
        #del i['建筑完工时间']
        i['总价_万'] = int(re.search(r'(\d+)万',i['价钱']).group(1))
        #del i['价钱']
        i['单价_元'] = int(re.search(r'单价(\d+)',i['每平米价钱']).group(1))
        #del i['每平米价钱']
        i['楼层高度'] = int(re.search(r'(\d+)',i['楼层']).group(1))
        i['所属楼层'] = i['楼层'].split('(')[0]
        del i['_id']
        del i['价钱']
        del i['每平米价钱']
        del i['建筑完工时间']
        del i['楼层']
        table_new.insert_one(i)
        n += 1
    return n

    
def data_cleaning2(table,table_new):
    '''【详细信息数据清洗】函数
    table:源数据mongo集合对象
    table_new:清洗后数据mongo集合对象  
    '''
    dlst = table.find()
    n = 0
    for i in dlst[:500]:
        i['lng'] = float(i['lng'])
        i['lat'] = float(i['lat'])
        i['建筑面积'] = float(re.search(r'([\d.]+)',i['建筑面积']).group(1))
        i['总价_万'] = float(i['总价_万'])
        i['单价_元'] = float(i['单价_元'])
        i['产权年限'] = int(re.search(r'(\d+)',i['产权年限']).group(1))
        mod_area = re.search(r'([\d.]+)',i['套内面积'])
        if mod_area:
            i['套内面积'] = float(mod_area.group(1))
        else:
            del i['套内面积']
            
        i['楼层高度'] = int(re.search(r'(\d+)',i['所在楼层']).group(1))
        i['所属楼层'] = i['所在楼层'].split('(')[0]
        del i['_id']
        del i['所在楼层']
        
        table_new.insert_one(i)
        n += 1
    return n      
    
if __name__ == '__main__':
        
    myclient = pymongo.MongoClient("mongodb://localhost:27017/")
    db = myclient['链家二手房_1']
    datatable_1 = db['data_1']
    datatable_2 = db['data_2']
    
    datatable_1_new = db['data_1_new']
    datatable_1_new.delete_many({})
    data_cleaning1(datatable_1,datatable_1_new)
    
    datatable_2_new = db['data_2_new']
    datatable_2_new.delete_many({})
    data_cleaning2(datatable_2,datatable_2_new)

输出的结果如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lys_828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值