python 批量下载文件

 最近感觉要练练口语了,所以就上普特逛逛有哪些资源比较好的,发现美国惯用语板块挺好的,但是点进去想下载音频时,发现浏览器已经解释了这个 MP3 格式的音频文件;要下载就只能右键另存为,总共有 900 多个,这么点来点去岂不是要点一天才能下完。

  正当蛋疼之时,忽然发现了播放 MP3 文件的 url 格式比较统一,比如说下面这几个
  
  
  
  前面的前缀都是相同的,可以推测在服务器上这些音频文件都是放到同一个文件夹下,而且会依据数字来加上前缀来命名,这就为脚本自动下载提供了一个很好的条件。
  首先,从最简单的入手,就是下载给出 url 所代表的资源,代码如下

1
2
3
4
5
6
import urllib2  
url="http://down02.putclub.com/homepage/courses/middle/oftenused/wi_01.mp3"
f=urllib2.urlopen(url)
data=f.read()
with open("1.mp3","wb") as file:
file.write(data)

  如果资源 url 的确存在,那执行脚本后会在当前目录生成跟一个名为 1.mp3 的音频文件,当然名称也可以自己取,这里为了简便就直接用数字来作为文件名了。如果资源 url 不存在则在 urlopen 时就会抛出一个 URLError(实际上也的确有某几期不提供音频文件)。根据测试,发现音频文件的前缀有 wiwi_putclub_mgxgywi_0 这几种。所以总体思路就是先得到合法的 url,再将其下载;因为基于数字命名,所以可以通过循环来批量下载。是不是很简单,这里给出完整的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#encoding:utf-8  
#下载普特英语文音频件的脚本
import urllib2

#得到合法的资源url
def getLegalUrl(i):
base_url="http://down02.putclub.com/homepage/courses/middle/oftenused/"
url_preletter_list=['wi_','wi','putclub_mgxgy','wi_0']
for j in url_preletter_list:
try:
url=base_url+j+str(i)+'.mp3'
f=urllib2.urlopen(url)
return url #不合法的url会抛出URLError的错误,不抛出则说明url存在
except urllib2.URLError:
continue
return ""

#下载给定的合法的url的资源
def download(url,i):
f=urllib2.urlopen(url)
data=f.read()
with open(str(i)+'.mp3','wb') as file:
file.write(data)

if __name__ == '__main__':
for i in range(0,600):
url=getLegalUrl(i)
if url == "":
#记录无法下载的那几期,以便验证是否资源本来就没有
with open("download.log",'a') as log:
log.write(str(i)+' not found\n')
else:
download(url,i)

等到脚本执行完,在文件夹下就能得到下面这些文件,密集恐惧者可忽略

日志如下,经检查,这些资源本来就不存在

这个方法只限于那些资源名称有规律的文件下载,但是好像普特上的文件都是这么存储的,所以以后就能愉快的下载了。
对于我这种小白而言只能想出这种方法,如果你有更好的方法,欢迎交流。