python 批量下载网页图片_Python实现多线程批量下载图片

20112694542.jpg

《派森》(Python)3.13 win32 英文安装版

类型:编程工具大小:21M语言:英文 评分:8.7

标签:

立即下载

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

有需求就会动力。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL,Oracle,SQL数据库在JSP中的驱动

MYSQL,Oracle,SQL数据库在JSP中的驱动 datasource.urljdbc:mysql://localhost:3306/bbscs6?useUnicodetrue&characterEncodingUTF-8 datasource.usernameroot datasource.passwordroot Oracle datasource.driverClassNameoracle.jdbc.driver.OracleDriver datasource.urlj…

linux中获取redis的map,深入Redis之 bitmap位图和HyperLogLog(五)

bitmap位图我们知道一个字符占1个字节,也就是8个位例如set name bigbig字符串中的3个字符的ASCII码为98 105 113所以big转为二进制就是:01100010|01101001|01100111b i g占了3个字节的大小,一共24个位。bitmap位图可以帮我们获取…

Hibernate简单例子以及笔记

先创建Person类,代码如下:(Person.java)import java.util.*;public class Person {public int id;public String name;public String password;public Date birthday;public Person() {}public Person(String name, String password, Date birthday) {su…

想象中的同居生活 VS 真实的同居生活

1 长颈鹿是怎么喝水的2 为了防止雨伞被偷设计师还是真动了不少脑筋呢-3 睡在这样的床上,晒着太阳,肯定超赞4 如何阻止猫咪上楼5 想象中的同居生活 VS 真实的同居生活 6 硬生生把苹果削成吃不饱也吃不起的样子7 来来来准备瓜子杏仁你点的每个赞&#xff…

英语时态的性趣学法

学英语要从性趣开始 一般现在时:I make love with her everyday.一般过去时:I made love with her yesterday.一般将来时:I will make love with her tomorrow.现在进行时:I am making love with her过去进行时:I was making love with her at this time yesterday将来进行时:I…

抽丝剥茧!Source Generators原理讲解

前言前段时间,我们已经用Source Generators实现了好多功能,比如AutoMapper、API最佳实践。你看完那些实现代码,是不是还有点云里雾里!Source Generators到底是怎么做到的?基础知识Source Generators是编译过程的一部分…

python跟java 效率_Python和Java该如何选择?老男孩Python人工智能

编程是很多人都想要掌握的技术,但是在行业之中编程语言有很多种,每个人的爱好,想要从事领域不同,自然选择也是不同,比较常见的编程语言就是Python和Java,那么对于这两种语言选择哪个好? 老男孩教育在这里为…

GPON技术概述

GPON技术转载自《电子发烧友》。文章链接请见:http://www.elecfans.com/article/88/171/2009/2009050556028.htmlGPON技术详述介绍GPON 技术之前,先介绍目前也被应用的另一种PON 技术“EPON”。1.EPON技术介绍EPON 又名 GEPON,是由…

linux中断处理汇编入口,Linux中断处理体系结构分析(一)

中断也是一种异常,之所以把它单独的列出来,是因为中断的处理与具体的开发板密切相关,除一些必须、共用的中断(比如系统时钟中断、片内外设UART中断)外,必须由驱动开发者提供处理函数。内核提炼出中断处理的共性,搭建一…

IOS开发学习的有用链接

iOS学习之 plist文件的读写

[转]C/C++ 文件读写操作总结

在编程的过程中,文件的操作是一个经常用到的问题,在CBuilder中,可以使用多种方法对文件操作,下面我就按以下几个部分对此作详细介绍,就是: 1、基于C的文件操作; 2、基于C的文件操作;…

没有违反GPL,他们真的给了源码

文 | Travis出品 | OSC开源社区(ID:oschina2013)【前情回顾】国内智能设备制造商 UMIDIGI 因违反 GPLv2 协议引发争议,并告知开发者“想要源码上门自取”。而后,知名科技博主 Naomi Wu(机械妖姬&#xff09…

有朋友问我为什么这么帅

1 2 重庆的朋友告诉我这是微辣3 我就说我只是虚胖,这下你相信了吧?4 这明明就是打情骂俏好嘛5 这还是那个平常瓶盖都拧不开的女孩子吗6 被一个机器人撩到了!7 这是什么原理?你点的每个赞,我都认真当成了喜欢

python安装详细步骤mac_Mac安装python3的方法步骤

Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的。 现在 Mac 上默认安装的 python 版本为 2.7 版本,若 安装 新版本需要 通过 该地址进行下载: https://www.python.org/ftp/python/3.5.0/python-3.5.0…

在Excel中实现下拉列表选择录入

我们在用Excel录入表格数据时,常常会遇到某列数据的值只在几个固定值中选择一个的情况,比如:人的性别列只可能录入男或女,对学历列只可能录入高中、大专、本科、研究生之一等。遇到这类数据,如果我们手工录入&#xff…

二叉搜索树python,代表python中的二叉搜索树

how do i represent binary search trees in python?解决方案class Node(object):def __init__(self, payload):self.payload payloadself.left self.right 0# this concludes the "how to represent" asked in the question. Once you# represent a BST tree li…

c语言输入一个数存数组,//从键盘上输入若干整数,并将其存入数组中,并统计输入数据的个...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//从键盘上输入若干整数,并将其存入数组中,并统计输入数据的个数。#include#include#include#includeint sum_num(char [],int []);int cou_num(char [][81],int,int[]);int txt(char [][81],int);//主函数m…

你吃的瓜子仁,真是老奶奶磕出来的?!

全世界只有3.14 % 的人关注了爆炸吧知识本文转载自微信公众号一只学霸(ID:bajie203)萌萌不是挺爱吃瓜子仁吗有次他吃的时候大毛在旁边看着看着突然想到一个问题吓得我反思了一下自己是怎么和他们考上同个学校的没思考出来吓得我给大家写了这篇…

ASP.NET GridView控件匯出EXCEL-移除控件,只是顯示文本

ASP.NET GridView控件匯出EXCEL-移除控件,只是顯示文本下午 05:10 2011/2/22 將GridView中的TextBox,DropDownList,LinkButton去掉,顯示文本。 public void ClearGridControls(ref Control sourceControl) { for (int i…

android脚步---不同activity之间参数传递

现在有两个activity,一个是mainactivity,一个是detectactivity 后者需要调用前者的一个参数,这里用到了intent getextras(); putextras();参数传递, 看代码,首先两个activity之间有关联,第一个activity里面有一个Butt…