目标网址:百度地图 使用到的技术其实是百度地图提供的开发者工具,没有暴力的东西,总体来说比较规范,唯一感觉到奇怪的是,在我进行调用接口的时候,我电脑的网老是断开,感觉好像是被所里的防火墙给整了,但是感觉不应该啊,这也不是违规操作。
再往下为校验方式的选择,一开始我选择的是ip白名单,后来想想我要是换个ip不就不行了吗?所以采用了sn校验方法。
在这一步需要记住的是你的开发者ak和sk。代码部分我去掉了这个秘钥 4. 进行请求
请求的话围绕着这个网址进行 下一步爬虫需要更改的是
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