python 获取百度地图坐标,入库

需求:读取excel得到位置,根据位置名称获取到百度地图的坐标,然后更新数据库信息。

读完此篇文章,能学到的知识:

1、 python操作数据库

2、requests请求url得到数据

3、xlrd读取excel文件

4、parse转码

5、hashlib加密计算sn

一、环境

python 3.9.2
pip 21.2.4
windows / linux

二、需要用到的包

  • requests 请求url获取返回内容
  • pymysql 连接数据库
  • xlrd 读取excel文件,注意新版只能读取 .xls 文件

所有包的安装方式均为:pip install xxx

pip install requests
pip install pymysql
pip install xlrd

三、代码操作

1. 代码结构目录:

python 获取百度地图坐标,入库_第1张图片

2. 链接数据库:不需要多说 基础的host、user、password、database、port、charset替换成自己的就行了

import pymysql

class MysqlHelper:

    # 定义初始化变量
    def __init__(self, host="127.0.0.1", user="root", password="This1020", database="db_jinan_bill", port=3306, charset="utf8"):
        self.host     = host
        self.port     = port
        self.database = database
        self.user     = user
        self.password = password
        self.charset  = charset

    # 链接数据库
    def connect(self):
        self.conn = pymysql.connect(host=self.host,
                                    user=self.user,
                                    password=self.password,
                                    database=self.database,
                                    port=self.port,
                                    charset=self.charset)
        self.cur = self.conn.cursor()

    # 查询一条记录
    def fetchOne(self, sql, params = None):
        dataOne = None
        try:
            count = self.cur.execute(sql, params)
            if count != 0:
                dataOne = self.cur.fetchone()
        except Exception as ex:
            print(ex)
        finally:
            self.close()
        return dataOne

    # 查询多条记录
    def fetchAll(self, sql, params = None):
        dataAll = None
        try:
            count = self.cur.execute(sql, params)
            if count != 0:
                dataAll = self.cur.fetchall()
        except Exception as ex:
            print(ex)
        finally:
            self.close()
        return dataAll

    # 执行 增删改统一方法
    def __item(self, sql, params = None):
        count = 0
        try:
            count = self.cur.execute(sql, params)
            self.conn.commit()
        except Exception as ex:
            print(ex)
        return count

    # 新增数据
    def insert(self, sql, params = None):
        return self.__item(sql, params)

    # 修改数据
    def update(self, sql, params = None):
        return self.__item(sql, params)

    # 删除数据
    def delete(self, sql, params = None):
        return self.__item(sql, params)

    #关闭方法
    def close(self):
        if self.cur != None:
            self.cur.close()
        if self.conn != None:
            self.cur.close()

3. 逻辑代码段

1)引用包

from urllib import parse # 转码
import hashlib # hash md5
from database.mysql import MysqlHelper # 操作数据库
import requests # 请求URL
import xlrd # 读取表格

2)组装url:把里面的ak和sk替换成自己的,用我的说不定哪会就用不了了。

 # 组装url
    def get_url(self, address = None):
        # 已get请求为例:http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=你的ak
        queryStr = '/geocoder/v2/?address=%s&output=json&ak=Y6F597W87rrsWrmuwUGgEFjy' % address
        # 对queryStr进行转码,safe内保留字符不转换
        encodeStr = parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
        # 最后追加yoursk
        rawStr = encodeStr + '7r58bdiCoh6PGpkoEQ544PljySwn9sMI'
        # 计算sn
        sn = (hashlib.md5(parse.quote_plus(rawStr).encode("utf8")).hexdigest())
        # 由于URL里面还有中文,所以需要parse.quote进行处理,然后返回最终可调用的url
        url = parse.quote("http://api.map.baidu.com"+queryStr+"&sn="+sn, safe="/:=&?#+!$,;'@()*[]")
        return url

3)读取excel文件

# 读取excel表格 组装数组
    def read_excel(self):
        # 读取excel
        data = xlrd.open_workbook(r'F:\python\coordinate\tests.xls')
        table = data.sheets()[0]
        # 组装tables
        tables = []
        for rown in range(table.nrows):
            array = {'name': '', 'number': '', 'school': '', 'device': ''}
            array['name'] = table.cell_value(rown, 0)  # 第一列数据 位置名称
            array['number'] = table.cell_value(rown, 1)  # 第二列数据 设备序列号
            array['school'] = table.cell_value(rown, 2)  # 第二列数据 学校名称
            array['device'] = table.cell_value(rown, 3)  # 第二列数据 设备名称
            tables.append(array)
        return tables

4)链接数据库

# 链接数据库
    def __init__(self):
        self.helper = MysqlHelper()
        self.helper.connect()

5)获取url返回信息,并根据条件入库

# 访问url获取返回信息
    def go_url(self):
        tables = self.read_excel() # 拿到表格数组
        for index in range(len(tables)):
            if index != 0: # 排除第一行
                # get请求url获取返回数据
                url = self.get_url(tables[index]['name'])
                res = requests.get(url)
                res.encoding = 'utf-8'
                data = res.json()
                # 请求成功进行组装修改数据库
                if data['status'] == 0:
                    # 组装坐标
                    coordinate = str(data['result']['location']['lng']) + ',' + str(data['result']['location']['lat'])
                    number = tables[index]['number']
                    # 组装sql 并执行
                    sql = "update t_device set coordinate = %s where serial_number = %s and is_delete = %s"
                    params = [
                        coordinate,
                        number,
                        0
                    ]
                    end = self.helper.update(sql, params)
                    if end == 1:
                        print(tables[index]['school'] + '的' + tables[index]['device'] + ' 更新成功')
                    else:
                        print(tables[index]['school'] + '的' + tables[index]['device'] + ' 更新失败或数据和数据库值重复,坐标为:' + coordinate)
                else:
                    print(tables[index]['school'] + '的' + tables[index]['device'] + ' 坐标搜索不到')
        self.helper.close() # 执行完毕关闭数据库连接

四、总结

完整git代码:​​​​​​GitHub - echo-xiaozhi/python-baidu-coordrinate: 读取excel获取位置名称,拿到百度api坐标,更新数据库

有哪里不太能理解的,可以留言或者私信问我,看到即回。

你可能感兴趣的:(python,python,github,后端,数据库,开发语言)