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

在这里插入图片描述
太棒了! 现在可以轻松地拿到地址了!

好啦~ 以后想要看看某人在哪里拍的照片 放在这个代码中,就可以轻松地查看了咯~

  • 15
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aa.1735803

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值