51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1440|回复: 0
打印 上一主题 下一主题

[python] 神不神奇?用Python租到最合适的房子!

[复制链接]
  • TA的每日心情
    无聊
    昨天 09:10
  • 签到天数: 959 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-9-16 13:21:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    为了确保换房后我和女友前往各自上班地点的通勤时间都在可接受范围内,我需要知道从各处房源位置前往两家公司所需的时间。为了获取这些信息,我们需要借助高德地图api这个工具。
      使用高德api,我们能够轻松地根据地址或名称获取到地址对应的坐标位置,进而获取到对应地点的通勤和周边信息,十分的方便。
      在使用api之前,我们首先需要获取到自己的Key值。进入高德开放平台网站,完成个人开发者注册和zfb实名认证后,点击控制台→应用管理→我的应用→创建新应用,来完成应用的创建。
      之后点击右上角的添加?,来为自己创建一个Key,注意这里服务平台要选择Web服务,不同选项对应的服务范围是不同的。

    创建key值之后,就可以开始使用api获取数据了。
      首先我们要根据地点名称得到对应的坐标值,然后用出发地和目的地的坐标调用接口,得到两个位置之间的通勤时间。
      思路理清之后,就到了操作时间了。
      获取房源坐标
      因为总的房源数量太大,所以我们可以用小区的坐标位置代替房源的具体位置进行调用,这样需要进行的处理量就大大减小了,可以节省一些不必要的成本。
      因此首先我们对上篇文章中获取到的数据做一个简单的处理,利用set对小区名做一个去重。
    1.  csv_read=pd.read_csv('../document/sh.csv',header=None)
    2.   village_set = set(csv_read[2])
    3.   village_list = list(village_set)
    复制代码
    获取到小区列表后,我们尝试调用一下获取坐标的API。
    1. # 高德API的URL
    2.   geourl = 'https://restapi.amap.com/v3/geocode/geo'  
    3.   # 地址前要加地区名,否则可能定位到其他城市
    4.   params = {'key':'在这里填入个人的Key值',
    5.           'address': '上海市国金中心'}
    6.   # 发送请求               
    7.   res = requests.get(geourl, params)
    8.   jd = json.loads(res.text)
    9.   # 返回值的具体格式可以在API文档中查看
    10.   geopoint_1 = jd['geocodes'][0]['location']
    11.   print(geopoint_1)
    12.   # 121.502021,31.236814
    复制代码
    调用成功之后,我们就可以用相同的方法,获取到列表中所有小区的坐标。
      获取路程时间
      在得到各个小区的坐标位置之后,我们就可以调用api获取两个坐标之间的路程时间了。
      举个例子,如果我需要获取两个坐标之间的公交地铁通勤时间,可以用如下的方法:
    1. # 高德API的URL
    2.   puburl = 'https://restapi.amap.com/v3/direction/transit/integrated?origin={}&destination={}&key={}&time=9:00&city=上海'  
    3.   # 发送请求  
    4.   r=requests.get(puburl.format(geopoint_1, geopoint_vill, '在这里填入个人的Key值'))  
    5.   r=r.text  
    6.   jsonData=json.loads(r)
    7.   # 获取步行距离
    8.   publength = round(int(jsonData['route']['transits'][0]['walking_distance'])/1000, 2)
    9.   # 获取总时间
    10.   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每日的调用次数是有限制的,为了避免超额,大家在爬取数据的时候可以根据实际情况适度缩小范围,减少处理的数据量。

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





    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-6-1 08:21 , Processed in 0.062803 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表