python链家数据分析_练习—利用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属性的二手房源更高的权重。这个类别的房源可以吸引最多的用户关注。
python链家数据分析_练习—利用Python对链家网广州二手房进行数据分析相关推荐
- 利用python进行数据分析_资料 | 利用Python进行数据分析
下载地址:https://www.yanxishe.com/resourceDetail/1443?from=leiphonecolumn_res0518 以下内容节选自豆瓣: 内容简介 · · · ...
- 如何用python进行相关性分析_如何利用python进行时间序列分析
题记:毕业一年多天天coding,好久没写paper了.在这动荡的日子里,也希望写点东西让自己静一静.恰好前段时间用python做了一点时间序列方面的东西,有一丁点心得体会想和大家分享下.在此也要特别 ...
- python制作雷达图_如何利用Python matplotlib绘制雷达图
本篇文章介绍使用matplotlib绘制雷达图. 雷达图也被称为网络图,蜘蛛图,星图,蜘蛛网图,是一个不规则的多边形.雷达图可以形象地展示相同事物的多维指标,雷达图几乎随处可见,应用场景非常多. 一. ...
- python朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)
前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...
- python编程应用中级_如何利用Python辅助开发HSK中级课程-数据统计篇
HSK中级(4级)课程的开发难度比1-3级大上许多.原因主要有:生词量翻倍:3级是300个新增词,4级是600个新增词(脑容量明显不够了) 语法数量猛增:3级的语法数量在50左右,而4级的语法数量,基 ...
- python识别图片文字_如何利用Python识别图片中的文字
一.前言 不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制.或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存.但是当我们想用到里面的 ...
- 如何用python修改pdf内容_如何利用python将pdf文件转化为txt文件?
https://www.wukong.com/answer/6579491774144708872/?iid=15906422033&app=news_article&share_an ...
- python计算圆周率近似值_怎样利用python来计算出圆周率π-百度经验
怎样利用python来计算出圆周率π? 方法/步骤 1 圆周率π是一个无理数,没有任何一个精确公式可以计算出π值,π的计算只能采用近似算法. 我们利用蒙特卡洛方法来求得π的近似值. 蒙特卡洛方法是利用 ...
- 利用python查询电脑配置_干货|利用Python将地址转换为经纬度坐标
本文主要讲述利用Python将文本格式的地址转换为数字格式的经纬度坐标数据,主要步骤有: 注册高德地图API账号,申请Web服务的Key 了解并测试地理编码API服务 利用Python实现地址转坐标 ...
- python进行词频统计_如何利用Python进行文本词频统计
欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 Python在自然语言处理这个方面,有其天然的优势: ...
最新文章
- 服务器ping你可以ping通,你ping服务器ping不同的解决方案!!
- windows7与虚拟机fedora 9.0文件共享
- 负载均衡设备选型计算参考
- 【HDU6662】Acesrc and Travel【树形DP】
- VueJS ajax综合案例(修改用户信息实现步骤)
- Linux Python 安装第三方库时报错 package wheel is not installed
- 怎么一步步编写简单的PHP的Framework(十九)
- 怎么自动删除以前数据脚本_移动硬盘数据删除了怎么恢复?硬盘恢复软件分享!...
- jquery下的this,$(this),$(this).get(0);
- linux命令学习--sort排序命令
- excel填充序列_分分钟搞定10万个序号自动填充,拒绝加班,你还在手动输入吗?...
- 基于TI Sitara系列AM437x ARM Cortex-A9核心板 处理器
- FormulaR1C1是EXCEL中单元格公式输入方法
- python处理word页码_使用Python向Word文档添加页码
- thinkphp Malformed UTF-8 characters, possibly incorrectly encoded报错解决方案
- 设计模式:访问者模式-vistor
- Arduino红外控制LED灯开关
- EndNote参考文献格式_国标
- DailyTopic_4/27: 当当当当~ ~ 吃瓜!
- 单点登录 cas 二次开发 服务端开发【系列一】