python调用百度地图WEB服务API获取地点对应坐标值


Posted in Python onJanuary 16, 2019

本篇博客介绍如何使用Python调用百度地图WEB服务API获取地点对应坐标值,现有一系列结构化地址数据(如:北京市海淀区上地十街十号),目的是获取对应坐标值。

百度地图开发者平台路线规划使用说明网址

最终结果是写入了txt文件,所以需要在循环遇到错误的时候写入对应的可识别的值(看到这个值就知道这个结果是错误的,可以写对应数量的NA或者0值),方便后续分析。

# -*- coding: utf-8 -*-
"""
Created on Fri Aug 15 10:06:16 2018
@author: zjp
Python3.6.6
"""
 
# 加载必要的包
 
import csv
import json
import time
import requests
from bs4 import BeautifulSoup
 
origin_path = 'E://GetRoute/HuaNan/中文地址.csv' # 原始数据文件路径
new_path = 'E://GetRoute/HuaNan/地址对应坐标.txt'  # 爬取数据文件保存路径
 
 
url_geocode = r'http://api.map.baidu.com/geocoder/v2/?' # 百度地图api网址
AK = ['oFCSeioUzdN5NfzSlBBXqBEfXgp26mGM', 'Akqk5xjbSGzy1WC1IUF04K2CQWGtOFNv', 'HCdq1Ry35rwgVQwjAXqAEQGzWNY7pi1h',
  'GtOZERwlG0PynPwFrBYaF9wWcAGxvaw8', 'iRKkZehZimIWdGoxfjlbtLrYb0VVgVaD', 'gG0KIBhAGpAVvaRUlwFjmOtsTKGRK2tf',
  'CSsyosiklqyYUDNnBP0BR63fa9BzCHFf', 'mq4TZshHveVqML3icCC6AWnS25rbjYBz', 'rBYetA6WQNOlXtQWInz8ckRE0iCDsUjB',
  'QUshHD8KUAk8y9gLwDhQ6RyOgQxEB8VD', '7Ict6oZmpAYYXMjha2Tk5g4ENTCYwx03'] # 开发者应用密钥
cod = r'&ret_coordtype=bd09ll' # 坐标类型(设置为百度坐标)
machine_data = csv.reader(open(origin_path, 'r', encoding='utf-8')) # 读取原始文件数据
n = 0
akn = 0
column_names = '设备序列号 取点方式1 准确度1 网点纬度 网点经度 网点名称 取点方式2 准确度2 安装地址纬度 安装地址经度 安装地址 取点 准确度 最佳纬度 最佳经度 安装方式 最佳地址'
with open(new_path, 'a', encoding='utf-8') as f: # 把变量名写入新文件
 f.write(column_names)
 f.write('\n')
 f.close()
