上一讲咱们说了如何把网页的数据经过分析后存储到数据库,咱们此次讲如何将网页上的图片提取并下载到本地。html
思路以下:正则表达式
咱们本次要爬取的是昵图网首页的图片。数据库
一、首先分析咱们要爬取的网页的代码结构,每一个网页的代码结构都不大同样,因此要作好分析。浏览器
咱们进入昵图网的首页,http://www.nipic.com/index.html服务器
按F12开启浏览器的调试模式,能够经过鼠标看到图片的后台代码:点击调试的小箭头,而后点击对应的图片,既能够看到图片在页面上对应的编码。网络
或者,直接“查看源代码”就能够看到整个网页的源码函数
咱们能够在源代码界面看到不少.jpg结尾的图片post
咱们能够直接经过查找来查看到底有多少张图片在页面上,我本次用的是360浏览器,每一个浏览器的使用方法大同小异。编码
查找的快捷方式是Ctrl+F 同时按住两个按键就能够在提示框中输入查找的信息。url
或者右击菜单“查找”
在关键词框中输入".jpg"
咱们能够看到,系统提示是14张图片的连接。
二、编写代码,获取网页的图片,首先咱们要这个页面的图片的大致格式是怎样的。
咱们看下几个图片连接的代码格式:
上面三张图片的格式都是常见的:http://.......jpg,则咱们能够把这个作成正则表达式的形式如:http:\S{1,}.jpg
则,咱们利用前面两讲的代码,编写以下:
三、效果以下:
点击运行后,系统自动在D盘的image文件夹下载对应的图片
最终下载完后:
最后,其实你网速快的话,程序不设置休眠也能够。
最后,总结下咱们本次用到的新知识:
一、函数:urllib.urlretrieve(url[, filename[, reporthook[, data]]])
函数说明
将URL表示的网络对象复制到本地文件。若是URL指向本地文件,则对象将不会被复制,除非提供文件名。返回一个元组()(filename,header),其中filename是能够找到对象的本地文件名,header是urlopen()返回的对象的info()方法(用于远程对象)。
第二个参数(若是存在)指定要复制到的文件位置(若是没有,该位置将是一个生成名称的tempfile)。第三个参数,若是存在,则是一个回调函数,它将在创建网络链接时调用一次,而且在此后每一个块读取后调用一次。这个回调函数将传递三个参数;到目前为止传输的块计数,以字节为单位的块大小,以及文件的总大小。第三个参数多是-1,在旧的FTP服务器上,它不返回文件大小以响应检索请求。
参数说明:
url:外部或者本地url
filename:指定了保存到本地的路径(若是未指定该参数,urllib会生成一个临时文件来保存数据);
reporthook:是一个回调函数,当链接上服务器、以及相应的数据块传输完毕的时候会触发该回调。咱们能够利用这个回调函数来显示当前的下载进度。
data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。
二、time.sleep(secs)
Python time sleep() 函数推迟调用线程的运行,可经过参数secs指秒数,表示进程挂起的时间。
三、os.makedirs()函数
语法格式:
os.makedirs(name[, mode=0o777][, exist_ok=False])
递归目录建立函数,和mkdir()很像,可是全部中间级目录都要包含叶目录。
递归建立目录,题中应有之意即路径中哪一层不存在,则自动建立。
区别于os.mkdir(path, mode=0o777, *, dir_fd=None),只建立最后一层的目录。
name:所要建立的目录
参数mode表示权限;
若是exist_ok是False(默认),当目标目录(即要建立的目录)已经存在,会抛出一个OSError。
四、b=a.split('/')[-1]
咱们不肯定图片连接的长度,因此若是从左边开始取下标,则最后一个文件名的下标值是不同的,很差操做,可是若是写的是-1,则说明要取得是右边第一个。
本节课没有课堂视频,由于新的教室没有带多余的麦克风。