python爬虫系列(二)——地图找房新楼盘信息获取
新楼盘信息网络获取途径
·
提示:作者原创,转载请注明
城市在售楼盘信息对于科学分析房地产市场、合理制定购房计划具有重要的意义。能够研究在售楼盘及其周边交通、市政配套、教育资源等。本文研究从网站门户,获取在售带有地理位置的新楼盘信息。
一、获取路径
朴素地从网页看,可以直接通过解析页面内容来获取,能够得到楼盘名称、星级、户型、地址、售价等信息,但是基于这种方法获得的信息没有坐标位置(可以利用地理编码获取,这依赖于提供的地址详细程度),不方便进行空间分析。
在该网页上,还提供了另一种地图查看方式,通过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)
获取结果如下:
四、数据清洗和分析
有空再说
更多推荐
已为社区贡献1条内容
所有评论(0)