python抓取网页中图片并保存到本地

在上篇文章给大家分享PHP源码批量抓取远程网页图片并保存到本地的实现方法,感兴趣的朋友可以点击了解详情。

#-*-coding:utf-8-*-
import os
import uuid
import urllib2
import cookielib
'''获取文件后缀名'''
def get_file_extension(file):
  return os.path.splitext(file)[1]
'''創建文件目录,并返回该目录'''
def mkdir(path):
  # 去除左右两边的空格
  path=path.strip()
  # 去除尾部 \符号
  path=path.rstrip("\\")
  if not os.path.exists(path):
    os.makedirs(path)
  return path
'''自动生成一个唯一的字符串,固定长度为36'''
def unique_str():
  return str(uuid.uuid1())
'''
抓取网页文件内容,保存到内存
@url 欲抓取文件 ,path+filename
'''
def get_file(url):
  try:
    cj=cookielib.LWPCookieJar()
    opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    urllib2.install_opener(opener)
    req=urllib2.Request(url)
    operate=opener.open(req)
    data=operate.read()
    return data
  except BaseException, e:
    print e
    return None
'''
保存文件到本地
@path 本地路径
@file_name 文件名
@data 文件内容
'''
def save_file(path, file_name, data):
  if data == None:
    return
  mkdir(path)
  if(not path.endswith("/")):
    path=path+"/"
  file=open(path+file_name, "wb")
  file.write(data)
  file.flush()
  file.close()
#获取文件后缀名
print get_file_extension("123.jpg");
#創建文件目录,并返回该目录
#print mkdir("d:/ljq")
#自动生成一个唯一的字符串,固定长度为36
print unique_str()
url="http://qlogo1.store.qq.com/qzone/416501600/416501600/100?0";
save_file("d:/ljq/", "123.jpg", get_file(url))

通过Python抓取指定Url中的图片保存至本地

# *** encoding: utf-8 ***
__author__='jiangyt'
"""
fetch images from specific url
v1.0
"""
import urllib, httplib, urlparse
import re
import random
"""judge url exists or not"""
def httpExists(url):
  host, path = urlparse.urlsplit(url)[1:3]
  if ':' in host:
    # port specified, try to use it
    host, port = host.split(':', 1)
    try:
      port = int(port)
    except ValueError:
      print 'invalid port number %r' % (port,)
      return False
  else:
    # no port specified, use default port
    port = None
  try:
    connection = httplib.HTTPConnection(host, port=port)
    connection.request("HEAD", path)
    resp = connection.getresponse( )
    if resp.status == 200: # normal 'found' status
      found = True
    elif resp.status == 302: # recurse on temporary redirect
      found = httpExists(urlparse.urljoin(url,resp.getheader('location', '')))
    else: # everything else -> not found
      print "Status %d %s : %s" % (resp.status, resp.reason, url)
      found = False
  except Exception, e:
    print e.__class__, e, url
    found = False
  return found
"""get html src,return lines[]"""
def gGetHtmlLines(url):
  if url==None : return
  if not httpExists(url): return
  try:
    page = urllib.urlopen(url)
    html = page.readlines()
    page.close()
    return html
  except Exception, e:
    print "gGetHtmlLines() error! Exception ==>>" + e
    return
"""get html src,return string"""
def gGetHtml(url):
  if url==None : return
  if not httpExists(url): return
  try:
    page = urllib.urlopen(url)
    html = page.read()
    page.close()
    return html
  except Exception, e:
    print "gGetHtml() error! Exception ==>>" + e
    return
"""根据url获取文件名"""
def gGetFileName(url):
  if url==None: return None
  if url=="" : return ""
  arr=url.split("/")
  return arr[len(arr)-1]
"""生成随机文件名"""
def gRandFilename(type):
  fname = ''
  for i in range(16):
    fname = fname + chr(random.randint(65,90))
    fname = fname + chr(random.randint(48,57))
  return fname + '.' + type
"""根据url和其上的link,得到link的绝对地址"""
def gGetAbslLink(url,link):
  if url==None or link == None : return
  if url=='' or link=='' : return url
  addr = ''
  if link[0] == '/' :
    addr = gGetHttpAddr(url) + link
  elif len(link)>3 and link[0:4] == 'http':
    addr = link
  elif len(link)>2 and link[0:2] == '..':
    addr = gGetHttpAddrFatherAssign(url,link)
  else:
    addr = gGetHttpAddrFather(url) + link
  return addr
