爬取南宁房产超市网数据并分析

**

爬取南宁房产超市网数据并分析

**

前段时间做了一个小项目,项目要求是编写爬虫并爬取某网站的信息,对这些信息进行数据挖掘与分析,爬取的数据内容不能少于1千条

由于刚学习完爬虫的编写与使用这些基本内容,了解的深度还是不足,于是特地去找了些教学视频来看,但是效果还是不太乐观。只好一边看Python的BeautifulSoup、request库等等各种库的API文档,一边实践写爬虫代码。

第一次在这写文章分享经验,有什么不足之处大家请多指教~~

网页数据的分析
啊…那不说这么多了,咱们先打开网页按F12看看网页的源代码,先分析一下
我爬取的是南宁房产超市网,网址是:http://rent.nn.fccs.com/lease/search/p1.html

说到这,很多小伙伴会想到怎么实现翻页爬取的问题,大家看上面的网址,看到那个‘p1’没,想实现翻页的话,在敲代码的时候弄个循环,爬取完‘p1’ 也就是爬完第一页的时候,把‘p1’改成’p2‘就好了

言归正传,看网页的时候,看看自己需要的是哪些数据,然后先把各数据的字段写出来
在这里插入图片描述
我想要的数据就是小区名字、区域、地址、住在类型、房型、楼层、装修级别、建造日期、房龄、房子朝向、房子大小(m²)、价格(元/月)这12个数据(也就是字段)
确定了字段,就可以按字段爬取数据了
可以看到’小区名字‘、’地址‘的信息被包含在标签(li class=‘item leaselist’…)里面的(label for calss=‘f14 fb’)里面,住宅类型的信息也是在(li class=‘item leaselist’…)里面的(div calss=‘s’)里面
然后就循环拿取就好了,你们应该懂我的意思吧。。。

编写爬虫程序
接下来就打代码吧,代码如下:

import urllib.request
import urllib.error
from bs4 import BeautifulSoup
import xlwt



class House:

    book=xlwt.Workbook()    #新建一个工作簿
    sheet=book.add_sheet('house_info',cell_overwrite_ok=True)   #添加一个新的表

    def __init__(self,url,colum):
        self.__url=url
        self.__colum=colum

    def exception_handle(self):
        try:
            result=urllib.request.urlopen(self.__url)   #打开网址
            data=result.read().decode('gbk')       #读取网址的信息
            with open(r"D:\PythonWork\Reptile\house_data.txt",'w', encoding='utf-8') as file:   #打开txt文件
                file.write(data)    #写入txt文件
                file.close()
            return data
        except urllib.error.URLError as e:  #抛出错误
            if hasattr(e,"reason"):
                print("无法连接到服务器")
                print("T错误原因",e.reason)
            elif hasattr(e,"code"):
                print("服务器无法完成请求内容!")
                print("错误码:",e.code)
                print("返回的错误信息:",e)
            else:
                pass

    def get_target_data(self):
        data=House.exception_handle(self)   #调用并接收上面函数的返回值
        soup=BeautifulSoup(data,'html.parser')
        infos=soup.find_all('li',class_='item leaselist')
        for info in infos:
            region=info.find_all('label',class_='f14 fb')   #找到小区信息
            adress=info.find_all('label',class_='')     #找到地址信息
            room_msg=info.find_all('div',class_='s')      #找到房子信息
            size=info.find_all('div',class_='p1')       #找到房子大小信息

            region=[i.string for i in  region][0]   #小区
            adress=[i.string for i in adress[0]][0]     #地址
            house_msg=[i.get_text().strip().split('\r\n| ') for i in room_msg][0]
            house_type = house_msg[0]   #住宅的类型
            room_amount = house_msg[1]  #房型
            floor = house_msg[2]    #楼层
            decoration_level = house_msg[3]   #装修级别
            if len(house_msg)==6:
                build_time=house_msg[4]    #房子的建造时间
                direction=house_msg[5]     #房子的朝向
            elif len(house_msg)==5:
                build_time=''
                direction=house_msg[4]
            size_money=[i.get_text().strip().split() for i in size][0]
            house_size=size_money[0]    #房子大小
            house_money=size_money[1]   #房子价钱
            for l in range(len(self.__colum)):     #在表格第一行写入字段名
                    House.sheet.write(0,l,self.__colum[l])


            global row      #声明全局变量row
            House.sheet.write(row,0,region)
            House.sheet.write(row,1, adress)                #把所有信息分别写入表格里
            House.sheet.write(row,2, house_type)
            House.sheet.write(row,3, room_amount)
            House.sheet.write(row,4, floor)
            House.sheet.write(row,5, decoration_level)
            House.sheet.write(row,6, build_time)
            House.sheet.write(row,7, direction)
            House.sheet.write(row,8, house_size)
            House.sheet.write(row,9, house_money)
            row+=1



if __name__ == '__main__':
    row=1
    colum=['小区','地址','住宅类型','房型','楼层','装修级别','建造日期','房子朝向','房子大小','价格']
    start_url='http://rent.nn.fccs.com/lease/search/p{}.html'
    for page in range(1,100):   #翻页抓取,一直到99页
        url=start_url.format(page)
        house=House(url,colum)
        house.get_target_data()
        House.book.save(r"D:\PythonWork\Reptile\house_data_nalysis.xls")    #保存excel文件

我这代码是比较简单的,只爬取这些内容足够了
我是把数据写进excel文档里面的,因为网站只显示20页数据,也就两千条数据。。。
哈哈哈哈哈哈哈哈(尴尬又不失礼貌的大笑.jpg)
不过,可以隔段时间再爬取,把数据追加进文档里就好了,这样可以得到不同时间的很多的数据

