如何使用requests构造KTM官网地址自动补全URL获取经纬度
我访问KTM阿联酋经销商查询页面时,在ENTER A LOCATION下方的输入框中输入任意地址,例如Taekwondo Mattighofen, Am Steinbach, Lochen am See, Austria,可以在开发者工具中看到对应的自动补全请求,该接口会返回经纬度数值。
目前我已经可以手动从该API获取经纬度,代入以下脚本成功得到经销商查询结果:
import requests from bs4 import BeautifulSoup link = 'https://www.ktm.com/content/websites/ktm-com/middle-east/ae/en/dealer-search/jcr:content/root/responsivegrid_1_col/dealersearch.dealers.json' params = { 'latitude': '48.0075483', 'longitude': '13.1848824', 'country': '', 'qualification': '', 'distance': '50' } with requests.Session() as s: s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36' res = s.get(link,params=params) print(res.json())
请问如何基于requests编写Python脚本,针对任意地址(例如
Nachhilfe Mattighofen, Rosengasse, Mattighofen, Austria)构造对应的自动补全URL,自动获取经纬度完成查询?
实现方案
你可以通过两次请求实现全流程自动化:首先调用KTM官方的地址自动补全接口拿到输入地址对应的经纬度,再代入已有的经销商查询接口即可,完整可运行代码如下:
import requests def get_address_coordinate(target_address): # KTM站点通用地址补全接口 geo_search_api = "https://www.ktm.com/bin/ktm/com/geosearch/search.json" req_headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36', 'Referer': 'https://www.ktm.com/en-ae/find-a-dealer.html' } req_params = { 'q': target_address, 'lang': 'en_AE' } resp = requests.get(geo_search_api, params=req_params, headers=req_headers) resp.raise_for_status() search_result = resp.json() if not search_result: raise ValueError("输入地址未匹配到结果,请检查地址格式") # 取匹配度最高的第一个结果的经纬度 return search_result[0]['latitude'], search_result[0]['longitude'] def search_nearby_dealer(lat, lng, search_radius=50): dealer_query_api = 'https://www.ktm.com/content/websites/ktm-com/middle-east/ae/en/dealer-search/jcr:content/root/responsivegrid_1_col/dealersearch.dealers.json' req_headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36' } req_params = { 'latitude': str(lat), 'longitude': str(lng), 'country': '', 'qualification': '', 'distance': str(search_radius) } with requests.Session() as s: res = s.get(dealer_query_api, params=req_params, headers=req_headers) res.raise_for_status() return res.json() if __name__ == '__main__': # 替换为你需要查询的任意地址即可 input_address = "Nachhilfe Mattighofen, Rosengasse, Mattighofen, Austria" lat, lng = get_address_coordinate(input_address) dealer_list = search_nearby_dealer(lat, lng, search_radius=50) print(dealer_list)
补充说明
search_radius参数为查询半径,单位为公里,可根据需求自行调整- 若需要查询其他国家/地区的KTM经销商,需要对应修改
lang参数和经销商查询接口的路径 - 可以自行添加异常捕获逻辑处理地址匹配失败、接口请求超时等异常情况
内容的提问来源于stack exchange,提问作者robots.txt
相关产品推荐
相关产品推荐

