练习—利用Python对链家网广州二手房进行数据分析

本文主要使用Python对链家网广州二手房信息进行数据抓取,并从中提取二手房价格、面积、户型和二手房关注度等数据,然后对提取的数据进行相应的数据分析与及对二手房进行分群聚类。

数据获取


网页分析

网页源代码

由上图可知,我们需要的数据都在网页源代码中,所以不需要抓包对网页进行分析。

提取网页中的特定信息

伪装浏览器

#-*- coding:utf-8 -*-
import urllib.request
from bs4 import BeautifulSoup
import pandas as pd
def Disguise():   
 '''伪装浏览器访问'''    
     header = ('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36')    
    #@伪装浏览器    
    opener = urllib.request.build_opener()    
    opener.addheaders = [header]    
    #将伪装浏览器设为全局,这样在后续对网页的访问就可以直接使用urlopen  
    urllib.request.install_opener(opener)

获取网页的内容

def Get_page(url,num):   
     '''@获取网页内容'''    
    try:        
        #获取网页的内容,并使用BeautifulSoup解析以便后面的信息提取          
        page = urllib.request.urlopen(url).read()        
        soup = BeautifulSoup(page, 'lxml')        
        print('--------第%d页抓取成功--------'%num)        
        return soup    
    except urllib.request.URLError as e:        
        if hasattr(e,'code'):            
            print('错误原因:',e.code)        
        if hasattr(e,'reason'):            
            print('错误原因:',e.reason)

提取网页中的信息

这里我们使用python3中BeautifulSoup4模块对网页中的信息进行提取。由于要提取的信息都是以‘|‘或’‘/’相互连接在一起,所以提取的时候需要对信息进行相应的分割。

def Get_House_info(page):   
 '''@提取网页中的房子信息,并把信息以DataFrame的形式返回'''    
    item = {}    
    item['house_name'] = [i.get_text().strip().split('|')[0] for i in page.select('div[class="houseInfo"]')]    #  房名
    item['house_type'] = [i.get_text().strip().split('|')[1] for i in page.select('div[class="houseInfo"]')]    #户型
    item['house_area'] = [i.get_text().strip().split('|')[2] for i in page.select('div[class="houseInfo"]')]    #面积
    item['house_interest'] = [i.get_text().strip().split('/')[0] for i in page.select('div[class="followInfo"]')]    #关注人数
    item['house_see'] = [i.get_text().strip().split('/')[1] for i in page.select('div[class="followInfo"]')]    #带看人数
    item['house_issuedate'] = [i.get_text().strip().split('/')[2] for i in page.select('div[class="followInfo"]')]    #发布时间
    item['house_price'] = [i.get_text().strip() for i in page.select('div[class="totalPrice"] span')]    #房价
    item['house_unit_price'] = [i.get_text().strip() for i in page.select('div[class="unitPrice"] span')]    #单位价格
    return pd.DataFrame(item)

将各个模块进行组装,然后对二手房信息进行爬取

def main():    
    '''@主函数'''    
    filename = 'E:/py3_project/GZlian_jia_analysis/house_data.csv'        
    Disguise()    
    house_data = []    
    #二手房网页总共只有100页,这里可以使用一个for循环对网址进行更新    
    for pg in range(1,101):        
        lianjia_url = 'http://gz.lianjia.com/ershoufang/pg' + str(pg) +'/'        
        page = Get_page(lianjia_url,pg)        
        if len(page) > 0:            
            house_info = Get_House_info(page)            
            #把每一页提取到的信息都存在一个list里面              
            house_data.append(house_info)    
            #对list里的DataFrame进行纵向拼接    
    data = pd.concat(house_data, ignore_index = True)    
    #将信息保存到CSV文件中    
    data.to_csv(filename, encoding = 'gbk', index = False)    
    print('------写入完毕------')
if __name__ == '__main__':    
    main()

部分爬取的内容

数据分析

导入储存信息的文件

import pandas as pd
import os
import house_spider
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
def check_file(filename):    
    '''@检查文件是否存在,不存在则运行爬虫程序获得数据'''     
    if os.path.exists(filename):        
        print('------数据文件已存在------')        
        house_data = pd.read_csv(filename, encoding = 'gbk', sep = ',')        
        return house_data    
    else:        
        print('------文件不存在,运行爬虫程序对信息进行爬取------')        
        house_spider.main()        
        house_data = pd.read_csv(filename, encoding = 'gbk', sep= ',')            
        return house_data

查看数据集的基本信息

