python爬取房产信息(一个房地产网站数据采集及简单可视化分析)
python爬取房产信息(一个房地产网站数据采集及简单可视化分析)fymc=n.xpath('./div/div[1]/a/text()')[0]#房源名称 fj=n.xpath('./div/div[6]/div/span[1]/text()')[0]#房价 diqu=n.xpath('./div/div[2]/span[1]/text()')[0]#地区 mj=n.xpath('./div/div[3]/span/text()')[0]然后我们要爬取页数要设置,可以看到页数链接明显出现变化,而且还是规律性的,所以可以构造一个循环采集指定页数的信息(也就是翻页采集),部分代码如下:然后获取各个采集字段的具体xpath,包括房源信息、房价、地区、建面(面积)等字段的xpa,部分代码如下:4、最后可视化先看看最终效果:首先获取目标网站,可以发现获取的数据信息都在网页上面,所以可以直接使用xpa
这次分享一个房地产网站数据采集及可视化分析的Python实际案例,应用效果还是有,步骤如下:
1、获取目标网站
2、分析网站,确定数据采集的方法
3、对采集的数据进行处理
4、最后可视化
先看看最终效果:
首先获取目标网站,可以发现获取的数据信息都在网页上面,所以可以直接使用xpath标签定位获取网页上的数据,而不用担心动态网页的数据会出现变化:
然后获取各个采集字段的具体xpath,包括房源信息、房价、地区、建面(面积)等字段的xpa,部分代码如下:
fymc=n.xpath('./div/div[1]/a/text()')[0]#房源名称
fj=n.xpath('./div/div[6]/div/span[1]/text()')[0]#房价
diqu=n.xpath('./div/div[2]/span[1]/text()')[0]#地区
mj=n.xpath('./div/div[3]/span/text()')[0]
然后我们要爬取页数要设置,可以看到页数链接明显出现变化,而且还是规律性的,所以可以构造一个循环采集指定页数的信息(也就是翻页采集),部分代码如下:
for i in range(1 6):
url='https://nn.fang.lianjia.com/loupan/pg' str(i)
#print(url)
翻页采集搞定了,接下来就是数据处理,先判断采集的数据有没有空值或者缺失值,就必须使用numpy和pandas这两个模块进行数据处理,部分代码如下:
data=pd.read_csv(r'C:/Users/Administrator/Desktop/链家数据.csv' encoding='gbk')
#data.describe()#做描述性分析,判断有没有空值或者缺失值
然后查看采集的数据发现,建面面积这个字段既有中文又有数字和特殊符号,我们要对这个字段进行拆分,拆分为最大面积和最小面积,代码如下:
data['最小面积']=data['面积'].str.split(expand=True)[1].str.split('-' expand=True)[0]
data['最大面积']=data['面积'].str.split(expand=True)[1].str.split('-' expand=True)[1].str.split('㎡' expand=True)[0]
data=data.drop('面积' axis=1)
处理完采集的数据,接下来就是对数据进行可视化,可视化就用到matplotlib这个模块,我们用了三个图去可视化数据,包括折线图、饼图、条形图,部分代码如下:
#制作可视化图表
plt.figure(figsize=(10 8))
plt.suptitle("南宁房价可视化分析" fontsize=20)
plt.subplot(2 2 1)
#不同地区的房源数量--饼图
plt.title('不同地区的房源数量占比--饼图')
explode=[0 0 0 0 0.2 0]
plt.pie(x=data.地区.value_counts() labels=data.地区.value_counts().index
explode=explode autopct='%.3f%%')
plt.subplot(2 2 2)
plt.title('不同地区的房源数量--条形图')
plt.ylim(0 20)
x=data.地区.value_counts().index
y=data.地区.value_counts()
plt.bar(x=x height=y width=0.5)
for a b in zip(x y):
plt.text(a b 0.2 str(b) ha='center' va='bottom' fontsize=10.5 color='green')
plt.subplot(2 1 2)
plt.title('不同地区平均房价——折线图')
plt.ylim(0 30000)
qingxiu=int(data[data['地区']=="青秀区"].房价.mean())
xixiangtang=int(data[data['地区']=="西乡塘区"].房价.mean())
xingning=int(data[data['地区']=="兴宁区"].房价.mean())
liangqing=int(data[data['地区']=="良庆区"].房价.mean())
yongning=int(data[data['地区']=="邕宁区"].房价.mean())
dq=['青秀区' '西乡塘区' '兴宁区' '良庆区' '邕宁区']
mean_fj=[qingxiu xixiangtang xingning liangqing yongning]
#折线图#
plt.plot(dq mean_fj label='不同地区平均房价')
for a b in zip(dq mean_fj):
plt.text(a b 0.2 str(b) ha='center' va='top' fontsize=10.5)
plt.legend(loc=1 fontsize=13)
plt.show()
最后不多说了,附上完整代码:
import requests
from lxml import etree
import csv
import pandas as pd
import matplotlib.pyplot as plt
from pylab import mpl
import time
with open('C:/Users/Administrator/Desktop/链家数据.csv' 'w' encoding='gbk') as f:
f.write('房源名称 房价 地区 面积\n')
f.close()
for i in range(1 6):
url='https://nn.fang.lianjia.com/loupan/pg' str(i)
#print(url)
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
r=requests.get(url headers=headers).content
b=etree.HTML(r)
c=b.xpath('/html/body/div[3]/ul[2]/li')
try:
for n in c:
fymc=n.xpath('./div/div[1]/a/text()')[0]#房源名称
fj=n.xpath('./div/div[6]/div/span[1]/text()')[0]#房价
diqu=n.xpath('./div/div[2]/span[1]/text()')[0]#地区
mj=n.xpath('./div/div[3]/span/text()')[0]
with open('C:/Users/Administrator/Desktop/链家数据.csv' 'a' encoding='gbk') as f1:
f1.write('{} {} {} {}\n'.format(fymc fj diqu mj))
print("数据爬取成功!")
except:
pass
time.sleep(20)
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
data=pd.read_csv(r'C:/Users/Administrator/Desktop/链家数据.csv' encoding='gbk')
#数据处理,拆分面积字段为两列数据,最小面积和最大面积
#data.describe()
data['最小面积']=data['面积'].str.split(expand=True)[1].str.split('-' expand=True)[0]
data['最大面积']=data['面积'].str.split(expand=True)[1].str.split('-' expand=True)[1].str.split('㎡' expand=True)[0]
data=data.drop('面积' axis=1)
#制作可视化图表
plt.figure(figsize=(10 8))
plt.suptitle("南宁房价可视化分析" fontsize=20)
plt.subplot(2 2 1)
#不同地区的房源数量--饼图
plt.title('不同地区的房源数量占比--饼图')
explode=[0 0 0 0 0.2 0]
plt.pie(x=data.地区.value_counts() labels=data.地区.value_counts().index
explode=explode autopct='%.3f%%')
plt.subplot(2 2 2)
plt.title('不同地区的房源数量--条形图')
plt.ylim(0 20)
x=data.地区.value_counts().index
y=data.地区.value_counts()
plt.bar(x=x height=y width=0.5)
for a b in zip(x y):
plt.text(a b 0.2 str(b) ha='center' va='bottom' fontsize=10.5 color='green')
plt.subplot(2 1 2)
plt.title('不同地区平均房价——折线图')
plt.ylim(0 30000)
qingxiu=int(data[data['地区']=="青秀区"].房价.mean())
xixiangtang=int(data[data['地区']=="西乡塘区"].房价.mean())
xingning=int(data[data['地区']=="兴宁区"].房价.mean())
liangqing=int(data[data['地区']=="良庆区"].房价.mean())
yongning=int(data[data['地区']=="邕宁区"].房价.mean())
dq=['青秀区' '西乡塘区' '兴宁区' '良庆区' '邕宁区']
mean_fj=[qingxiu xixiangtang xingning liangqing yongning]
#折线图#
plt.plot(dq mean_fj label='不同地区平均房价')
for a b in zip(dq mean_fj):
plt.text(a b 0.2 str(b) ha='center' va='top' fontsize=10.5)
plt.legend(loc=1 fontsize=13)
plt.show()