进行数据清洗
那么,得到的数据如下:
在这里插入图片描述
我这代码爬出来的数据,基本不用再另外清洗一遍,不过还是建议大家整理一下数据,把那些不可靠的数据去除掉,比如:某条信息房子面积很大,房龄很新,价格确很低,低得离谱。。。那么这条信息是不利于我们做分析的,所以应该去除掉

进行数据分析
我是直接只用excel做的数据分析,分析得也都比较简单
就不一个个列出来了,随便列出三四个分析给大家看看吧
献丑了各位:
1、各区平均房价热力分布图分析
在这里插入图片描述
通过地址坐标信息在地图上进行映射,可以看出大部分房源集中在南宁市中心区域,青秀区周边房源最丰富,同时月平均价格也是最高的
2、网租房信息标题词汇量分析
在这里插入图片描述
在网站上查看房源信息时,每条房源信息中现实的就是房源的标 题,把标题爬下来并分词,用 python 的wordcloud 库来绘制成以上图 案,可以看出网站的标题中,出现频率比较高的词语有:精装、拎包入 住、齐全,另外广场、地铁口词语的出现量也很多,可见南宁房产超市 网的推荐方式主要是通过简述房源信息,并说明看房便利,装修精美以 及交通便利来进行宣传描述
3、各区房子平均面积分析
在这里插入图片描述
从以上透视表可以看出五象新区地房子面积是最高的,毕竟是新区, 房子不建高大上点怎么行,而良庆区的平均面积最小,但是价格却不是最小, 说明良庆区房子的性价比不高啊
4、不同房型的房源数分析
在这里插入图片描述
通过以上数据透视表可以看出 3 室 2 厅 2 卫的房型是最多的,这也 说明大户型房子偏多,而适合一个人租用的房子较少,所以只能进行合租才 是最经济实惠的方式
5、
在这里插入图片描述
通过以上的数据透视表可以看出面积越大,平均价格就越高,而在 100 平米以下房子的价格比较平稳,性价比较高,所以租房的话最好要找 100 平米以下的房子

补充!!!!
差点忘了。。。关于用Wordcloud库做分词:
我之前写爬虫的时候没爬取房源信息的宣传语(标题词),也就是这段话:在这里插入图片描述
这段话可以用来先做jieba分词,然后做成词云图进行分析
下面贴上获取标题词的代码和jieba分词以及wordcloud图的代码:

import urllib.request
from bs4 import BeautifulSoup
import jieba
from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os
from wordcloud import WordCloud,STOPWORDS


def get_data(url):  #获取标题词数据,把数据添加到txt文档中
    res=urllib.request.urlopen(url)
    data=res.read().decode('gbk')
    soup=BeautifulSoup(data,'html.parser')
    msgs=soup.find_all('li',class_='item leaselist')
    with open('hotwords.txt', 'a+', encoding='gbk') as file:
        for msg in msgs:
            words=msg.find_all('div',class_='t_1 fl')
            words=[i.string for i in words][0]      #爬取房源宣传语
            seg_list=jieba.cut(words,cut_all=False)     #用jieba库进行分词
            seg_list =' '.join(seg_list)
            # print(seg_list)
            file.write(seg_list)
    file.close()

def add_wordcld():      #把文档里的字词做成wordcloud词云
    d=path.dirname(__file__)if '__file__' in locals() else os.getcwd()
    text=open(path.join(d,'hotwords.txt')).read()
    horse_mask=np.array(Image.open(path.join(d,'lion_mask.jpg')))
    stopwds=set(STOPWORDS)
    stopwds.add('said')
    wdcld=WordCloud(background_color='white',max_words=1000,mask=horse_mask,
                    stopwords=stopwds,contour_width=1,contour_color='steelblue',
                    font_path='C:\\Windows\\Fonts\\msyh.ttc')   #给词云添加颜色,字体大小等属性
    wdcld.generate(text)
    wdcld.to_file(path.join(d,'lion.jpg'))

    plt.imshow(wdcld,interpolation='bilinear')
    plt.axis('off')
    plt.figure()
    plt.imshow(horse_mask,cmap=plt.cm.get_cmap(),interpolation='bilinear')
    plt.axis('off')
    plt.show()


if __name__ == '__main__':

    start_url='http://rent.nn.fccs.com/lease/search/p{}.html'
    for page in range(1,100):   #翻页抓取,一直到99页
        url=start_url.format(page)
        # get_data(url)
    add_wordcld()

我贴的这两个代码,分别是两个.py文件,不要把它们弄混淆了。。。

总结
这个项目大概就是这样了
那么来总结一下分析所得到的信息吧:
根据爬虫爬出来的数据,对数据进行分析,如果以后在南宁发展的话, 租房子要找每平米 20 到 30 元/月之间价格的小区,尽量选择 100 平米以下 的房子,因为南宁市区附近大户房型比较多,如果想要在市区附近租房的话, 合租是最实惠的方式。良庆区房的子性价比最低,最好不要选择良庆区租房。 西乡塘区的房子平均价格最低,可以考虑西乡塘附近的房子,因为有地铁可以直达市区及青秀区,上下班回家比较方便。除了青秀区,其他区域的房源 不多,如果资金不多或不想在青秀区租房,时间充裕的话,可以慢慢找其他区域的房子。
当然这只是我简单分析出来的一些意见与建议,并不算全面,应该会有偏差,还有许多可以改进的地方。因为有不足之处,所以我才能意识到并且不断进步,努力完善自己,让自己变得更加优秀,大家一起努力吧!

by the way:写文章的时候这个CSDN编辑器怎么把字体调大调小啊?。。。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值