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

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

作者: YOZH | 来源:发表于2016-12-24 23:07 被阅读0次

本文主要使用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() ```
![二手房户型和关注人数分布](https://img.haomeiwen.com/i4043796/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() ```   

![二手房面积分布](https://img.haomeiwen.com/i4043796/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

相关文章

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/vxblvttx.html