本文主要使用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属性的二手房源更高的权重。这个类别的房源可以吸引最多的用户关注。

python链家数据分析_练习—利用Python对链家网广州二手房进行数据分析相关推荐

  1. 利用python进行数据分析_资料 | 利用Python进行数据分析

    下载地址:https://www.yanxishe.com/resourceDetail/1443?from=leiphonecolumn_res0518 以下内容节选自豆瓣: 内容简介 · · · ...

  2. 如何用python进行相关性分析_如何利用python进行时间序列分析

    题记:毕业一年多天天coding,好久没写paper了.在这动荡的日子里,也希望写点东西让自己静一静.恰好前段时间用python做了一点时间序列方面的东西,有一丁点心得体会想和大家分享下.在此也要特别 ...

  3. python制作雷达图_如何利用Python matplotlib绘制雷达图

    本篇文章介绍使用matplotlib绘制雷达图. 雷达图也被称为网络图,蜘蛛图,星图,蜘蛛网图,是一个不规则的多边形.雷达图可以形象地展示相同事物的多维指标,雷达图几乎随处可见,应用场景非常多. 一. ...

  4. python朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  5. python编程应用中级_如何利用Python辅助开发HSK中级课程-数据统计篇

    HSK中级(4级)课程的开发难度比1-3级大上许多.原因主要有:生词量翻倍:3级是300个新增词,4级是600个新增词(脑容量明显不够了) 语法数量猛增:3级的语法数量在50左右,而4级的语法数量,基 ...

  6. python识别图片文字_如何利用Python识别图片中的文字

    一.前言 不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制.或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存.但是当我们想用到里面的 ...

  7. 如何用python修改pdf内容_如何利用python将pdf文件转化为txt文件?

    https://www.wukong.com/answer/6579491774144708872/?iid=15906422033&app=news_article&share_an ...

  8. python计算圆周率近似值_怎样利用python来计算出圆周率π-百度经验

    怎样利用python来计算出圆周率π? 方法/步骤 1 圆周率π是一个无理数,没有任何一个精确公式可以计算出π值,π的计算只能采用近似算法. 我们利用蒙特卡洛方法来求得π的近似值. 蒙特卡洛方法是利用 ...

  9. 利用python查询电脑配置_干货|利用Python将地址转换为经纬度坐标

    本文主要讲述利用Python将文本格式的地址转换为数字格式的经纬度坐标数据,主要步骤有: 注册高德地图API账号,申请Web服务的Key 了解并测试地理编码API服务 利用Python实现地址转坐标 ...

  10. python进行词频统计_如何利用Python进行文本词频统计

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 Python在自然语言处理这个方面,有其天然的优势: ...

最新文章

  1. 服务器ping你可以ping通,你ping服务器ping不同的解决方案!!
  2. windows7与虚拟机fedora 9.0文件共享
  3. 负载均衡设备选型计算参考
  4. 【HDU6662】Acesrc and Travel【树形DP】
  5. VueJS ajax综合案例(修改用户信息实现步骤)
  6. Linux Python 安装第三方库时报错 package wheel is not installed
  7. 怎么一步步编写简单的PHP的Framework(十九)
  8. 怎么自动删除以前数据脚本_移动硬盘数据删除了怎么恢复?硬盘恢复软件分享!...
  9. jquery下的this,$(this),$(this).get(0);
  10. linux命令学习--sort排序命令
  11. excel填充序列_分分钟搞定10万个序号自动填充,拒绝加班,你还在手动输入吗?...
  12. 基于TI Sitara系列AM437x ARM Cortex-A9核心板 处理器
  13. FormulaR1C1是EXCEL中单元格公式输入方法
  14. python处理word页码_使用Python向Word文档添加页码
  15. thinkphp Malformed UTF-8 characters, possibly incorrectly encoded报错解决方案
  16. 设计模式:访问者模式-vistor
  17. Arduino红外控制LED灯开关
  18. EndNote参考文献格式_国标
  19. DailyTopic_4/27: 当当当当~ ~ 吃瓜!
  20. 单点登录 cas 二次开发 服务端开发【系列一】

热门文章

  1. 安装了java环境后,双击.jar包无法运行的解决方案
  2. 清华大学android源码下载网站地址
  3. Oracle JRE 7 Update 51 (64 bit) or higher is required forPolybase failed解决办法
  4. 背包问题九讲笔记_01背包
  5. 聊聊ConcurrentHashMap
  6. python依赖如何打包_python 打包依赖包安装
  7. Web版的各种聊天工具
  8. 【解决】速达服务启动失败,文件无效
  9. 匹配表情emoji 正则_新版Emoji表情过滤
  10. 数据分析的 5 种归纳方法