你可能不知道
只需要一張圖片 就能知道你的具體位置 是不是特別強大?
進入正題:
使用Python exifread 庫就能夠輕鬆的實現圖片的定位
安裝這個庫
pip install exifread
介紹這個庫的基本使用方法:
· 主要是 exifread.process_file() 這個方法
可以看到 需要我們傳入一個文件對象
返回的是一個包含圖片信息的字典。我們需要的信息也在這個字典中
我們可以獲得到圖片的緯度值
lat = tags.get('GPS GPSLatitudeRef', '0')
打印lat
print(lat)
## 返回[26, 5, 10243/2000]
查看lat的類型
type(lat)
## 返回 <class 'exifread.classes.IfdTag'>
這個對象有一個方法可以獲得到值
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格式
注意列表中的每一個元素 是 <class 'exifread.utils.Ratio'>
由於最後一個是 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))
注意幾點:
- 網站搜索是ajax請求 需要通過抓包獲得到查找經緯度的接口
- 這個接口的是使用get請求發送的,降低的難度。不過有一點挺坑的
#使用requests庫進行抓取的時候 返回的並不是json字符串,
#當然你可以使用正則來解決獲取地址的問題,但是會比較麻煩一些
可以看出返回的並不是json字符串
學過爬蟲的會發現 有些信息可以從url中體現出來,url中的參數callback就是返回信息的前綴,我們把callback刪了是不是能夠得到完整的json字符串呢?
what a pity! 這個網站加了反爬技術~ 去掉這個回調函數 是返回不了信息的。
but 我發現了這個參數 output = jsonp 爲啥是jsonp 而不是json呢??
帶着探究精神,我將p給去掉了~ 結果令我驚奇的是 它 返 回 了 json 字 符 串!!!
太棒了! 現在可以輕鬆地拿到地址了!
好啦~ 以後想要看看某人在哪裏拍的照片 放在這個代碼中,就可以輕鬆地查看了咯~