基于python的网络打包下载

很多年前,咩老师就一直有一种怨念,对于那些每个网页有一大堆要下载的东西还没有批量下载的选项的。

直到有一天,咩老师学会了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(不加)

我们先说到这里,等想起来了再继续为你带来较为复杂的下载操作

作业:请寻找一个网址并向咩老师提交能批量下载的代码

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180214G0EFQ200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券