一.主要思路:

(1).从对应网页中找到"所有的图片标签",

通过url得到对应的html内容。之后通过

BeautifulSoup将其解析成一棵html元素树。

查找所有的"图片标签"

(2).下载图片

通过得到的标签提取出SRC,得到图片地址,下载图片。

(3).提取元信息exif

将图片通过相应的库实现exif信息的提取,对exif进行遍历,存储到字典变量中。

其中要判断是否存在exif信息(有些不能提取),是否存在GPSInfo信息(有些压缩时

该信息失去,或本来就没有),若是不符合的,删除该图片。

(4).删除图片

利用os的remove功能。只要有对应目录。就可以实现删除。

事实上可以利用os模块实现windows和linux的许多自动化工作。

3.使用模块和方法汇总

urlparse模块

该模块定义了一个标准接口,用于在组件中解析统一资源定位符(URL)字符串(寻址方案,网络位置,路径等),将组件组合回URL字符串,并将“相对URL”转换为 绝对URL给出“基本URL”。

urlsplit函数类似于urlparse

将URL解析为六个组件,返回一个6元组。 这对应于URL的一般结构:scheme:// netloc / path; parameters?query#fragment。 每个元组项都是一个字符串,可能是空的。 组件不会以较小的部分分解(例如,网络位置是单个字符串),并且不会展开%escapes。 如上所示的分隔符不是结果的一部分,除了路径组件中的前导斜杠,如果存在则保留。

os.path.basename(path)

Return the base name of pathname path. where basename for '/foo/bar/' returns 'bar', the basename() function returns an empty string ('').

Beautiful Soup

是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.

官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

PIL库官方文档,通常用作图片处理,本程序中用到Image_getexif()方法提取exif,但仅能对jpg和jpeg图片作处理

且不能识别大小写后缀

http://effbot.org/imagingbook/

ExifTags.TAGS(TagName = TAGS.get(tag,tag))

is a dictionary. As such, you can get the value for a given key by using TAGS.get(key). If that key does not exist, you can have it return to you a default value by passing in a second argument TAGS.get(key, val)

Source: http://www.tutorialspoint.com/python/dictionary_get.htm

pip install exifread,本程序中处理png图片的exif信息,利用了

exifread.process_file(imageFile) 方法

通过tags = exifread.process_file(fd) 这个函数读取了图片的exif信息,其下为exif格式

{'Image ImageLength': (0x0101) Short=3024 @ 42,

......

'Image GPSInfo': (0x8825) Long=792 @ 114,

'Thumbnail JPEGInterchangeFormat': (0x0201) Long=928 @ 808,

......

}

4.错误与解决方案

'str' object has no attribute 'read'

事实上是参数本身为一字符串,而参数要求是一个二进制文件,

这是传参是仅仅传了一个文件名字(通过名字打开文件),而非一个文件

'PngImageFile' object has no attribute '_getexif'

该错误是因为_getexif不能提取.png文件

解决方法:

可以使用exifread模块读取,但该模块仅仅可以读取.png文件

依旧有其他BUG存在,尚未解决,但不影响基本使用,不得不说,

原作者写的该部分代码实在是烂,对于现今的网站根本无法使用

5.总结与思考

(1).最终结果依旧没有跑出exif信息,可能是有的加密,或者

部分图片本身未存储exif信息。

(2).有的图片本身格式有gif,JPG,svg等,并没有对此进行严格的过滤。

(3).有的网站本身有反爬机制,不能进行图片的爬取,你如www.qq.com

二.代码

#!/usr/bin/python

# coding: utf-8

import os

import exifread

import urllib2

import optparse

from urlparse import urlsplit

from os.path import basename

from bs4 import BeautifulSoup

from PIL import Image

from PIL.ExifTags import TAGS

def findImages(url): #找到该网页的所有图片标签

print '[+] Finding images of '+str(urlsplit(url)[1])

resp = urllib2.urlopen(url).read()

soup = BeautifulSoup(resp,"lxml")

imgTags = soup.findAll('img')

return imgTags

def downloadImage(imgTag): #根据标签从该网页下载图片

try:

print '[+] Downloading image...'

imgSrc = imgTag['src']

imgContent = urllib2.urlopen(imgSrc).read()

imgName = basename(urlsplit(imgSrc)[2])

f = open(imgName,'wb')

f.write(imgContent)

f.close()

return imgName

except:

return ''

def delFile(imgName): #删除该目录下下载的文件

os.remove('/mnt/hgfs/temp/temp/python/exercise/'+str(imgName))

print "[+] Del File"

def exifImage(imageName): #提取exif信息,若无则删除

if imageName.split('.')[-1] == 'png':

imageFile = open(imageName,'rb')

Info = exifread.process_file(imageFile)

elif imageName.split('.')[-1] == 'jpg' or imageName.split('.')[-1] == 'jpeg':

imageFile = Image.open(imageName)

Info = imageFile._getexif()

else:

pass

try:

exifData = {}

if Info:

for (tag,value) in Info:

TagName = TAGS.get(tag,tag)

exifData[TagName] = value

exifGPS = exifData['GPSInfo']

