python第三方庫之exifread庫使用

你可能不知道

只需要一張圖片 就能知道你的具體位置 是不是特別強大?

進入正題:

使用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))


注意幾點:

  1. 網站搜索是ajax請求 需要通過抓包獲得到查找經緯度的接口
  2. 這個接口的是使用get請求發送的,降低的難度。不過有一點挺坑的

網站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 字 符 串!!!

在這裏插入圖片描述
太棒了! 現在可以輕鬆地拿到地址了!

好啦~ 以後想要看看某人在哪裏拍的照片 放在這個代碼中,就可以輕鬆地查看了咯~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章