提示:作者原创,转载请注明


城市在售楼盘信息对于科学分析房地产市场、合理制定购房计划具有重要的意义。能够研究在售楼盘及其周边交通、市政配套、教育资源等。本文研究从网站门户,获取在售带有地理位置的新楼盘信息。

一、获取路径

朴素地从网页看,可以直接通过解析页面内容来获取,能够得到楼盘名称、星级、户型、地址、售价等信息,但是基于这种方法获得的信息没有坐标位置(可以利用地理编码获取,这依赖于提供的地址详细程度),不方便进行空间分析。
在这里插入图片描述
在该网页上,还提供了另一种地图查看方式,通过F12抓包可以看到数据的请求和返回内容(需了解 HTTP 协议中两种请求方式)。可以看到(设置只显示XHR,不然会有很多页面要素),找到地图数据Web 服务器的响应XHR后(圈出来的为楼盘数据,其他为地图切片),查看preview里面内容,可以看到显示的有各个行政区的汇总信息,以及详细的楼盘信息。
在这里插入图片描述

二、区汇总信息获取

包含两个主要函数,首先是要构建数据服务地址,传入相应的参数,然后对结果进行解析,具体代码如下:

def GetDistInfo(uri):
    '''
    获取区域统计信息
    '''
    retVal = []
    lpNum = 0
    response = requests.get(uri)
    resJson = response.json()
    if resJson['code'] == '200':
        distData = resJson['data']['dist'] ##获取所有区域统计信息
        lpNum = resJson['data']['xflist']['loupanList']['allResultNum'] ##楼盘数量,后面有用
        for dd in distData:
            tmp = []
            tmp.append(dd['district']) ##名称
            tmp.append(dd['baiducoord']) ##范围坐标点
            tmp.append(dd['proj_count']) ##楼盘数量
            tmp.append(dd['x']) #经度
            tmp.append(dd['y']) ##纬度
            retVal.append(tmp)
    else:
        print('error!')
    return retVal,lpNum
    
def combineUrl(baseUrl,city):
    '''
    构造数据服务地址
    '''
    params = {
        'city': city,
        'a':'ajaxSearch'
    }
    targetUri = ''.join([baseUrl,urllib.parse.urlencode(params)])
    return targetUri

def main():
    baseUrl = 'https://map.fang.com/ajaxSearch.html?'
    city = 'hf'
    uri = combineUrl(baseUrl,city)
    print(uri)
    disInfo,lpNum = GetDistInfo(uri)
    disInfoDf = pd.DataFrame(disInfo,columns=['distname','rangeCor','lpCount','bdCorX','bdCorY'])
    disInfoDf.to_excel(r'./target.xlsx', sheet_name='Sheet1', index=False)

获取结果如下:
在这里插入图片描述

三、楼盘数据获取

新楼盘信息根据抓包信息可以看到,由于每页只返回100条数据,需要有个页码的参数控制翻页,在构建基于页码的uri时增加了一些参数如下:

def reCombineUri(uri,pageN):
    '''
    根据页码获取每页的uri,需要增加一些参数
    '''
    params = {
        'pagingNum': pageN,
        'purpose' : 0, ##所有类型
        'x1': -128.78107787736755, 
        'x2': 128.78107787736755,
        'y1': -75.43079401028984,
        'y2': 75.43079401028984
    }
    pageUri = '&'.join([uri,urllib.parse.urlencode(params)])
    return pageUri

def GetXlpInfo(uri):
    '''
    获取新楼盘详细信息
    '''
    retVal = []
    response = requests.get(uri)
    resJson = response.json()
    if resJson['code'] == '200':
        lpData = resJson['data']['xflist']['loupanList']['hit'] ##楼盘信息
        #print(lpData)
        for ld in lpData:
            tmp = []
            tmp.append(ld['title']) ##名称
            tmp.append(ld['purpose']) ##类型
            tmp.append(ld['price_num'] + ld['price_unit']) ##价格
            tmp.append(ld['minarea']) #最小面积
            tmp.append(ld['maxarea']) ##最大面积
            tmp.append(ld['householdpic']) ##户型
            tmp.append(ld['housetagarr']) ##标签
            tmp.append(ld['dianpingcount'])#评论数量
            tmp.append(ld['zongfen']) ##评分
            tmp.append(ld['x']) ##经度
            tmp.append(ld['y']) ##纬度
            retVal.append(tmp)
    else:
        print('error!')
    return retVal

def main():
    baseUrl = 'https://map.fang.com/ajaxSearch.html?'
    city = 'hf'
    uri = combineUrl(baseUrl,city)
    pageN = math.ceil(GetDistInfo(uri)[1]/100) 
    lpList = []
    for pi in range(1,pageN+1):
        pageUri = reCombineUri(uri,pi)
        lpInfo = GetXlpInfo(pageUri)
        lpList.extend(lpInfo)
    lpInfoDf = pd.DataFrame(lpList,columns=['title','purpose','price','minarea','maxarea','householdpic','housetagarr','dianpingcount','zongfen','bdCorX','bdCorY'])
    lpInfoDf.to_excel(r'./target1.xlsx', sheet_name='Sheet1', index=False)

获取结果如下:
在这里插入图片描述

四、数据清洗和分析

有空再说

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