对长沙房地产数据的挖掘与分析【二】

对长沙房地产数据的挖掘与分析【二】

今天我们就讲一讲对长沙房地产数据的挖掘与分析【二】,今天的内容不多,主要包含:

  • 抓取的字段数

  • 代码简要分析

注:本节所讲的房地产信息汇总表以及房价汇总表网页已删除,如果需要请私信。

一、 抓取的字段数

关于要抓取的字段数,我们来看一下某一个小区主页的信息:

总的来说,需要抓取的信息有两类:

  • 小区具体信息,包括:小区名称,小区地址,所在城市,所在区,所在道路,小区建成时间,建筑类型,小区物业费,物业公司,开发商,容积率及绿化率,小区楼栋总数,小区房屋总数,小区经纬度,小区均价,小区唯一标识码。

说明:

  1. 小区经纬度在html源码中可以抓到,但是有些小区没有该信息。
  2. 小区唯一标识码指的是该小区的代码,这个在小区链接里面会存在。如万科城的id号就是3511063249999
cs.lianjia.com/xiaoqu/3
  • 小区价格信息,包括该小区近一年的每月共计12次的价格信息。

根据上一讲,我们已经有了每个小区的名称以及该小区的主页网址。

那么后面的就从这一些主页网址作为入口来抓取吧。


二、 抓取小区的具体信息


源码比较简单,如下:

lianjia_info.py

# _*_coding:utf-8_*_
import time
import requests
from pub_fuc import re_fuc
from pymongo import MongoClient
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

client = MongoClient()
dbName = 'lianjia'
dbTable = 'xiaoqu'
tab = client[dbName][dbTable]
dbTable2 = 'xiaoqu_detail_0916'
tab2 = client[dbName][dbTable2]

def getresp(req, retries = 2):
    try:
        headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate, sdch',
            'Accept-Language': 'zh-CN,zh;q=0.8',
            'Cache-Control': 'max-age=0',
            'Connection': 'keep-alive',
            'Host': 'cs.lianjia.com',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36',
        }

        ses = requests.session()
        ses.get('http://cs.lianjia.com/xiaoqu/rs/')
        html = ses.post(req, headers=headers)
        data = html.text.encode('iso8859-1').decode('utf-8')
    except Exception, what:
        print what, req
        if retries > 0:
            return getresp(req, retries - 1)
        else:
            print 'GET Failed', req
            return ''
    return data


xiaoqus = tab.find()
for x in xiaoqus:
    if x:
        url = x['url']
        print url
        if not tab2.find_one({'url': url}):
            cont = getresp(url)
            rel = [r'<h1 class="detailTitle">(.*?)</h1><div class="detailDesc">(.*?)</div>[\s\S]*?<a href="/xiaoqu/">(.*?)</a>[\s\S]*?<a href=[\s\S]*?>(.*?)</a>[\s\S]*?<a href=[\s\S]*?>(.*?)</a>[\s\S]*?<span class="xiaoquInfoLabel">' + u'建筑年代' \
                   + r'</span><span class="xiaoquInfoContent">(.*?)' + u'年建成' + r'[\s\S]*?<span class="xiaoquInfoLabel">' \
                   + u'建筑类型' + r'</span><span class="xiaoquInfoContent">(.*?)</span>[\s\S]*?class="xiaoquInfoContent">(.*?)</span>[\s\S]*?class="xiaoquInfoContent">(.*?)</span>[\s\S]*?class="xiaoquInfoContent">(.*?)</span>[\s\S]*?class="xiaoquInfoContent">(.*?)</span>'\
                   + r'[\s\S]*?class="xiaoquInfoContent">(.*?)</span>[\s\S]*?class="xiaoquInfoContent">(.*?)</span>[\s\S]*?class="xiaoquInfoContent">[\s\S]*?<span mendian="(.*?)" xiaoqu="[\s\S]*?</span>[\s\S]*?</h3><a href="http://cs.lianjia.com/ershoufang/(.*?)/[\s\S]*?<div class="mainContent"><div class="title">小区均价:(.*?)<span>']
            xiaoqu = re_fuc(cont, rel, 'xiaoqu')
            print xiaoqu[0][0]
            key = dict()
            key = dict()
            key['url'] = url
            key[u'小区名称'] = xiaoqu[0][0]
            key[u'小区地址'] = xiaoqu[0][1]
            key[u'城市'] = xiaoqu[0][2]
            key[u'区'] = xiaoqu[0][3]
            key[u'道路'] = xiaoqu[0][4]
            key[u'建成时间'] = xiaoqu[0][5]
            key[u'建筑类型'] = xiaoqu[0][6]
            key[u'物业费'] = xiaoqu[0][7]
            key[u'物业公司'] = xiaoqu[0    ][8]
            key[u'开发商'] = xiaoqu[0][9]
            key[u'容积率/绿化率'] = xiaoqu[0][10]
            key[u'楼栋总数'] = xiaoqu[0][11]
            key[u'房屋总数'] = xiaoqu[0][12]
            key[u'小区经纬度'] = xiaoqu[0][13]
            key[u'小区唯一标识符'] = xiaoqu[0][14]
            key[u'小区均价'] = xiaoqu[0][15]
            tab2.insert(key)
            print u'插入成功!'
            time.sleep(1)
        else:
            print u'已爬取过此小区,无需再次爬取。'

