很多年前,咩老师就一直有一种怨念,对于那些每个网页有一大堆要下载的东西还没有批量下载的选项的。
直到有一天,咩老师学会了Python。在你阅读这篇文章之前,请跟我诚心的默念python大法好三遍。
使用Python进行网络下载,最基本的两个库是urllib和re,如果需要的功能较为基础的话,我们只需要urllib库中的request模块。
那么,跟着我来写第一个最简单的程序吧。首先,输入以下两行指令
import urllib.request as urr
import re
如果忘了以上两行代码是什么意思的,请回去看import并且面壁思过三秒钟。
好吧现在让我们来一起看看如何进行一个最基础的下载操作
首先打开百度图片。点进去一张图片
右键-查看源代码,找出这个图片的地址
很好,我们写下s='http://upload.art.ifeng.com/2015/0811/1439260959533.jpg'
然后, url=urr.urlopen(s),顾名思义,这是一个打开所输入的url的函数。
data=url.read() 读取这个url
为了存储我们下载的图片,我们需要建立一个文件
f=open('D:/Nico/1.jpg','wb')
这个函数的意思是,打开一个文件,以wb形式打开,这个函数还有更多的选项,比如'r'为读取,'a'为添加。wb的意思为w:write,写入,b:binary,二进制形式。
f.write(data),很简单,把data的内容写入f
f.close()只有进行这一步之后我们才会看到文件结果
来看一看操作视频
我相信你不会满足于这个的,接下来我们进行批量下载,首先打开网址
'http://web5.pku.edu.cn/bs/xzzq/' 这里是一个很好的练习地址
让我们来分析一下它的下载地址
是由'/bs/document/'+20位数字+'.'+三位字母拓展名组成的。
那我们就可以开始来写程序了,首先还是import
s='http://web5.pku.edu.cn/bs/xzzq/'
还是,先open,read这个网址
下一步,我们肯定不想一个个的输入这些地址,这时候就需要用到re模块了,这是一个可以匹配识别特定模式字符串的模块,我们编译一个符号模式的字符串,按照我们刚才分割的结果
简单点可以写成
r=re.compile('/bs/document/\d[.][a-z]')
Python中\后面的字符将被转义,\n 为换行,\t为tab,\d为数字,\w 为数字+字母和'_',若大写则为取反,\s为空白字符。[a-z]为另一种表达方式,意味所有a-z的都可以被匹配。待匹配对象后可以加匹配次数,有五种主要模式:
+:一次及以上,*:不是一次,?:不超过一次。
:a次,:a到b次。
请你解释下述正则的含义:
r=re.compile('(/bs/document/\d[.][a-z])">(\S.[a-z])')
这个正则稍微复杂一些,实际我们使用的是这个正则,其用途我们待会说到。
由于我们要查找的是字符串,而url读取的是binary,因此我们需要将其解码,data=data.decode('utf-8')其中'utf-8'是编码类型,根据系统等的不同也有可能是GBK等,在源代码页面可以看的到。
下一步,我们使用dl=r.findall(data)
这一步函数返回一个列表,列表中是所有与我们想要匹配的模式串匹配的结果,不知道你有没有注意到上一个正则中我们加了两对括号,括号的意思是这里是我们实际所需的东西,从左至右序号依次增加,如果括号多于两个,则结果会给我们返回一个元组(tuple)
forxindl:
对于dl中的每一个对象x
print(x)
输出x
url2=urr.urlopen(s+x[])
打开对应的网址
data2=url2.read()
f=open('D:/Nico/%s'%x[1],'wb')
%s的意思是字符串,同理,%d为整型,%f为浮点型,在一个字符串中加入%意味着用'后面跟着的%中的内容替换%
f.write(data2)
f.close()
time.sleep(1)
为了稳定,我们每下载一个文件暂停1s(不加)
我们先说到这里,等想起来了再继续为你带来较为复杂的下载操作
作业:请寻找一个网址并向咩老师提交能批量下载的代码
领取专属 10元无门槛券
私享最新 技术干货