首页 > 其他分享 >HTML应用指南:利用GET请求获取全国特斯拉充电桩位置

HTML应用指南:利用GET请求获取全国特斯拉充电桩位置

时间:2025-01-18 11:27:45浏览次数:3  
标签:bd 特斯拉 GET get HTML location csv data id

随着电动汽车的普及,充电基础设施的建设变得至关重要。作为电动汽车领域的先驱,特斯拉不仅在车辆技术创新上持续领先,还积极构建广泛的充电网络,以支持其不断增长的用户群体。为了提升用户体验和服务质量,开发人员和数据分析师经常需要访问特斯拉充电桩的位置信息,并将其集成到导航系统、移动应用或网站中。

本篇文章,我们将探究GET请求的实际应用,我们使用Python的requests库通过GET请求,从特斯拉官方API获取充电桩位置信息,深入讲解如何构造请求、解析响应数据以及实现数据可视化,通过可视化分析来实现特斯拉在我国的分布情况。

特斯拉官方网址:https://www.tesla.cn/

接下来就是数据获取部分,先讲一下方法思路,一共三个步骤;

方法思路

  1. 获取所有location_id 列表,另存为csv;
  2. 根据每个location_id 查询相关标签数据;
  3. 坐标转换,BD09转WGS84;

第一步:我们先找到对应数据存储位置,获取所有location_id 列表,另存为csv;

完整代码#运行环境 Python 3.11

import requests
import pandas as pd
from requests.adapters import HTTPAdapter, Retry

# 设置请求参数和URL
url = "https://www.tesla.cn/cua-api/tesla-locations"
params = {
    "translate": "zh_CN",
    "map": "baidu",
    "usetrt": "true"
}

# 设置完整的请求头
  headers = {
        "Cookie": "YOUR_COOKIE_HERE",  # 替换为您的Cookie
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }

# 创建会话并配置重试策略
session = requests.Session()
retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retries)
session.mount('https://', adapter)

try:
    # 发送GET请求
    response = session.get(url, params=params, headers=headers, timeout=10)

    # 检查请求是否成功
    if response.status_code == 200:
        # 解析JSON响应
        data = response.json()

        # 检查响应是否为列表
        if isinstance(data, list):
            # 提取所有location_id
            location_ids = [item.get('location_id') for item in data if 'location_id' in item]

            # 创建DataFrame
            df = pd.DataFrame(location_ids, columns=['location_id'])

            # 保存为CSV文件
            csv_filename = 'tesla_locations.csv'
            df.to_csv(csv_filename, index=False, encoding='utf-8-sig')

            print(f"已成功保存 {len(location_ids)} 个location_id到文件: {csv_filename}")
        else:
            print("API响应不是预期的列表格式")
            print(f"响应内容: {response.text}")

    else:
        print(f"请求失败,状态码: {response.status_code}, 响应内容: {response.text}")

except requests.exceptions.RequestException as e:
    print(f"请求过程中发生错误: {e}")

我们就会到一个全国所有特斯拉旗下的,包括体验店和展厅、超级充电站、服务中心、目的地充电、钣喷中心的位置坐标的表格tesla_locations.csv;

第二步:我们发现点击一个任意图标,就会生成新的一个链接,在链接中我们就可以获得对应标签数据,来看一下链接的规律,不同点就是location_id的不同值,我们通过遍历所有的location_id,就可以获得所有的标签数据,;

完整代码#运行环境 Python 3.11

import requests
import pandas as pd
import json
from datetime import datetime
import time
import random
import math


def bd09_to_wgs84(bd_lon, bd_lat):
    """
    百度坐标系(BD-09)转WGS84坐标系
    """
    x_pi = 3.14159265358979324 * 3000.0 / 180.0
    x = float(bd_lon) - 0.0065
    y = float(bd_lat) - 0.006
    z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)
    theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi)
    wgs_lon = z * math.cos(theta)
    wgs_lat = z * math.sin(theta)
    return wgs_lon, wgs_lat


