Python代码练习--批量下载(改进篇)
上一篇文章实现批量下载需要配置三个地方,一个URL和循环起点与终点数值。循环的起点和终点需要你根据需要下载的资源估算,这个少不了,不过只需要配置一次。
关键是这个URL的配置,你要每次都复制然后粘贴到代码中。我一向最讨厌复制粘贴了,所以这一次试试如何来优化。
说明:这个程序使用到了gtk来访问剪切板,所以只能在Unix/Linux平台中使用。不过Windows下的替代功能也很好实现,代码末尾的注释给出了实现方案。
现在我们只需要配置一次资源保存目录,以及一个用于循环的步长数值,而无需多次来修改代码。然后在firefox或chrome中右键单击资源(图片),复制地址,然后在控制台中执行python one.py即可。
代码
#-*- coding:utf-8 -*-
import os
import time
import urlparse
import string
from gtk import Clipboard
'''
用于下载资源的小程序,非常适合下载静态图片文件,某些网站经过特殊处理(如登录验证/请求拦截)无法下载
特殊说明:下载使用GNU wget,Windows需要安装这个软件
配置说明:只需要一次配置folder和step值即可
'''
#保存图片的文件夹(末尾必须带上斜线),程序会在这个目录下新建一个网站目录。根据个人需求配置
folder='/home/xgf/wget/'
#比如你的图片地址是www.a.com/a/100.jpg,步长设置为50来下载名称为50~149的所有图片。根据个人需求配置
step=50
#访问剪切板的URL字符串
cb=Clipboard()
#样板URL,从剪切板访问
sampleurl=cb.wait_for_text()
#在folder下新建当前网站目录
url=urlparse.urlparse(sampleurl)
base=folder+url.hostname+'/'
#解析图片文件的格式
frags=sampleurl.split('/')
arr=frags[-1].split('.')
#图片文件的扩展名
ext=arr[1]
baseurl='/'.join(frags[:-1])
#分析循环的起点与终点
start=int(arr[0])-step
end=start+step*2
if os.path.isfile(base+str(arr[0])+'.jpg'):
exit()
if not os.path.isdir(folder):
os.mkdir(folder)
if not os.path.isdir(base):
os.mkdir(base)
os.chdir(base)
#根据设置的URL的起点与终点生成批量URL地址,保存到文本文件中。
now=time.localtime()
filelist='urls-{0}{1}{2}{3}{4}.txt'.format(now[1],now[2],now[3],now[4],now[5])
f=open(base+filelist,'w')
for x in xrange(start,end,1):
f.write('{0}/{1}.{2}\n'.format(baseurl,x,ext))
f.close()
os.system('wget -i '+filelist)
#如果希望保存本次下载的URL列表则注释下面一行代码
os.remove(base+filelist)
'''
#下面是在windows系统中操作剪切板的方案,没有测试
import win32clipboard as w
import win32con
def getText():
w.OpenClipboard()
d = w.GetClipboardData(win32con.CF_TEXT)
w.CloseClipboard()
return d
def setText(aString):
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_TEXT, aString)
w.CloseClipboard()
'''
import os
import time
import urlparse
import string
from gtk import Clipboard
'''
用于下载资源的小程序,非常适合下载静态图片文件,某些网站经过特殊处理(如登录验证/请求拦截)无法下载
特殊说明:下载使用GNU wget,Windows需要安装这个软件
配置说明:只需要一次配置folder和step值即可
'''
#保存图片的文件夹(末尾必须带上斜线),程序会在这个目录下新建一个网站目录。根据个人需求配置
folder='/home/xgf/wget/'
#比如你的图片地址是www.a.com/a/100.jpg,步长设置为50来下载名称为50~149的所有图片。根据个人需求配置
step=50
#访问剪切板的URL字符串
cb=Clipboard()
#样板URL,从剪切板访问
sampleurl=cb.wait_for_text()
#在folder下新建当前网站目录
url=urlparse.urlparse(sampleurl)
base=folder+url.hostname+'/'
#解析图片文件的格式
frags=sampleurl.split('/')
arr=frags[-1].split('.')
#图片文件的扩展名
ext=arr[1]
baseurl='/'.join(frags[:-1])
#分析循环的起点与终点
start=int(arr[0])-step
end=start+step*2
if os.path.isfile(base+str(arr[0])+'.jpg'):
exit()
if not os.path.isdir(folder):
os.mkdir(folder)
if not os.path.isdir(base):
os.mkdir(base)
os.chdir(base)
#根据设置的URL的起点与终点生成批量URL地址,保存到文本文件中。
now=time.localtime()
filelist='urls-{0}{1}{2}{3}{4}.txt'.format(now[1],now[2],now[3],now[4],now[5])
f=open(base+filelist,'w')
for x in xrange(start,end,1):
f.write('{0}/{1}.{2}\n'.format(baseurl,x,ext))
f.close()
os.system('wget -i '+filelist)
#如果希望保存本次下载的URL列表则注释下面一行代码
os.remove(base+filelist)
'''
#下面是在windows系统中操作剪切板的方案,没有测试
import win32clipboard as w
import win32con
def getText():
w.OpenClipboard()
d = w.GetClipboardData(win32con.CF_TEXT)
w.CloseClipboard()
return d
def setText(aString):
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_TEXT, aString)
w.CloseClipboard()
'''