背景春节回京后,本想好好休息两天,家里却迎来了一位意想不到的客人——一只老鼠。***通过一系列的操作,我终于成功捕获了一家8口,这个过程我就不详细描述了。由于抓老鼠事件留下的阴影,我们决定搬走。我开始和儿媳妇一起寻找合适的房子,而这仅仅是个开始;看好房子后(房子还在配置中),和管家约定,交房当天就签合同;连双十一也不过如此!继续找房后,发现根据小区搜索结果很不准确(可以按地铁站过滤,但是直接用小区名搜索??不完整),另外想了解一下目前的市场。对房源有了更清晰的认识,于是有了一个想法——能不能通过爬虫自己来找房子。我开始用爬虫自己搜索找房子。有了这个想法后,我就尝试着去做。首先,我有一个大概的思路:写一个爬虫程序,尽可能的解析出房子相关的信息,存为一个字段。将数据存储在ES(Elasticsearch)中,方便搜索。使用kibana实现查询分析,由于是ELK的经典组件,在查询分析方面有着强大的优势。待开发的爬虫可分为以下几个模块:控制模块:作为启动开关和任务管理爬虫模块:输入一个URL,输出网页内容解析模块:接收一段内容,输出有价值的字段信息,以及nextpage等更多任务存储模块需要解析:简单的做一个map在运行时去重,然后把信息写入ES。整个架构与其他爬虫基本相同,但是为了防止爬虫,搜索结果最多可以显示50页。对应的方法是遍历重要的查询参数,比如城市,地铁站,房屋类型等。所以解析模块的顺序大致是:1.城市列表解析器,用来解析不同的城市(当然这里只需要北京)2.地铁站解析器,用于解析出不同的地铁站3.房屋列表解析器,用于解析每一页的房屋列表和下一页要解析的任务4.房屋详情解析器,用于解析详细信息房屋的朝向、面积、户型、楼层、阳台、室友等。这里有几点需要注意:1.爬虫使用golang,本身没有解析库。您可以使用第三方css样式选择器、xpath或正则表达式。这里主要是用正则表达式实现,有的地方用css选择器。2、一些房间信息,比如地铁站、地铁线路、url、阳台、装修风格等,在房源详情中不容易提取,但是可以在房源列表等上级页面获取。3.租金价格经过反爬虫处理,不易获取。具体来说,价格是不同图片的拼接。这些图片是根据一个带有偏移量的静态随机页面来判断的,然后通过ocr就可以得到基本的图片识别。对应的原图和序列号可以在上层网页源码中找到,很简单。接下来是图像识别,需要用到一个利器——tesseract(https://github.com/tesseract-ocr/tesseract/wiki)虽然有这样的神器,但是解析成功率还是不能保证100%,尤其是在没有训练的情况下,需要加入一些人工识别的代码,短期内提高效率,如上述代码,减少重复性工作,基本可以满足需求。接下来是写入存储,这里是快速实现,我们使用docker在本地运行es和kibana,如下:注意:尽量使用高版本,es镜像中默认安装并激活了x-pack5.6之后的版本基础版license(即基本功能免费使用,这里够用了)可以使用官方客户端连接golang和ES。代码如:注意上面的setSniff=false,如果不加,会报如下错误:在docker中运行es时,默认开启嗅探模式,es自动搜索节点。确保Elasticsearch返回一个可以从容器外部访问的IP地址。解决办法是关闭嗅探或者配置es返回的主机地址,参考https://github.com/olivere/elastic/wiki/Docker1。配置elasticsearch,将network.publish_host和network.bind_host配置为容器外可访问的地址配置network.host(不需要单独配置network.bind_host和network.publish_host)2.Disablesniffingelastic.SetSniff(false)最后,经过一番尝试,登录kibana开始新的探索:比如根据多条地铁线路搜索房源,甚至可以将室友排除在某些职业之外,比如排除自己。然后在Kibana的Visualize里多做分析:比如最贵的地铁站和地铁线路,因为2号线是内环地铁线,平均价格无可争议***。圆明园,一个地铁站,算是一个景点,中关村最贵也是情理之中。整个租金略高,因为双井附近有一些豪宅,其他地区基本在9500左右。市场情况:整租6-7k最多,合租频率最高的是2-3k,其次是3-4k,终于知道为什么之前的房源如此火爆了,因为比本地低均价500以上;1500以下的少数在远郊。住房情况:可以看到自如的住户大多在20平米以内,约占76%。细分的话,10-15是最好的比例,地铁10号线的房源最多。大部分房源集中在顶层,多为没有电梯的老楼;只有20%的房间有独立阳台;而从方位来看,虽然南向的比例最高,但非南向的总和远不止于此,说明大部分人对阳光的接受度不是很好。从房客的信息可以看出,男女比例差不多,但是黄道十二宫中天秤座多于射手座。从专业角度来看,IT行业(开发研发、测试、运维)占比远高于其他行业,且大部分分布在8号线和13号线上(席尔奇表示他非常平静和舒适)。关于季节:2月是过去一年的旺季。大量人的合同到期,大量人重新签约。这涉及到无数小家的搬进搬出,无数的打包拆包,无数的——重新开始!几经折腾,终于找到了新房子,等着过段时间入住。总结下来,生活还是要继续,也许我会在新家遇到老鼠,随着生活的变化,我肯定会搬到其他地方,但在这次“折腾”中,我能够从另一个角度看待自己,看看我和这群人的关系,看看我们和这座城市的关系,才能更好地选择我们的未来。注:以上仅是根据部分个人资料进行的简单分析,不能保证准确性。爬虫应该在对目标服务器没有大干扰的情况下运行,主动限速可以通过channel+time.Tick来实现。
