编写Python脚本批量下载DesktopNexus壁纸的教程
DesktopNexus是我最喜爱的一个壁纸下载网站,上面有许多高质量的壁纸,几乎每天必上,每月也必会坚持分享我这个月来收集的壁纸
但是DesktopNexus壁纸的下载很麻烦,而且因为壁纸会通过浏览器检测你当前分辨率来展示合适你当前分辨率的壁纸,再加上是国外的网站,速度上很不乐观。
于是我写了个脚本,检测输入的页面中壁纸页面的链接,然后批量下载到指定文件夹中。
脚本使用python写的,所以需要机器上安装有python。
用法:
$pythondesktop_nexus.py-phttp://www.desktopnexus.com/tag/cat/-s1280x800-owallpapers
   -p包含DesktopNexus壁纸链接的页面,比如我的壁纸分享
   -s壁纸尺寸,可选,缺省为1440x900
   -o壁纸输出的文件夹,可选,缺省为当前目录下的wallpapers,如果不存在会自动创建
代码:
#-*-coding:utf-8-*-
fromargparseimportArgumentParser
importos,re,sys
importurllib2,cookielib,urlparse
RE_WALLPAPER=r'http\:\/\/[^\/\.]+\.desktopnexus\.com\/wallpaper\/\d+\/'
CHUNK_SIZE=1024*3
classDesktopNexus:
def__init__(self,page=None,size=None,output_dir=None):
self.page=page
self.size=size
self.output_dir=output_dir
defstart(self):
print'Makingoutputdirectory:',self.output_dir
ifnotos.path.exists(self.output_dir):
os.makedirs(self.output_dir)
#Setupcookie
cookie=cookielib.CookieJar()
processer=urllib2.HTTPCookieProcessor(cookie)
opener=urllib2.build_opener(processer)
urllib2.install_opener(opener)
self._read_page()
def_get_pic_info(self,url):
pic_id=url.split('/')[-2]
html=urllib2.urlopen(url).read()
pattern=r'<ahref=\"\/get\/%s\/\?t=(?P<token>.*?)\"'%pic_id
match=re.search(pattern,html,flags=re.I|re.M|re.S)
ifmatch:
return{'id':pic_id,
'token':match.group('token'),
'size':self.size}
else:
raiseException('Coundnotfindwallpaper')
def_get_pic_file(self,pic_info):
redirect_url='http://www.desktopnexus.com/dl/inline/%(id)s/%(size)s/%(token)s'%pic_info
request=urllib2.urlopen(redirect_url)
returnrequest.geturl()
def_download_pic(self,url):
pic_info=self._get_pic_info(url)
pic_file=self._get_pic_file(pic_info)
filename=os.path.split(urlparse.urlparse(pic_file).path)[-1]
filename=os.path.join(self.output_dir,filename)
withopen(filename,'wb')asoutput:
resp=urllib2.urlopen(pic_file)
total_size=int(resp.info().get('Content-Length'))
saved_size=0.0
whilesaved_size!=total_size:
chunk=resp.read(CHUNK_SIZE)
saved_size+=len(chunk)
output.write(chunk)
self._print_progress('Savingfile:%s'%filename,\
saved_size/total_size*100)
def_print_progress(self,msg,progress):
sys.stdout.write('%-71s%3d%%\r'\
%(len(msg)<=70andmsgormsg[:67]+'...',progress))
sys.stdout.flush()
ifprogress>=100:
sys.stdout.write('\n')
def_read_page(self):
try:
print'Fetchingcontent:',self.page
html=urllib2.urlopen(self.page).read()
links=set(re.findall(RE_WALLPAPER,html,re.M|re.I))
count=len(links)
print'Downloadingwallpapers:'
fori,linkinenumerate(links):
print'[%d/%d]:%s'%(i+1,count,link)
try:
self._download_pic(link)
exceptExceptionase:
print'Errordownloadingwallpaper.',e.message
exceptExceptionase:
print'Errorfetchingcontent.',e
if__name__=='__main__':
#Setupargparser
parser=ArgumentParser('pythondesktop_nexus.py')
parser.add_argument('-p','--page',dest='page',required=True,\
help='specificapagethatincludeswallpaperlist')
parser.add_argument('-s','--size',dest='size',default='1440x900',\
help='specificthewallpapersize,defaultto1440x900')
parser.add_argument('-o','--output',dest='output_dir',default='wallpapers',\
help='specifictheoutputdirectory,defaultto"wallpapers"')
args=parser.parse_args()
dn=DesktopNexus(**args.__dict__)
dn.start()
