• 别再听中介忽悠了,用python找到最合适你的房子


    为了确保换房后我和女友前往各自上班地点的通勤时间都在可接受范围内,我需要知道从各处房源位置前往两家公司所需的时间。为了获取这些信息,我们需要借助高德地图api这个工具。

    使用高德api,我们能够轻松地根据地址或名称获取到地址对应的坐标位置,进而获取到对应地点的通勤和周边信息,十分的方便。

    在使用api之前,我们首先需要获取到自己的Key值。进入高德开放平台网站,完成个人开发者注册和zfb实名认证后,点击 控制台 → 应用管理 → 我的应用 → 创建新应用 ,来完成应用的创建。

    之后点击右上角的 添加 ,来为自己创建一个Key,注意这里服务平台要选择 Web服务 ,不同选项对应的服务范围是不同的。

    创建key值之后,就可以开始使用api获取数据了。

    首先我们要根据地点名称得到对应的坐标值,然后用出发地和目的地的坐标调用接口,得到两个位置之间的通勤时间。

    思路理清之后,就到了操作时间了。

    获取房源坐标

    因为总的房源数量太大,所以我们可以用小区的坐标位置代替房源的具体位置进行调用,这样需要进行的处理量就大大减小了,可以节省一些不必要的成本。

    因此首先我们对上篇文章中获取到的数据做一个简单的处理,利用set对小区名做一个去重。

    csv_read=pd.read_csv('../document/sh.csv',header=None)
    village_set = set(csv_read[2])
    village_list = list(village_set)

    获取到小区列表后,我们尝试调用一下获取坐标的API。

    # 高德API的URL
    geourl = 'https://restapi.amap.com/v3/geocode/geo'  
    
    # 地址前要加地区名,否则可能定位到其他城市
    params = {'key':'在这里填入个人的Key值',
            'address': '上海市国金中心'}
    # 发送请求                
    res = requests.get(geourl, params)
    jd = json.loads(res.text)
    # 返回值的具体格式可以在API文档中查看
    geopoint_1 = jd['geocodes'][0]['location']
    
    print(geopoint_1)
    # 121.502021,31.236814
    

    调用成功之后,我们就可以用相同的方法,获取到列表中所有小区的坐标。

    获取路程时间

    在得到各个小区的坐标位置之后,我们就可以调用api获取两个坐标之间的路程时间了。

    举个例子,如果我需要获取两个坐标之间的公交地铁通勤时间,可以用如下的方法:

    # 高德API的URL
    puburl = 'https://restapi.amap.com/v3/direction/transit/integrated?origin={}&destination={}&key={}&time=9:00&city=上海'  
    
    # 发送请求  
    r=requests.get(puburl.format(geopoint_1, geopoint_vill, '在这里填入个人的Key值'))  
    r=r.text  
    jsonData=json.loads(r)
    # 获取步行距离
    publength = round(int(jsonData['route']['transits'][0]['walking_distance'])/1000, 2)
    # 获取总时间
    pubtime = round(int(jsonData['route']['transits'][0]['duration'])/60)

    这里一般会获取到多条路线,不过因为第一条路线通常是用时最短的,所以这里就以第一条路线的数据为代表。

    用类似的方法,通过使用不同的url,就能获取到驾车、步行等方式的路程时间。不过要注意不同的这些api的输入和输出参数是有一定区别的,具体的要参照文档。

    完整代码

    import pandas as pd
    import requests
    import json
    import csv
    import codecs
    
    # 创建导出文件
    with open(r'..\document\village.csv', 'wb+')as fp:
        fp.write(codecs.BOM_UTF8)
    f = open(r'..\document\village.csv','w+',newline='', encoding='utf-8')
    writer = csv.writer(f)
    writer.writerow(("小区名", "坐标", "步行距离-地点1","通勤时间-地点1", "步行距离-地点2","通勤时间-地点2"))
    
    geourl = 'https://restapi.amap.com/v3/geocode/geo'  
    puburl = 'https://restapi.amap.com/v3/direction/transit/integrated?origin={}&destination={}&key={}&time=9:00&city=上海'  
    
    # 读取文件
    csv_read=pd.read_csv('../document/sh.csv',header=None)
    village_set = set(csv_read[2])
    village_list = list(village_set)
    
    # 获取第一个坐标
    geourl = 'https://restapi.amap.com/v3/geocode/geo'  
    # 地址前要加地区名,否则可能定位到其他城市
    params = {'key':'在这里填入个人的Key值',
            'address': '上海市国金中心'}
    # 发送请求                
    res = requests.get(geourl, params)
    jd = json.loads(res.text)
    # 返回值的具体格式可以在API文档中查看
    geopoint_1 = jd['geocodes'][0]['location']
    
    # 获取第二个坐标
    params = {'key':'在这里填入个人的Key值',
            'address': '上海市国正中心'}               
    res = requests.get(geourl, params)
    jd = json.loads(res.text)
    geopoint_2 = jd['geocodes'][0]['location']
    
    for adr in village_list:
        # 获取小区坐标
        params = {'key':'在这里填入个人的Key值',
            'address': '上海市'+adr}                
        res = requests.get(geourl, params)
        jd = json.loads(res.text)
        geopoint = jd['geocodes'][0]['location']
    
        # 获取第一个位置的信息
        r=requests.get(puburl.format(geopoint_1, geopoint, '在这里填入个人的Key值'))  
        r=r.text  
        jsonData=json.loads(r)
        publength_1 = round(int(jsonData['route']['transits'][0]['walking_distance'])/1000, 2)
        pubtime_1 = round(int(jsonData['route']['transits'][0]['duration'])/60)  
    
        # 获取第二个位置的信息
        r=requests.get(puburl.format(geopoint_2, geopoint, '在这里填入个人的Key值'))  
        r=r.text  
        jsonData=json.loads(r)
        publength_2 = round(int(jsonData['route']['transits'][0]['walking_distance'])/1000, 2)
        pubtime_2 = round(int(jsonData['route']['transits'][0]['duration'])/60)  
    
        writer.writerow((adr, geopoint, publength_1, pubtime_1, publength_2, pubtime_2))
    
    f.close()

    将脚本执行后,就能获得各个小区距离目标地点的路程时间。后面再经过一些简单的筛选,就能大大缩小找房的选择范围了。

    高德API还有很多其他的功能,比如POI周边搜索可以查询小区周边指定范围内(比如方圆1公里)是否有便利店,健身房等设施,结合前端组件还可以在地图中显示出指定的位置,合理运用这些功能,能够实现更多的个性化需求,文中只用了很小一部分,大伙可以参照API文档自行尝试。

    不过也要注意一点,对于个人开发者而言,高德API每日的调用次数是有限制的,为了避免超额,大家在爬取数据的时候可以根据实际情况适度缩小范围,减少处理的数据量。

    以上就是这次找房故事的全部内容了,希望能对大家有所帮助,感谢阅读,也祝愿每个打工人都能住的舒心,早日有房。

  • 相关阅读:
    【leetcode top100】两数相加。无重复字符的最长子串,盛水最多的容器,三数之和
    期末作业C#实现学生宿舍管理系统
    ASCII 码对照表详解
    Tensorflow-GPU工具包了解和详细安装方法
    自学黑客(网络安全),一般人我劝你还是算了吧
    国际计费系统基于Sharding-Proxy大数据迁移方案实践
    关于一篇“范式详解”博文的批注
    Gitlab----Shell类型的gitlab-runer设置以root权限执行
    计算机专业毕业设计项目推荐07-科研成果管理系统(JavaSpringBoot+Vue+Mysql)
    C++内存管理
  • 原文地址:https://blog.csdn.net/m0_59485658/article/details/126848054