python-爬取地理坐标

时间:2022-07-25
本文章向大家介绍python-爬取地理坐标,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

爬取地理坐标

概述

目标网址:百度地图 使用到的技术其实是百度地图提供的开发者工具,没有暴力的东西,总体来说比较规范,唯一感觉到奇怪的是,在我进行调用接口的时候,我电脑的网老是断开,感觉好像是被所里的防火墙给整了,但是感觉不应该啊,这也不是违规操作。

流程

  1. 申请百度账号 此部分略略略
  2. 申请成为百度开发者 略略略
  3. 获得百度秘钥 进入开发者控制台,选择应用管理,建立应用,应用名称随便取一个,类型根据需要来进行,我这里选择的是服务器类型,下面的服务看着来,最主要的是地理编码和逆地理编码

再往下为校验方式的选择,一开始我选择的是ip白名单,后来想想我要是换个ip不就不行了吗?所以采用了sn校验方法。

在这一步需要记住的是你的开发者ak和sk。代码部分我去掉了这个秘钥 4. 进行请求

请求的话围绕着这个网址进行 下一步爬虫需要更改的是

  • address部分
  • ak部分
  • GET请求部分,为sn

http://api.map.baidu.com/geocoding/v3/?address=北京市海淀区上地十街10号&output=json&ak=您的ak&callback=showLocation //GET请求

注意:当前为V3.0版本接口文档,V2.0及以前版本自2019.6.18起新用户无法使用。老用户仍可继续使用V2.0及以前版本请求实现逆地理编码服务,为保障用户体验,建议您尽快迁移到V3.0版本。

代码部分

# -*- coding: utf-8 -*- 
import urllib.request, urllib.parse, urllib.error
import json
import hashlib
import csv

# 输出格式为json
output = 'json'
# 开发者平台获取的ak
ak = '*****************'
#开发者平台获取的sk
sk='******************'
# 目标地理位置,这里可以外部导入
a=['北京','首都医科大学','天坛医院','天通苑','德州','杭州','上海','北京大学','天津']
# 打开保存位置
csv_obj = open('./python/爬取地理坐标/data.csv', 'w',newline='', encoding="utf-8")
#写入title
csv.writer(csv_obj).writerow(["位置","lng","lat"])
# 进行爬取
for i in a:
    queryStr = '/geocoding/v3/?address={}&output=json&ak={}'.format(i,ak)
    #进行转码,safe为不转码的部分
    encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
    # 添加sk
    rawStr = encodedStr + sk
    # 算sn值,用于调用百度接口
    # 这里可以参看官方文档
    sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
    # 拼接url
    url = urllib.parse.quote("http://api.map.baidu.com" + queryStr + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
    # 目标请求
    req = urllib.request.urlopen(url)
    # 进行解码
    res = req.read().decode()
    # json转换为字典
    temp = json.loads(res)
    # 提取经度和纬度
    lng,lat=temp['result']['location']['lng'],temp['result']['location']['lat']
    # 写入csv文件
    csv.writer(csv_obj).writerow([i,lng,lat])
# 关闭csv文件
csv_obj.close()

结果

小范围运行没有出现问题,后续准备进行大样本的计算。 百度爸爸真好。不然得一个个输地点

结束语

关于更新,现在做不到日更了,只能随缘更新

love&peace