你可能不知道
只需要一张图片 就能知道你的具体位置 是不是特别强大?
进入正题:
使用Python exifread 库就能够轻松的实现图片的定位
安装这个库
pip install exifread
· 主要是 exifread.process_file() 这个方法
可以看到 需要我们传入一个文件对象
返回的是一个包含图片信息的字典。我们需要的信息也在这个字典中
我们可以获得到图片的纬度值
lat = tags.get('GPS GPSLatitudeRef', '0')
打印lat
print(lat)
## 返回[26, 5, 10243/2000]
查看lat的类型
type(lat)
## 返回
这个对象有一个方法可以获得到值
lat_values = lat.values
# 返回 [26, 5, 10243/2000] 这是一个列表表示纬度 26°5'5.125"
好啦~ 简单地介绍了一下 这个库的使用,现在要开始实战了~
我们可以通过这个库获得到经纬度,这样虽然说可以粗略地看出是在哪一块。并不能看到具体的位置信息,如果想看到位置信息,那么第一种方法可以百度查找经纬度,这是一种麻烦的方法。
作为 程序员 当然要通过代码来实现啦~
这里我给出我的思路。 可以通过爬虫来完成~
贴出代码~
def process_img(path):
'''
这个函数用来处理图片 并返回图片的 经纬度、拍摄时间信息
:return: 返回图片信息 是一个字典
'''
f = open(path, 'rb')
tags = exifread.process_file(f)
info = {
# 注意 这里获得到的是值 需要使用 values方法
'Image DateTime(拍摄时间)': tags.get('Image DateTime', '0').values,
'GPS GPSLatitudeRef(纬度标志)': tags.get('GPS GPSLatitudeRef', '0').values,
'GPS GPSLatitude(纬度)': tags.get('GPS GPSLatitude', '0').values,
'GPS GPSLongitudeRef(经度标志)': tags.get('GPS GPSLongitudeRef', '0').values,
'GPS GPSLongitude(经度)': tags.get('GPS GPSLongitude', '0').values
}
return info
def get_info(lat, lng):
'''
注意 网站的经纬度接口格式是 h.mmsssssss
:param lat: 纬度
:param lng: 经度
:return: 返回地址信息
'''
url = r'http://www.gpsspg.com/apis/maps/geo/?output=json&lat={}&lng={}&type=0' \
r'&callback=jQuery110209178036150146593_1559380618496&_=1559380618502'.format(lat, lng)
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
'Referer': 'http://www.gpsspg.com/iframe/maps/baidu_181109.htm?mapi=1',
'Host': 'www.gpsspg.com',
}
r = requests.get(url, headers=headers)
# 返回的是一个json字符串文本 使用 r.json()方法 转化为python字典
info = r.json()
# 使用jsonpath 查找地址信息
address = jsonpath.jsonpath(info, '$..address')[0]
return address
def process_num(x):
'''
处理经纬度 将其转化为 xx.xxxxxx格式
注意列表中的每一个元素 是
由于最后一个是 10243/2000 这样的格式 需要手动将其处理 其余的使用 .num 方法就能获得到值
:param x: 传入的经度和纬度
:return: 处理好了经纬度
'''
# 处理列表中最后一个元素
x_last = eval(str(x[-1]))
# 转化
new_x = x[0].num + x[1].num / 60 + x_last / 3600
return '{:.13f}'.format(new_x)
def main():
img_path = r'./1.jpg'
info_dict = process_img(img_path)
lat = info_dict.get('GPS GPSLatitude(纬度)')
lng = info_dict.get('GPS GPSLongitude(经度)')
address = get_info(lat=process_num(lat), lng=process_num(lng))
print('拍摄时间: {},GPS位置:纬度{}{},经度{}{}'.format(info_dict.get('Image DateTime(拍摄时间)'),
info_dict.get('GPS GPSLatitudeRef(纬度标志)'),
process_num(lat),
info_dict.get('GPS GPSLongitudeRef(经度标志)'),
process_num(lng),
))
print('具体位置: {}'.format(address))
注意几点:
网站url = http://www.gpsspg.com/apis/maps/geo/?output=jsonp&lat=38.6518000000&lng=104.0764200000&type=0&callback=jQuery110205709999759059754_1559386137849&_=1559386137850
#使用requests库进行抓取的时候 返回的并不是json字符串,
#当然你可以使用正则来解决获取地址的问题,但是会比较麻烦一些
可以看出返回的并不是json字符串
学过爬虫的会发现 有些信息可以从url中体现出来,url中的参数callback就是返回信息的前缀,我们把callback删了是不是能够得到完整的json字符串呢?
what a pity! 这个网站加了反爬技术~ 去掉这个回调函数 是返回不了信息的。
but 我发现了这个参数 output = jsonp 为啥是jsonp 而不是json呢??
带着探究精神,我将p给去掉了~ 结果令我惊奇的是 它 返 回 了 json 字 符 串!!!
好啦~ 以后想要看看某人在哪里拍的照片 放在这个代码中,就可以轻松地查看了咯~