"""根据输入的lines,匹配正则表达式,返回list"""
def gGetRegList(linesList,regx):
  if linesList==None : return
  rtnList=[]
  for line in linesList:
    matchs = re.search(regx, line, re.IGNORECASE)
    if matchs!=None:
      allGroups = matchs.groups()
      for foundStr in allGroups:
        if foundStr not in rtnList:
          rtnList.append(foundStr)
  return rtnList
"""根据url下载文件,文件名参数指定"""
def gDownloadWithFilename(url,savePath,file):
  #参数检查,现忽略
  try:
    urlopen=urllib.URLopener()
    fp = urlopen.open(url)
    data = fp.read()
    fp.close()
    file=open(savePath + file,'w+b')
    file.write(data)
    file.close()
  except IOError, error:
    print "DOWNLOAD %s ERROR!==>>%s" % (url, error)
  except Exception, e:
    print "Exception==>>" + e
"""根据url下载文件,文件名自动从url获取"""
def gDownload(url,savePath):
  #参数检查,现忽略
  fileName = gGetFileName(url)
  #fileName =gRandFilename('jpg')
  gDownloadWithFilename(url,savePath,fileName)
"""根据某网页的url,下载该网页的jpg"""
def gDownloadHtmlJpg(downloadUrl,savePath):
  lines= gGetHtmlLines(downloadUrl) # 'get the page source'
  regx = r"""src\s*="?(\S+)\.jpg"""
  lists =gGetRegList(lines,regx) #'get the links which match regular express'
  if lists==None: return
  for jpg in lists:
    jpg = gGetAbslLink(downloadUrl, jpg) + '.jpg'
    gDownload(jpg,savePath)
    print gGetFileName(jpg)
"""根据url取主站地址"""
def gGetHttpAddr(url):
  if url== '' : return ''
  arr=url.split("/")
  return arr[0]+"//"+arr[2]
"""根据url取上级目录"""
def gGetHttpAddrFather(url):
  if url=='' : return ''
  arr=url.split("/")
  addr = arr[0]+'//'+arr[2]+ '/'
  if len(arr)-1>3 :
    for i in range(3,len(arr)-1):
      addr = addr + arr[i] + '/'
  return addr
"""根据url和上级的link取link的绝对地址"""
def gGetHttpAddrFatherAssign(url,link):
  if url=='' : return ''
  if link=='': return ''
  linkArray=link.split("/")
  urlArray = url.split("/")
  partLink =''
  partUrl = ''
  for i in range(len(linkArray)):
    if linkArray[i]=='..':
      numOfFather = i + 1 #上级数
    else:
      partLink = partLink + '/' + linkArray[i]
  for i in range(len(urlArray)-1-numOfFather):
    partUrl = partUrl + urlArray[i]
    if i < len(urlArray)-1-numOfFather -1 :
      partUrl = partUrl + '/'
  return partUrl + partLink
"""根据url获取其上的相关htm、html链接,返回list"""
def gGetHtmlLink(url):
  #参数检查,现忽略
  rtnList=[]
  lines=gGetHtmlLines(url)
  regx = r"""href="?(\S+)\.htm"""
  for link in gGetRegList(lines,regx):
    link = gGetAbslLink(url,link) + '.htm'
    if link not in rtnList:
      rtnList.append(link)
      print link
  return rtnList
"""根据url,抓取其上的jpg和其链接htm上的jpg"""
def gDownloadAllJpg(url,savePath):
  #参数检查,现忽略
  gDownloadHtmlJpg(url,savePath)
  #抓取link上的jpg
  links=gGetHtmlLink(url)
  for link in links:
    gDownloadHtmlJpg(link,savePath)
"""test"""
def main():
  u='http://site.douban.com/196738/room/2462453/'#想要抓取图片的地址
  save='/root/python/tmp/' #图片所要存放的目录
  print 'download pic from [' + u +']'
  print 'save to [' +save+'] ...'
  gDownloadHtmlJpg(u,save)
  print "download finished"
if __name__ == "__main__":
  main()
else:
  print "called from intern."

以上代码是小编给大家介绍的python抓取网页中图片并保存到本地的全部内容,希望大家喜欢。

(0)