if exifGPS:

print '[+] GPS: '+str(exifGPS)

else:

print '[-] No GPS information'

delFile(imageName)

else:

print '[-] Can\'t detecated exif'

delFile(imageName)

except Exception, e:

print e

delFile(imageName)

pass

def main():

parser = optparse.OptionParser('-u ')

parser.add_option('-u',dest='url',type='string',help='specify the target url')

(options,args) = parser.parse_args()

url = options.url

if url == None:

print parser.usage

exit(0)

imgTags = findImages(url)

for imgTag in imgTags:

imgFile = downloadImage(imgTag)

exifImage(imgFile)

if __name__ == '__main__':

main()

python读取图片信息_笔记整理4——python实现提取图片exif信息相关推荐

  1. python学习图解_大牛整理!Python学习方法和学习路线,看完茅塞顿开!

    原标题:大牛整理!Python学习方法和学习路线,看完茅塞顿开! Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团 ...

  2. python读取水印_阿里水印的Python实现

    阿里巴巴公司通过截图,根据肉眼无法识别的标识码追踪到泄露信息的具体员工-- 阿里月饼事件中的新闻中提到"泄露内部信息丢了工作,因为截图上「看不见的水印」".那么该技术(简称&quo ...

  3. python无法打印unicode编码_【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码...

    [背景] Python中的字符编码,其实的确有点复杂. 再加上,不同的开发环境和工具中,显示的逻辑和效果又不太相同,尤其是,中文的,初级用户,最常遇到的: (1)在Python自带的IDE:IDLE中 ...

  4. (Python入门)学习笔记二,Python学习路线图

    (Python入门)学习笔记二,Python学习路线图 千里之行始于足下,谋定而后动,冰冻三尺非一日之寒.之所以说这三句话,就是对于下面整理的路线图,即不让自己感觉路途的遥远而感到达到巅峰神界的遥遥无 ...

  5. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  6. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

  7. Python读取xlsx表格并转换成Python列表

    Python读取xlsx表格并转换成Python列表 参考链接https://www.cnblogs.com/ilovepython/p/11068841.html import xlrd from ...

  8. 隐藏表白技能,python教你如何使用图片exif信息隐藏表白,教你如何修改,查询exif信息。

    " 隐藏表白技能" 你有想过一张图片所包含的信息吗?你有想过一张图片可以为你隐藏表达一些内容吗?你有想过图片的隐藏信息可以为你表达你想要说明的东西吗?以及你可以 用图片去表达你的爱 ...

  9. python图片解析库_python用来获得图片exif信息的库实例分析

    本文实例讲述了python用来获得图片exif信息的库用法.分享给大家供大家参考.具体分析如下: exif-py是一个纯python实现的获取图片元数据的python库,官方下载地址: http:// ...

  10. java exif 怎么获取属性_Java如何读取图片EXIF信息

    Java如何读取图片EXIF信息 大家知道Java如何读取图片属性信息吗?下面小编为大家整理了Java读取图片EXIF信息的方法,希望能帮到大家! 首先介绍一下什么是EXIF,EXIF是Exchang ...

最新文章

  1. 简单ThreadPool实现
  2. python3 串行并列实际应用
  3. .NET 部署-03Web Deployment项目-05自定义Web Deployment项目
  4. 直播预告 | 旷视研究院王毅:用于条件图像生成的注意力归一化
  5. [PAMI2013] Guided Image Filtering 导向滤波器以及OpenCV-Python代码实现
  6. Hibernate提高性能的几点建议
  7. 基础的python程序_Python程序入门
  8. Perforce使用指南_forP4V
  9. cmd切换为administrator用户
  10. 拓端tecdat|Python信贷风控模型:梯度提升Adaboost,XGBoost,SGD, GBOOST, SVC,随机森林, KNN预测金融信贷违约支付和模型优化
  11. android qq纯净输入法,QQ输入法纯净版更新 同步手机词库
  12. Java 输入输出流学习总结
  13. centOs安装 ruby环境
  14. C++简介 C语言编程原理
  15. 法猿生存计划-在大选前,该公司希望做一些事情:分类
  16. 数据建模中的二维表和一维表!
  17. 2022帆软杯全国高校数据分析与应用联赛来啦!
  18. 圣诞老人的礼物_圣诞节设计资源:圣诞老人
  19. Hbase2.4.9学习
  20. 易语言多线程多参数自定义封装

热门文章

  1. 亲测美团打车聚合服务:要做出行服务的天猫?
  2. win10运行安装软件程序提示“为了对电脑进行保护,已经阻止此应用” 有效解决方法记录
  3. Ubuntu 16.04安装搜狗拼音
  4. 获取163邮箱的邮件 并下载附件
  5. Veu进阶--transition动画和animation动画的使用详解
  6. Win10应用商店和UWP应用无法连接网络解决方法
  7. java 合并pdf_用iText分割和合并pdf文件
  8. # Itext Pdf 合并拆分
  9. [深度学习论文笔记]3D AGSE-VNet: An Automatic Brain Tumor MRI Data Segmentation Framework
  10. Beautifulsoup提取特定丁香园帖子回复