用python找出那些被“标记”的照片

发表于 5年以前  | 总阅读数:1224 次

源码传送门

环境准备

下面的两个第三方模块都可以直接通过pip快速安装,这里使用py36作为运行环境。

思路

  1. 遍历目录
  2. 拉取数据集合
  3. 遍历集合取得exif
  4. exif信息整理,并获取实体地址
  5. 拷贝文件到结果样本目录
  6. 生成json报告文件

基础知识

下面是现今相片中会存在与GPS相关的关键字,大牛亦可一比带过~ [参考]


    {
     "GPSVersionID": "GPS版本",
     "GPSLatitudeRef": "南北纬",
     "GPSLatitude": "纬度",
     "GPSLongitudeRef": "东西经",
     "GPSLongitude": "经度",
     "GPSAltitudeRef": "海拔参照值",
     "GPSAltitude": "海拔",
     "GPSTimeStamp": "GPS时间戳",
     "GPSSatellites": "测量的卫星",
     "GPSStatus": "接收器状态",
     "GPSMeasureMode": "测量模式",
     "GPSDOP": "测量精度",
     "GPSSpeedRef": "速度单位",
     "GPSSpeed": "GPS接收器速度",
     "GPSTrackRef": "移动方位参照",
     "GPSTrack": "移动方位",
     "GPSImgDirectionRef": "图像方位参照",
     "GPSImgDirection": "图像方位",
     "GPSMapDatum": "地理测量资料",
     "GPSDestLatitudeRef": "目标纬度参照",
     "GPSDestLatitude": "目标纬度",
     "GPSDestLongitudeRef": "目标经度参照",
     "GPSDestLongitude": "目标经度",
     "GPSDestBearingRef": "目标方位参照",
     "GPSDestBearing": "目标方位",
     "GPSDestDistanceRef": "目标距离参照",
     "GPSDestDistance": "目标距离",
     "GPSProcessingMethod": "GPS处理方法名",
     "GPSAreaInformation": "GPS区功能变数名",
     "GPSDateStamp": "GPS日期",
     "GPSDifferential": "GPS修正"
    }

初始化

考虑到exifread的模块中有大量的logging输出,这里将它的level级别调到最高。 然后下边的KEY是某站在高德地图API的时候遗留下来的 我也很尴尬。。就当福利了


    import os
    import time
    import json
    import random
    import logging
    import requests
    import exifread
    logging.basicConfig(level=logging.CRITICAL)
    KEY = "169d2dd7829fe45690fabec812d05bc3"

主逻辑函数


    def main():
     # 预设后缀列表
     types = ["bmp", "jpg", "tiff", "gif", "png"]
     #结果数据集合
     picex = []
     # 文件存储路径
     saves = "$" + input("| SavePath: ").strip()
     # 文件搜索路径 并遍历所有文件返回文件路径列表
     pools = jpgwalk(input("| FindPath: "), types)
     #存储目录
     savep = "%s/%s" % (os.getcwd().replace("\\", "/"), saves)
     if savep in pools:
     pools.remove(savep)
     # 遍历数据集并获取exif信息
     for path in pools:
     res = getEXIF(path)
     if res:
      picex.append(res)
     # 结果报告
     print("| Result %s" % len(picex))
     # 如果存在结果 保存结果到json并讲相关图片复制到该目录下
     if picex:
     #创建目录
     if not os.path.exists(saves):
      os.mkdir(saves)
     #生成一个4格缩进的json文件 
     with open("%s/%s.json" % (saves, saves), "wb") as f:
      f.write(json.dumps(picex, ensure_ascii=False, indent=4).encode("utf8"))
     #copy图像到该目录
     for item in picex:
      source_path = item["Filename"]
      with open("%s/%s" % (saves, source_path.split("/")[-1]), "wb") as f_in:
      with open(source_path, "rb") as f_out:
       f_in.write(f_out.read())

遍历方法

遍历指定及其所有下级目录,并返回全部的图片的路径集合,这里要注意的是每次扫描后的拷贝行为都会生成缓存,所以通过指定 $ 来避开。


    # 获取指导目录全部的图片路径
    def jpgwalk(path, types):
     _start = time.time()
     _pools = []
     # 遍历该目录 并判断files后缀 如符合规则则拼接路径
     for _root, _dirs, _files in os.walk(path):
     _pools.extend([_root.replace("\\", "/") + "/" +
       _item for _item in _files if _item.split(".")[-1].lower() in types and "$" not in _root])
     #报告消耗时间
     print("| Find %s \n| Time %.3fs" % (len(_pools), time.time() - _start))
     return _pools

经纬度格式化

度分秒转浮点,方便api调用查询,因为存在一些诡异的数据比如 1/0,所以默认返回0


    def cg(i):
     try:
     _ii = [float(eval(x)) for x in i[1:][:-1].split(', ')]
     _res = _ii[0] + _ii[1] / 60 + _ii[2] / 3600
     return _res
     except ZeroDivisionError:
     return 0