re_fuc.py源码:

#-*-coding:utf8-*-
import re

def re_fuc(cont,rel_list,id_data):
    for rel in rel_list:
        try:
            c = re.compile(rel)
            ret = re.findall(c, cont)
            if ret:
                return ret
            else:
                pass
        except:
            pass

    return None

该源码不再具体分析,主要是用了正则表达式,判重以及重试这三个方法。

截至目前,链家网共有2555条小区信息,我挑出了一些简略信息,通过如下链接可查阅。

长沙房地产数据汇总表长沙2555个房地产小区数据信息汇总表

三、 抓取小区的价格信息

链家网网站平台似乎改版过一次,我之前抓取的时候,其小区主页下方是有具体的12个月的价格信息的。但是,现在却被下面的这个取代了。

不过,我之前抓取价格信息的时候,它是异步加载的。其网址为:

url = 'http://cs.lianjia.com/fangjia/priceTrend/c%s'%id

其中id就是我们的小区唯一标识码,我测试了一下,还是可以用的,如下图万科城的价格信息。所以,可以继续抓取哟。

它是以json格式加载的,只需要解析一下即可。

源码lianjia_price.py

# _*_coding:utf-8_*_
import json
import requests
from pymongo import MongoClient
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

client = MongoClient()
dbName = 'lianjia'
dbTable = 'xiaoqu'
tab = client[dbName][dbTable]
dbTable2 = 'xiaoqu_price'
tab2 = client[dbName][dbTable2]

ses = requests.session()
ses.get('http://cs.lianjia.com/xiaoqu/rs/')

xiaoqus = tab.find()
for x in xiaoqus:
    xiaoqu = x['xiaoqu']
    id = x['url'].split('/')[-2]
    url = 'http://cs.lianjia.com/fangjia/priceTrend/c%s'%id
    print url
    print xiaoqu
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Host': 'cs.lianjia.com',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36',
    }

    merge = tab2.find_one({'url' : url})
    if not merge:
        html = ses.post(url, headers = headers)
        cont = html.text
        if cont:
            price = json.loads(cont)
            if price['currentLevel']:
                price_all = price['upLevel']['dealPrice']['total']
                months = price['upLevel']['month']
                key = dict()
                for i in xrange(len(price_all)):
                    key[months[i]] = price_all[i]

                key['url'] = url
                key[u'小区'] = xiaoqu
                tab2.insert(key)
                print '插入成功!'
    else:
        print '已爬取过该小区,无需重复抓取。'

源码也很简单,主要是来解析json数据以及存储进MongoDB数据库,不再赘述。

下图就是抓取的价格波动信息:

以上就是长沙小区的具体信息以及一年12个月的价格波动信息了,我把它作成了网页版,以供参考。

小区具体的价格信息的网址:长沙2555个小区12个月的价格波动信息表

四、总结

本讲主要讲述了如何抓取小区的各类具体信息以及对应的12个月价格波动信息。主要需要加强学习:

  • 正则表达式的应用。
  • MongoDB数据库的存储。
  • json数据的解析。

再次重申一下,长沙各小区的信息及过去12个月的价格信息可以点击以下链接查看哦~

长沙房地产数据汇总表

长沙各小区12个月价格波动信息

对于长沙的房价上涨情况,你有没有什么感想呢?

注:本数据禁止商业转载,但可用于科研分析,也欢迎数据分析的大牛对这些数据做进一步深层次分析。

下一讲讲述:对长沙房地产数据的挖掘与分析【三】。下一讲我们就对这些数据来初步分析。看看能发现哪些有意思的结果。另本专题全部章节将于微信公众号【一只IT汪】首发,欢迎大家的关注,谢谢!

本系列教程将不定期更新,敬请关注 :)

如果喜欢,请一定记得点赞哟~ 你的赞就是我更新的动力~ o(*≧▽≦)ツ

编辑于 2017-05-07

文章被以下专栏收录