0.前言
沪上即将毕业党,面临着租房的压力(为什么不是买房?呵呵呵呵你想什么呢。。。。),因此想收集下上海租房信息。比较了几个网站,发现链家数据较易爬取,格式工整,维度丰富,因此,从链家入手,用Python进行数据采集,用R语言对采集后的信息进行数据分析,最后用K-Means聚类算法对房源分类并对租金进行建模,以期真正将所学用到所用之处。(哈哈哈哈哈,但愿~~)
注意:本文只针对初入数据分析的小小白,大神可以绕道~
1.数据获取
首先打开链家网站,进入租房板块[https://sh.lianjia.com/zufang/]
总共38667套出租房源。在列表中信息也算比较丰富了,有求租者最关心的区域、房型、面积、朝向、楼层、租金以及图片等信息。是否需要抓取这部分信息呢?别急,点开列表中某一个房源,我们会发现主页内提供的信息更为齐全,因此确定我们提取的信息来源为房源主页。
(1)工作环境
我用的是Python 3.X版本(忘了具体哪个版本了。。)。建议用chrome打开网页,因为chrome的开发者工具(网页右击“检查”)能大大方便数据的爬取,用Jupyter notebook作为IDE。在Jupyter notebook工作前,需要安装几个爬虫要用的库。打开DOS,依次输入:
pip install requests
pip install BeautifulSoup4
pip install Jupyter notebook
Jupyter notebook
即可。
(2)爬取思路
通过观察网址,发现每个房源的网址信息都 是https://sh.lianjia.com/zufang/xxx.html格式,其中xxx为房源编号。
三万多房源,当然不可能在一页内全部展示,这里理所当然采用了分页,页面上显示了前100个分页信息。通过观察每页的网址,发下每页的格式同样非常简单https://sh.lianjia.com/zufang/pgx/,其中x表示当前页数,比如点击https://sh.lianjia.com/zufang/pg56/就进入了分页56.
因此确定了爬取思路,非常简单,就是两个for循环,第一层循环为分页,从第1页到第100页;第二层循环为每个分页内30个房源,在这一层循环中爬取每个房源的信息。
(3)代码
首先导入需要的库库包包~
import requests
from bs4 import BeautifulSoup
import re
然后我写了一个自编函数,用来针对每一个房源,爬取相应信息:
def getHouseDetail(url):
result={}
res=requests.get(url)
soup=BeautifulSoup(res.text,'html.parser')
for info in soup.select('.overview'):
otherinfo3=info.select('.zf-room')[0].text
result['小区名称']=otherinfo3[otherinfo3.find('小区:')+3:otherinfo3.find('\n',otherinfo3.find('小区:'))]
result['面积']=float(otherinfo3[otherinfo3.find('面积:')+3:otherinfo3.find('平米')])
result['户型']=otherinfo3[otherinfo3.find('户型:')+3:otherinfo3.find(' ',otherinfo3.find('户型:'))]
result['区域']=otherinfo3[otherinfo3.find('位置:')+3:otherinfo3.find(' ',otherinfo3.find('位置:'))]
result['楼层']=otherinfo3[otherinfo3.find('楼层:')+3:otherinfo3.find(' ',otherinfo3.find('楼层:'))]
result['最高楼层']=int(otherinfo3[otherinfo3.find('共')+1:otherinfo3.find('层',otherinfo3.find('共'))])
result['朝向']=otherinfo3[otherinfo3.find('朝向:')+3]
if(len(info.select('.tips'))>0):
result['装修情况']=info.select('.tips')[0].text
else:
result['装修情况']='暂无数据'
result['租金']=int(info.select('.total')[0].text)
if(otherinfo3[otherinfo3.find('卫 ')+3:otherinfo3.find('卫 ')+5]=='整租'):
result['出租方式']='整租'
else:
result['出租方式']='暂无数据'
result['地铁']=otherinfo3[otherinfo3.find('地铁:')+3:otherinfo3.find('\n',otherinfo3.find('地铁:'))]
#result[