python简单脚本 自动爬取高德地图 比较路程 找房找酒店找车站

我要在若干个房子里面找一个通勤最近的,不想一遍一遍地去查高德地图然后来比较,怎么办?我自己写个脚本,批量去request一下高德地图,然后简单整理输出结果,就更一目了然啦~

官方文档

1. 申请个人开发者权限

这一篇写得不错 不赘述

申请高德地图API【流程记录】_高德地图申请api_修炼室的博客-CSDN博客

2. 利用api, 制作header, 请求数据

比如我在上海,想要在早上,以“公交地铁”的方式查询路线

路径规划-API文档-开发指南-Web服务 API | 高德地图API

import urllib.request
import urllib.parse
import json


KEY = "#######"

#公交地铁的header
TRANSIT_HEADER = "https://restapi.amap.com/v3/direction/transit/integrated?"
#地点header, 之后用来查询地点坐标
LOCATION_HEADER = "https://restapi.amap.com/v3/geocode/geo?"

base_dict = {
    'key': KEY,
    'city': "上海",
    'time': '08:40', #白天出发
    'extensions': 'base',
    'output': 'JSON'
}

transit_base_dict = base_dict.copy()


def make_params(params_dict, key=KEY):
    """

    :param key: user key
    :param params_dict: dict of param kv
    :return: formatted, combine with K=V&
    """
    result = ''
    for k, v in params_dict.items():
        result += f"{k}={v}&"
    result += f"key={key}"
    return result

3. 解析返回数据

def get_location(query, city = '上海'):
    url_loc = LOCATION_HEADER + urllib.parse.urlencode({'address': query, 'city': city, 'key': KEY})
    with urllib.request.urlopen(url_loc) as f:
        r = f.read().decode('utf-8')
        json_obj = json.loads(r)
        try:
            return json_obj['geocodes'][0]['location']
        except:
            return None


def get_transit_durs(location_dict):
    url_loc = TRANSIT_HEADER + urllib.parse.urlencode(location_dict)
    with urllib.request.urlopen(url_loc) as f:
        r = f.read().decode('utf-8')
        json_obj = json.loads(r)
        # print(json_obj)
        # print(json_obj['route']['transits'])
        try:
            transits_durations = [int(x['duration']) / 60 for x in json_obj['route']['transits']]
            return transits_durations
        except:
            return []


def min_transit_durs(location_dict):
    durations = get_transit_durs(location_dict)
    return min(durations)

def transit_time_query(start_query, end_query):
    start_loc = get_location(start_query)
    end_loc = get_location(end_query)
    transit_base_dict['destination'] = end_loc
    location_trans_dict = transit_base_dict.copy()
    location_trans_dict['origin'] = start_loc
    return min_transit_durs(location_trans_dict)  

实例:从人民广场到上海站 还是上海虹桥站 更近?

def sh_to_station():
    for start in ['人民广场']:
        for end in ['上海站','上海虹桥站']:
            dur = transit_time_query(start, end)
            print(f"{start} to {end}: {format(dur,'.0f')} mins")

结论:上海站更近。

相应地,可以利用在找房、找办公室、找宾馆等。批量抓取,一目了然。再写写简单的easy coding problem,找找最短的时间等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值