while True:
 try:
  for addr in machine_data: # 循环爬取每一条数据
   province = str(addr[0]) # 省份
   city = str(addr[1]) # 城市
   mac = str(addr[2])  # 设备序列号
   wd = str(addr[3])  # 网点名称
   anz = str(addr[4])  # 安装地址
   anz_type = str(addr[5]) # 安装类型
   add1 = province + city + wd
   add2 = province + city + anz
   if akn < len(AK): # AK配额还没用完时
    n += 1
    aknd = AK[akn] # 第akn个秘钥是aknd
    ak = r'&output=json&ak=' + aknd
    address1 = r'address=' + add1
    tar_url = url_geocode + address1 + ak + cod # 最终url网址
    response = requests.get(url=tar_url) # 请求网址响应
    soup = BeautifulSoup(response.content, 'html.parser') # 解析网页内容
    response.close() # 获取内容后关闭网页(防止被远程主机认定为攻击行为)
    dictinfo = json.loads(str(soup)) # json数据转dict数据
    status = dictinfo['status']
    print(status)
    if status == 0: # status状态码为0表示服务器响应成功,本次循环爬取数据成功
     lng1 = round(dictinfo['result']['location']['lng'], 8) # 经度保留8位数
     lat1 = round(dictinfo['result']['location']['lat'], 8) # 纬度保留8位数
     precise1 = dictinfo['result']['precise'] # 1为精准打点,可靠性高;0为模糊打点,准确性低
     confidence1 = dictinfo['result']['confidence'] # 可信度,描述打点准确度,大于80表示误差小于100m
     geocode1 = str(precise1) + ' ' + str(confidence1) + ' ' + str(lat1) + ' ' + str(lng1) + ' ' + add1
    elif status == 302 or status == 210: # 302 配额超限,限制访问;210 IP验证未通过,则使用下一个Ak
     akn += 1
     lat1 = 'break'
     lng1 = 'break'
     precise1 = 0
     confidence1 = 0
     geocode1 = '0 0 break break ' + add1
    else:
     lat1 = 'na'
     lng1 = 'na'
     precise1 = 0
     confidence1 = 0
     geocode1 = '0 0 na na ' + add1
    address2 = r'address=' + add2
    tar_url2 = url_geocode + address2 + ak + cod # 总的url
    response2 = requests.get(url=tar_url2) # 请求网址响应
    soup2 = BeautifulSoup(response2.content, 'html.parser') # 解析内容
    response2.close() # 获取内容后关闭网页(防止被远程主机认定为攻击行为)
    dictinfo2 = json.loads(str(soup2)) # json转dict
    status2 = dictinfo2['status']
    print(status2)
    if status2 == 0:
     lng2 = round(dictinfo2['result']['location']['lng'], 8) # 经度保留8位数
     lat2 = round(dictinfo2['result']['location']['lat'], 8) # 纬度保留8位数
     precise2 = dictinfo2['result']['precise'] # 1为精准打点,可靠性高;0为模糊打点,准确性低
     confidence2 = dictinfo2['result']['confidence'] # 可信度,描述打点准确度,大于80表示误差小于100m
     geocode2 = str(precise2) + ' ' + str(confidence2) + ' ' + str(lat2) + ' ' + str(lng2) + ' ' + add2
    elif status2 == 302 or status2 == 210: # 配额超限,限制访问;IP验证未通过
     akn += 1
     precise2 = 0
     confidence2 = 0
     lat2 = 'break'
     lng2 = 'break'
     geocode2 = '0 0 break break ' + add2
    else:
     lat2 = 'na'
     lng2 = 'na'
     precise2 = 0
     confidence2 = 0
     geocode2 = '0 0 na na ' + add2
    if anz_type == '在行':
     if precise1 == 1:
      geocode3 = str(precise1) + ' ' + str(confidence1) + ' ' + str(lat1) + ' ' + str(lng1) + ' ' + anz_type + ' 网点'
     elif precise1 == 0 and precise2 == 0:
      geocode3 = str(precise1) + ' ' + str(confidence1) + ' ' + str(lat1) + ' ' + str(lng1) + ' ' + anz_type + ' 网点'
     else:
      geocode3 = str(precise2) + ' ' + str(confidence2) + ' ' + str(lat2) + ' ' + str(lng2) + ' ' + anz_type + ' 安装地址'
    else:
     geocode3 = str(precise2) + ' ' + str(confidence2) + ' ' + str(lat2) + ' ' + str(lng2) + ' ' + anz_type + ' 安装地址'
    geocode = mac + ' ' + geocode1 + ' ' + geocode2 + ' ' + geocode3
    with open(new_path, 'a', encoding='utf-8') as f:
     f.write(geocode)
     f.write('\n')
     f.close()
    print('good' + str(n))
   else:
    print('配额不足!')
    break # 配额不足中断整个循环
  print('已完成')
 except: # 发生错误时执行以下代码块
  print('未知错误')
  time.sleep(5)
  with open(new_path, 'a', encoding='utf-8') as f:
   f.write('未知错误')
   f.write('\n')
   f.close()
  continue # 发生未知错误跳过该次循环
 print('程序已停止')
 break

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 文件读写操作实例详解
Mar 12 Python
Python正则表达式的使用范例详解
Aug 08 Python
python获取当前日期和时间的方法
Apr 30 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
May 16 Python
Python简单的制作图片验证码实例
May 31 Python
python实现音乐下载器
Apr 15 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
Python 创建TCP服务器的方法
Jul 28 Python
pycharm 2020 1.1的安装流程
Sep 29 Python
Python实现钉钉/企业微信自动打卡的示例代码
Feb 02 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
Python3 关于pycharm自动导入包快捷设置的方法
Jan 16 #Python
在Pycharm中自动添加时间日期作者等信息的方法
Jan 16 #Python
解析Python的缩进规则的使用
Jan 16 #Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 #Python
浅谈python3.x pool.map()方法的实质
Jan 16 #Python
在Pycharm terminal中字体大小设置的方法
Jan 16 #Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 #Python
You might like
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
Javascript中Event属性搜集整理
2013/09/17 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
python+selenium+autoit实现文件上传功能
2017/08/23 Python
Flask之请求钩子的实现
2018/12/23 Python
python实现的自动发送消息功能详解
2019/08/15 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
2020/01/02 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
CSS3中的@keyframes关键帧动画的选择器绑定
2016/06/13 HTML / CSS
HTML5 history新特性pushState、replaceState及两者的区别
2015/12/26 HTML / CSS
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
出纳岗位职责
2013/11/09 职场文书
文明风采获奖感言
2014/02/18 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
考试诚信承诺书
2014/05/23 职场文书
工伤事故证明
2014/10/20 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python