好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Python批量下载图片

Python批量下载图片

爬取图片可真的是一个可遇不可求的机会。

  有需求就会动力。

  目标:爬取某个网站上n多页的链接,每个链接有n多张图片,每一页对应一个文件夹,每个文件夹包含n个链接所对应的文件夹。

  

  步骤1:获得网页的所有链接,访问所有链接,获得链接里的图片地址。

  这一步通过 上一篇文章 的学习,同时写好正则匹配,就可以简单地完成。

  

  步骤2:根据图片地址下载图片。

  下载jpg格式的图片其实很容易。

 1  socket =  urllib2.urlopen(url)
  2  data =  socket.read()
  3  with open(path,  "  wb  "  ) as jpg:
  4       jpg.write(data)
  5  socket.close()

  其中url为图片地址,path为保存路径。

  完成这一步之后,简单的批量下载图片功能就完成了。

  但是,下载的过程中有几个问题。

  1、下载速度慢。

  我们打开网站的时候看到图片的速度在网速不是太慢的情况下其实也不慢,但是用这种方法下载一张图片要等很久,有时却很快。

  2、下着下着就卡在那里了。

  它就是卡在那里了,不知道要等到什么时候报错。

  

  基于这两个问题,我检索了一些资料,其中 这篇文章 对这个情况有比较好的说明。

  后改进如下。

  1   #  设定超时时间,单位为秒,放在程序开头即可 
  2  timeout = 60
  3   socket.setdefaulttimeout(timeout)
   4  
  5   #  下载图片的时候 
  6  time.sleep(10) #  先sleep,再读取数据 
  7  socket =  urllib2.urlopen(urllib2.Request(imgurl))
   8  data =  socket.read()
   9   socket.close()
  10  ...

  其实这个改进当时在程序中的体现不是很明显,但是后来我又加入了一个东西:多线程。

  python的多线程有几种方法可以实现,通过 这篇博文 可以对此有所了解。

  在这里我采用继承 threading.Thread的方法实现多线程。

  重载run方法。我这里是每下载一个图片就开一个线程(好像不是太好,囧……)。

 1  thread =  Download()
  2  thread.imgurl =  imgurl
  3  thread.path =  path
  4  thread.start()

  这个多线程用上以后,整个程序简直就像开足了马力,开始大力地下载。没一会功夫就下载了100多M的图片!

  其实我一开始是有顾虑一个问题的,就是为什么线程sleep的时候能够偷偷地占用系统的时间?看看 这篇文章 的实验。

  也就是说,10条线程每个sleep10秒,结果也只是花了差不多10秒的时间。

  

  图片的下载速度很快,虽然中途有一些处理异常的网址,但是速度飞一般的快。(后来增加了一些异常处理)

  很快,开始出现异常了,大量的图片下载失败。

  研究了很久之后才发现,存储空间不足……

  于是,搬到一个10G空闲的分区,开始下载,改善异常处理。

  最终完成目标的时候大概完成了8G的下载量。不知道是不是流量太大了,今天老是断网……

  同时尝试了视频的下载,这个功能还有待发掘。

 

分类:  Python

标签:  编程 ,  Python

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Python批量下载图片的详细内容...

  阅读:46次