相关推荐

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

    源码传送门 环境准备 下面的两个第三方模块都可以直接通过pip快速安装,这里使用py36作为运行环境. python3.6 requests exifread 思路 遍历目录 拉取数据集合 遍历集合取得exif exif信息整理,并获取实体地址 拷贝文件到结果样本目录 生成json报告文件 基础知识 下面是现今相片中会存在与GPS相关的关键字,大牛亦可一比带过~ [参考] { "GPSVersionID": "GPS版本", "GPSLatitudeRef

  • Python实现文件按照日期命名的方法

    本文实例讲述了Python实现文件按照日期命名的方法.分享给大家供大家参考.具体实现方法如下: 这里实现文件按照创建的时期批量重命名的功能 # -*- coding: utf-8 -*- import os import time import datetime rootDir = "I:/1/" dic={} for dirName,subDirs,fileList in os.walk(rootDir): print dirName for fn in fileList: fnpa

  • Python实现自动为照片添加日期并分类的方法

    本文实例讲述了Python实现自动为照片添加日期并分类的方法.分享给大家供大家参考,具体如下: 小时候没怎么照相,所以跟别人说小时候特别帅他们都不信.小外甥女出生了,我给买了个照相机,让她多照相.可惜他舅目前还是个屌丝,买了个700的屌丝照相机,竟然没有自动加日期的功能.试了几个小软件,都不好用,大的图像软件咱又不会用.身为一个计算机科学与技术专业的学生,只能自立更生了. 听说Python有个图形库,不错,在照片上打日期很容易,于是我就下了这个库.对Python不熟,一面看着手册一面写的.完成了

  • python处理图片之PIL模块简单使用方法

    本文实例讲述了python处理图片之PIL模块简单使用方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python #encoding: utf-8 import Image class myimg: def __init__(self, open_file, save_file): self.img = Image.open(open_file) self.save_file = save_file def Change_Size(self, percent=10

  • python实现识别相似图片小结

    文章简介 在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简单几句就说清,所以本文只作基本算法的科普向. 如有错误,请多包涵和多多指教. 参考的文章和图片来源会在底部一一列出. 以及本篇文章所用的代码都会在底下给出github地址. 安装相关库 python用作图像处理的相关库主要有openCV(C++编写,提供了python语言的接口),PIL,

  • Python实现获取照片拍摄日期并重命名的方法

    本文实例讲述了Python实现获取照片拍摄日期并重命名的方法.分享给大家供大家参考,具体如下: python获取照片的拍摄日期并重命名.不支持重复处理的中断. 重命名为:拍摄日期__原文件名 import os import exifread def getExif(filename): FIELD = 'EXIF DateTimeOriginal' fd = open(filename, 'rb') tags = exifread.process_file(fd) fd.close() if

  • python批量下载图片的三种方法

    有三种方法,一是用微软提供的扩展库win32com来操作IE,二是用selenium的webdriver,三是用python自带的HTMLParser解析.win32com可以获得类似js里面的document对象,但貌似是只读的(文档都没找到).selenium则提供了Chrome,IE,FireFox等的支持,每种浏览器都有execute_script和find_element_by_xx方法,可以方便的执行js脚本(包括修改元素)和读取html里面的元素.不足是selenium只提供对py

  • Python比较两个图片相似度的方法

    本文实例讲述了Python比较两个图片相似度的方法.分享给大家供大家参考.具体分析如下: 这段代码实用pil模块比较两个图片的相似度,根据实际实用,代码虽短但效果不错,还是非常靠谱的,前提是图片要大一些,太小的图片不好比较.附件提供完整测试代码和对比用的图片. 复制代码 代码如下: #!/usr/bin/python # Filename: histsimilar.py # -*- coding: utf-8 -*- import Image def make_regalur_image(img

  • python简单实现旋转图片的方法

    本文实例讲述了python简单实现旋转图片的方法.分享给大家供大家参考.具体实现方法如下: # rotate an image counter-clockwise using the PIL image library # free from: http://www.pythonware.com/products/pil/index.htm # make sure to install PIL after your regular python package is installed impo

  • Python实现拼接多张图片的方法

    本文实例讲述了Python实现拼接多张图片的方法.分享给大家供大家参考.具体分析如下:   这里所述计划实现如下操作:   ① 用Latex写原始博文,生成PDF文档; ② 将PDF转成高清的PNG格式的图片; ③ 将多个PNG格式的图片合并成一大张图片; ④ 将最终的大图片直接上传到博文编辑器中 好了,如果将PDF文档转换成其他的图片格式呢?我建议windowns下可用Adobe  Acrobat X Pro软件完成这个工作,操作步骤如下面两图所示.注意在图二中一定要自己指定一个分辨率,不用用

随机推荐