EXIF信息整理

考虑到大部分的设备还未开始支持朝向、速度、测量依据等关键字,这里暂时只使用比较常见的,如有需要的朋友可以自行添加。毕竟得到的信息越多对社工有更大的帮助。


    def getEXIF(filepath):
     #基础关键字
     _showlist = [
     'GPS GPSDOP',
     'GPS GPSMeasureMode',
     'GPS GPSAltitudeRef',
     'GPS GPSAltitude',
     'Image Software',
     'Image Model',
     'Image Make'
     ]
     #GPS关键字
     _XYlist = ["GPS GPSLatitude", "GPS GPSLongitude"]
     #时间关键字
     _TimeList = ["EXIF DateTimeOrigina", "Image DateTime", "GPS GPSDate"]
     #初始化结果字典
     _infos = {
     'Filename': filepath
     }
     with open(filepath, "rb") as _files:
     _tags = None
     # 尝试去的EXIF信息
     try:
      _tags = exifread.process_file(_files)
     except KeyError:
      return
     # 判断是否存在地理位置信息
     _tagkeys = _tags.keys()
     if _tags and len(set(_tagkeys) & set(_XYlist)) == 2 and cg(str(_tags["GPS GPSLongitude"])) != 0.0:
      for _item in sorted(_tagkeys):
      if _item in _showlist:
       _infos[_item.split()[-1]] = str(_tags[_item]).strip()
      # 经纬度取值
      _infos["GPS"] = (cg(str(_tags["GPS GPSLatitude"])) * float(1.0 if str(_tags.get("GPS GPSLatitudeRef", "N")) == "N" else -1.0),
        cg(str(_tags["GPS GPSLongitude"])) * float(1.0 if str(_tags.get("GPS GPSLongitudeRef", "E")) == "E" else -1.0))
      # 获取实体地址
      _infos["address"] = address(_infos["GPS"])
      # 获取照片海拔高度
      if "GPS GPSAltitudeRef" in _tagkeys:
      try:
       _infos["GPSAltitude"] = eval(_infos["GPSAltitude"])
      except ZeroDivisionError:
       _infos["GPSAltitude"] = 0
      _infos["GPSAltitude"] = "距%s%.2f米" % ("地面" if int(
       _infos["GPSAltitudeRef"]) == 1 else "海平面", _infos["GPSAltitude"])
      del _infos["GPSAltitudeRef"]
      # 获取可用时间
      _timeitem = list(set(_TimeList) & set(_tagkeys))
      if _timeitem:
      _infos["Dates"] = str(_tags[_timeitem[0]])
      return _infos

地址转换

一个简单的爬虫,调用高德地图api进行坐标转换,考虑到原本是跨域,这里添加基础的反防爬代码。这里有个小细节,海外的一律都取不到(包括台湾),可以通过更换googlemap的api来实现全球查询。


    def address(gps):
     global KEY
     try:
     # 随机UA
     _ulist = [
      "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
      "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0",
      "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; 360SE)",
      "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
      "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
      "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)",
      "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
      "Mozilla/5.0 (X11; U; Linux i686; rv:1.7.3) Gecko/20040913 Firefox/0.10",
      "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; ja) Presto/2.10.289 Version/12.00",
      "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"
     ]
     # 伪造header
     _header = {
      "User-Agent": random.choice(_ulist),
      "Accept": "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01",
      "Accept-Encoding": "gzip, deflate, sdch",
      "Accept-Language": "zh-CN,zh;q=0.8",
      "Referer": "http://www.gpsspg.com",
     }
     _res = requests.get(
      "http://restapi.amap.com/v3/geocode/regeo?key={2}&s;=rsv3&location;={1},{0}&platform;=JS&logversion;=2.0&sdkversion;=1.3&appname;=http%3A%2F%2Fwww.gpsspg.com%2Fiframe%2Fmaps%2Famap_161128.htm%3Fmapi%3D3&csid;=945C5A2C-E67F-4362-B881-9608D9BC9913".format(gps[0], gps[1], KEY), headers=_header, timeout=(5, 5))
     _json = _res.json()
     # 判断是否取得数据
     if _json and _json["status"] == "1" and _json["info"] == "OK":
      # 返回对应地址
      return _json.get("regeocode").get("formatted_address")
     except Exception as e:
     pass

实例

运行该代码 然后输入保存文件夹名和扫描位置即可

这边可以看到8019张中有396张存在有效的地理位置,打码的地方就不解释了,各位老司机~后期打算加入图像识别,和相似度识别。

下面给大家分享小编收集整理的python专题知识:

python基本语法

python多线程学习教程

python排序算法大全

以上所述是小编给大家介绍的用python找出那些被"标记"的照片,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237270次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8108次阅读
 目录