一、背景
爬虫向来不是R的专长,但并不代表R在此方面一事无成。正好在学习R的rvest爬虫包,不如边学边做,自己来做一个案例。
作为一名消费者,自如不错的管理服务和靠谱的房源使得在帝都想省事儿的我们,即使花高于周边其他竞争者的价格,也愿意租住自如。不过,只要是住过自如一两年或看过自如几次房子的小伙伴应该会注意到,自如的房价与我们实际所看到房间的自己预估价格,并不是都契合的,总是会存在被高估和被低估的房子。那么,作为一名消费者,在与商家的博弈中,消费者手上有更为透明的信息无疑会有更强的议价能力。
所以,本案例的目的在于,通过分析现有房租价格和房间信息之间的关系,建立基于这些信息的定价体系回归模型。
二、数据收集
自如作为一个现在最大的房屋租赁中介,已经在其官网上放置了海量的数据,所以,本案例分析的所有数据自然全部来自北京自如官网。
在开始介绍爬虫之前,先就自如官网的数据信息的几个特点说明一下:
- a、该网站信息是处于实时更新状态,本次爬虫获得的数据是2017年1月5日14:26获得的;
- b、该网站的租房信息也不是那一时刻自如所有的信息,自如有还多待租但还没有上网的房源(是的,我的根据是每次找房时候自如管家总会神秘的对我说,『除了网上的,我们还有几个没上网的房间,要不看一下』);
- c、本次分析的目标信息是自如合租月付这类房子,整租、日付、自如寓等以后有精力再说;
- d、本次分析的数据只包括北京城六区(东城、西城、朝阳、海淀、丰台、石景山)外加昌平的自如合租月付数据,一方面是个人找房方位的喜好,一方面是其网页设置的原因,待会儿会提到。
1、首先是找数据源。
2、其次是不断观察总结各个数据节点,找到目标数据所在节点。
3、再次是对照包的参数,形成相应的爬虫代码。
library(rvest)
library(stringr)
library(XML)
library(xml2)
WebSpider <- function(m){
url <- str_c(cp,"?p=",m)
web <- read_html(url,encoding = "UTF-8")#抓取网页信息
name_rough <- web %>% html_nodes("h3") %>% html_text() #获取粗房屋名
area_rough <- web %>% html_nodes("h4") %>% html_text() #提取区位
price_rough <- web %>% html_nodes("p.price") %>% html_text() #提取价格
price <- str_extract(price_rough, "[0-9]+") %>% as.numeric()#提取精确价格
detail <- web %>% html_nodes("div.detail") %>% html_text() #提取其他信息
#合并成数据框
data.frame(name_rough,area_rough,forward,mate_num,location,price,detail)
}
不过,这就遇到了一个问题,在提取『detail』一块时,无法再往下有区分的抓取了,因此造成最后抓到的数据是这样的:
只能在Excel里操作整理完成了。
4、接着是观察翻页规律,然后遇到了一个坑。原以为之后的页码不过是http://www.ziroom.com/z/nl/z3.html的基础上加上/1、/2……..,我依照这个思路抓了一番,也获得了将近4000多条数据,原以为这大概就是全部吧。但我仔细看数据才发现,这样下来的基本都是房山、大兴和通州等的数据,基本没有城六区的,城六区的只有选了区域选项后才会出现:
dc <- "http://www.ziroom.com/z/nl/z3-d23008614.html"
xc <- "http://www.ziroom.com/z/nl/z3-d23008626.html"
cy <- "http://www.ziroom.com/z/nl/z3-d23008613.html"
hd <- "http://www.ziroom.com/z/nl/z3-d23008618.html"
ft <- "http://www.ziroom.com/z/nl/z3-d23008617.html"
sjs <- "http://www.ziroom.com/z/nl/z3-d23008623.html"
cp <- "http://www.ziroom.com/z/nl/z3-d23008611.html"
这样一来,只有逐区的来进行翻页爬了。为此,只能选定部分区域来做分析了。
results_cp <- data.frame()
for(m