python 批量下载网页图片_Python批量下载网页图片详细教程

20121099355256800.jpg

目标:爬取某个网站上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的下载量。不知道是不是流量太大了,今天老是断网……

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

教程到此结束~希望对大家有所帮助~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值