編寫Python指令碼批量下載DesktopNexus壁紙的教程

來源:互聯網
上載者:User
DesktopNexus 是我最喜愛的一個壁紙下載網站,上面有許多高品質的壁紙,幾乎每天必上, 每月也必會堅持分享我這個月來收集的壁紙

但是 DesktopNexus 壁紙的下載很麻煩,而且因為壁紙會通過瀏覽器檢測你當前解析度來展示 合適你當前解析度的壁紙,再加上是國外的網站,速度上很不樂觀。

於是我寫了個指令碼,檢測輸入的頁面中壁紙頁面的連結,然後批量下載到指定檔案夾中。

指令碼使用 python 寫的,所以需要機器上安裝有 python 。
用法:

$ python desktop_nexus.py -p http://www.desktopnexus.com/tag/cat/ -s 1280x800 -o wallpapers

-p 包含 DesktopNexus 壁紙連結的頁面,比如我的壁紙分享
-s 壁紙尺寸,可選,預設為 1440x900
-o 壁紙輸出的檔案夾,可選,預設為目前的目錄下的 wallpapers, 如果不存在會自動建立

代碼:

#-*- coding: utf-8 -*-from argparse import ArgumentParserimport os, re, sysimport urllib2, cookielib, urlparseRE_WALLPAPER = r'http\:\/\/[^\/\.]+\.desktopnexus\.com\/wallpaper\/\d+\/'CHUNK_SIZE = 1024 * 3class DesktopNexus:  def __init__(self, page=None, size=None, output_dir=None):    self.page = page    self.size = size    self.output_dir = output_dir  def start(self):    print 'Making output directory:', self.output_dir    if not os.path.exists(self.output_dir):      os.makedirs(self.output_dir)    # Setup cookie    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'.*?)\"' % pic_id    match = re.search(pattern, html, flags=re.I|re.M|re.S)    if match:      return {'id': pic_id,          'token': match.group('token'),          'size': self.size}    else:      raise Exception('Cound not find wallpaper')  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)    return request.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)    with open(filename, 'wb') as output:      resp = urllib2.urlopen(pic_file)      total_size = int(resp.info().get('Content-Length'))      saved_size = 0.0      while saved_size != total_size:        chunk = resp.read(CHUNK_SIZE)        saved_size += len(chunk)        output.write(chunk)        self._print_progress('Saving file: %s' % filename, \            saved_size / total_size * 100)  def _print_progress(self, msg, progress):    sys.stdout.write('%-71s%3d%%\r' \        % (len(msg) <= 70 and msg or msg[:67] + '...', progress))    sys.stdout.flush()    if progress >= 100:      sys.stdout.write('\n')  def _read_page(self):    try:      print 'Fetching content:', self.page      html = urllib2.urlopen(self.page).read()      links = set(re.findall(RE_WALLPAPER, html, re.M|re.I))      count = len(links)      print 'Downloading wallpapers:'      for i, link in enumerate(links):        print '[%d/%d]: %s' % (i + 1, count, link)        try:          self._download_pic(link)        except Exception as e:          print 'Error downloading wallpaper.', e.message    except Exception as e:      print 'Error fetching content.', eif __name__ == '__main__':  # Setup argparser  parser = ArgumentParser('python desktop_nexus.py')  parser.add_argument('-p', '--page', dest='page', required=True, \      help='specific a page that includes wallpaper list')  parser.add_argument('-s', '--size', dest='size', default='1440x900', \      help='specific the wallpaper size, default to 1440x900')  parser.add_argument('-o', '--output', dest='output_dir', default='wallpapers', \      help='specific the output directory, default to "wallpapers"')  args = parser.parse_args()  dn = DesktopNexus(**args.__dict__)  dn.start()
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.