# 读取已有的 CSV 文件
df = pd.read_csv('D:\\data\\tesla_locations.csv')
locations_list = []

# 设置请求头
 headers = {
        "Cookie": "YOUR_COOKIE_HERE",  # 替换为您的Cookie
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }

# 遍历CSV中的每个location_id
for index, row in df.iterrows():
    location_id = row['location_id']

    # 构建请求的 URL
    url = f"https://www.tesla.cn/cua-api/tesla-location?id={location_id}&map=baidu"

    # 随机延时 1-3 秒
    delay = random.uniform(1, 3)
    print(f"等待 {delay:.2f} 秒...")
    time.sleep(delay)

    # 发送 GET 请求
    try:
        response = requests.get(url, headers=headers)
        print(f"正在处理第 {index + 1}/{len(df)} 个位置,ID: {location_id}")

        if response.status_code == 200:
            try:
                data = response.json()

                # 获取百度坐标
                bd_lon = data.get("longitude")
                bd_lat = data.get("latitude")

                # 转换为WGS84坐标
                if bd_lon and bd_lat:
                    wgs84_lon, wgs84_lat = bd09_to_wgs84(bd_lon, bd_lat)
                else:
                    wgs84_lon, wgs84_lat = None, None

                location_info = {
                    "location_id": data.get("location_id"),
                    "title": data.get("title"),
                    "address": data.get("address"),
                    "city": data.get("city"),
                    "province_state": data.get("province_state"),
                    "country": data.get("country"),
                    "bd_longitude": bd_lon,  # 百度坐标
                    "bd_latitude": bd_lat,  # 百度坐标
                    "wgs84_longitude": wgs84_lon,  # WGS84坐标
                    "wgs84_latitude": wgs84_lat,  # WGS84坐标
                    "postal_code": data.get("postal_code"),
                    "directions_link": data.get("directions_link"),
                    "location_type": data.get("location_type", []),
                    "functions_names": data.get("functions_names", [])
                }
                locations_list.append(location_info)
                print(f"成功获取: {location_info['title']}")
            except json.JSONDecodeError:
                print(f"ID {location_id} 的响应内容不是有效的JSON格式")
        else:
            print(f"请求ID {location_id} 失败,状态码: {response.status_code}")
    except Exception as e:
        print(f"处理ID {location_id} 时发生错误: {str(e)}")

# 保存结果
try:
    current_time = datetime.now().strftime('%Y%m%d_%H%M%S')
    filename = f'tesla_locations_detail_{current_time}.csv'
    df_result = pd.DataFrame(locations_list)
    df_result.to_csv(filename, index=False, encoding='utf-8-sig')
    print(f"\n成功保存 {len(locations_list)} 条数据到 {filename}")
except Exception as e:
    print(f"保存文件时发生错误: {str(e)}")

到这里数据就下载完成了,我们就得到了一个完整的包括特斯拉充电桩位置及其其他标签的csv;

第三步:坐标系转换,因为数据用的是百度坐标系(BD09),我们需要把转换成wgs84坐标系在argis上展示才不会偏移,我们把csv的坐标列手动分列一下,并把坐标从百度坐标系(BD09)转到WGS84,批量转换工具:地图坐标系批量转换 - 免费在线工具 (latlongconverter.online),这里在讲一个热知识,目前国内主要有以下三种坐标:

WGS84:一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系;

GCJ02:又称火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系;

BD09:百度地图所使用的坐标体系,是在火星坐标系的基础上又进行了一次加密处理;

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

标签:bd,特斯拉,GET,get,HTML,location,csv,data,id
From: https://blog.csdn.net/weixin_45812624/article/details/145175731