def data_info(data_set):    
    '''@查看数据集的基本信息'''    
    print('-----数据集基本信息-----')    
    data_set.info()    
    print('-----预览数据-----\n',data_set.head())
数据集基本信息
预览数据

有上述的部分数据可知,有一些需要的数据是包含在字符串中,所以需要对字符串进行切分。

将数据从字符串提取出来

def data_adj(area_data, str):    
    '''@将字符串转换成数字'''    
    if str in area_data :        
        return float(area_data[0 : area_data.find(str)])    
    else :        
        return None

对处理好的数据进行分析

def main():    
    '''主函数'''   
    filename = 'E:/py3_project/GZlian_jia_analysis/house_data.csv'
    #查看数据文件是否存在
    house_data = check_file(filename)
    #查看数据基本信息    
    data_info(house_data)
    #将数据从字符串提取出来    
    house_data['area_adj'] = house_data['house_area'].apply(data_adj,str = '平米')    
    house_data['interest_adj'] =  house_data['house_interest'].apply(data_adj,str = '人')  
    #画图时显示中文和负号    
    plt.rcParams['font.sans-serif'] = ['SimHei']    
    plt.rcParams['axes.unicode_minus'] = False```
###户型和关注人数分析
```python
    '''户型和关注人数分布'''    
    fig, ax1 = plt.subplots(1,1)    
    type_interest_group = house_data['interest_adj'].groupby(house_data['house_type']).agg([('户型', 'count'), ('关注人数', 'sum')])    
    #取户型>50的数据进行可视化
    ti_sort = type_interest_group[type_interest_group['户型'] > 50].sort_values(by='户型')    
    ti_sort.plot(kind='barh', alpha=0.7, grid=True, ax=ax1)    
    plt.title('二手房户型和关注人数分布')    
    plt.ylabel('户型') 
    plt.show() ```
![二手房户型和关注人数分布](http://upload-images.jianshu.io/upload_images/4043796-c0dd3dd1c64444e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
由上图可以知道,广州二手房户型都集中在3室2厅、2室1厅和2室2厅,而且它们的关注人数也是最多的。其中可以看到2室1厅虽然数量比3室2厅少,但是关注人数却比3室2厅多。
###二手房面积分析
  ```python
    '''面积分布'''    
    fig,ax2 = plt.subplots(1,1)    
    area_level = [0, 50, 100, 150, 200, 250, 300, 500]    
    label_level = ['小于50', '50-100', '100-150', '150-200', '200-250', '250-300', '300-350']    
    area_cut = pd.cut(house_data['area_adj'], area_level, labels=label_level)        
    area_cut.value_counts().plot(kind='bar', rot=30, alpha=0.4, grid=True, fontsize='small', ax=ax2)    
    plt.title('二手房面积分布')    
    plt.xlabel('面积')    
    plt.legend(['数量'])    
    plt.show() ```   

![二手房面积分布](http://upload-images.jianshu.io/upload_images/4043796-1bcf27f753f15ff9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
从二手房的面积分布可以知道,广州二手房面积在50平米-100平米的占比最大。
###聚类分析
对二手房价格、关注人数、面积进行Kmeans聚类
```'''聚类分析'''    
    print('-----开始聚类分析-----')    
    # 缺失值处理:直接将缺失值去掉    
    cluster_data = house_data[['interest_adj','area_adj','house_price']].dropna()    
    #将簇数设为3    
    K_model = KMeans(n_clusters=3)    
    alg = K_model.fit(cluster_data)    
    print('------聚类中心------')    
    center = pd.DataFrame(alg.cluster_centers_, columns=['关注人数','面积','房价'])    
    cluster_data['label'] = alg.labels_    print(center)
   
 if __name__ == '__main__':    
        main()

聚类中心

聚类中心

从聚类中心的结果可知,可以将二手房从房价、关注人数、面积三方面分为3类,分别为

| 类别 | 关注人数 | 面积 |房价|
| : -------- | :-----: | :----: | :----: |
| 1 | 高 | 低 | 低|
| 2 | 中 | 中 | 中|
| 3 | 低 | 高 | 高|
由上述整理结果可以知道,广州二手房面积低(75平米)、房价低(155万)的房源关注人数最高。从侧面也可以推断广州二手房的房价水平大多集中在155万上下。
所以从营销和用户体验的角度来看,网站应该在广告和列表页的默认排序中应该给予总价155万,面积75属性的二手房源更高的权重。这个类别的房源可以吸引最多的用户关注。

参考:
http://www.36dsj.com/archives/71046

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容