相关文章

  • 举例说明如何使用纯html怎么实现下拉提示的功能?
    使用纯HTML实现下拉提示的功能有一些限制,因为HTML本身并不包含交互逻辑。通常,我们会使用JavaScript或jQuery等脚本语言来增加交互性。但是,如果你只想使用纯HTML,你可以利用<select>和<option>标签来创建一个简单的下拉选择框。下面是一个使用纯HTML实现下拉提示功能的简单示例:<!D......
  • map.merge(num, 1, Integer::sum); 和 map.put(num, map.getOrDefault(num, 0) + 1);
    以下是对map.merge(num,1,Integer::sum);和map.put(num,map.getOrDefault(num,0)+1);的比较:代码示例以下是使用map.merge(num,1,Integer::sum);的示例代码:for(intnum:nums){map.merge(num,1,Integer::sum);}以下是使用ma......
  • Tesla Free - Fall attack:特斯拉汽车网络安全攻击事件分析
    文章目录一、TeslaFree-Fallattack:特斯拉汽车网络安全事件纪要1.引言2.攻击流程2.1攻击切入点2.2系统入侵2.3CAN总线操控3.影响后果4.特斯拉应对措施5.研究意义二、安全攻击事件技术分析以及相应的检测和缓解措施一、TeslaFree-Fallattack:特斯拉......
  • pandoc + wkhtmltox 批量转换Markdown文件为PDF文件
    1.Pandoc的安装1.下载并安装 官网:Pandoc1.1 解压文件将 pandoc-3.6.2-windows-x86_64.zip 解压到一个目录,例如:复制C:\pandoc解压后的文件夹中应包含以下文件:pandoc.exe(主程序)其他相关文件(如文档和依赖项)。1.2. 将Pandoc添加到系统环境变量为了在命令......
  • 【分享】 100+ 套开源大数据可视化大屏Html5模板,全网最炫!
    今天给大家分享100+套开源大数据可视化炫酷大屏Html5模板,全网最新、最多、最全、最酷、最炫的大数据可视化模板!项目介绍BigDataView提供了100+套大数据可视化炫酷大屏Html5模板,涵盖了社区、物业、政务、交通、金融银行等多个行业。这些模板被认为是全网最新、最多、最全、最酷......
  • post、get请求(查询字符串参数)将对象拼接为地址栏请求参数new URLSearchParams
    constparams=newURLSearchParams({param1:'value1',param2:'value2'}).toString();该方法可将param1和param2拼接为param1=value1&param2=value2实例consturl='https://example.com/api/resource';constparams=newURLSearchP......
  • HTML基础
    一.HTML简介1.什么是HTML介绍:HTML是用于描述网页的超文本标记语言,它并非编程语言,而是标记语言,通过标记标签来描述网页。其中,超文本包含文本、图片、视频、音频及链接等。在浏览器中执行文件名称文件类型所能存放的内容qyiao.txt文本文件文字qyiao.docWord文档文字、图片......
  • 请问WebSql是HTML5的一个规范吗?
    WebSQL并不是HTML5的一个规范。尽管它常常与HTML5的技术栈一起被提及,但WebSQL本身是基于SQLite的一个独立规范,引入了一组使用SQL操作客户端数据库的API。这些API允许前端开发者在浏览器中创建、读取、更新和删除数据库中的数据,从而提供了一种在客户端存储和管理数据的机制。然而,......
  • html的button中的reset有什么作用?
    在HTML中,<button>元素通常用于创建一个点击按钮。然而,<button>元素本身并不直接提供“reset”功能。通常,当我们谈到HTML中的“reset”按钮时,我们指的是<input>元素的一种类型,即type="reset"。<inputtype="reset">创建一个重置按钮。当这个按钮被点击时,它会将表单中的所有输......
  • HTML5规范将元素分为哪几个大类?分别说说它们的特点
    HTML5规范将元素主要分为以下几个大类:结构性元素、级块性元素、行内语义性元素以及交互元素。下面分别介绍它们的特点:结构性元素:这类元素主要负责定义Web页面的上下文结构,确保HTML文档的完整性。常见的结构性元素包括<section>、<header>、<footer>、<nav>和<article>等。<......