编写Python脚本批量下载DesktopNexus壁纸的教程


Posted in Python onMay 06, 2015

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 ArgumentParser

import os, re, sys
import urllib2, cookielib, urlparse

RE_WALLPAPER = r'http\:\/\/[^\/\.]+\.desktopnexus\.com\/wallpaper\/\d+\/'
CHUNK_SIZE = 1024 * 3

class 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'<a href=\"\/get\/%s\/\?t=(?P<token>.*?)\"' % 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.', e

if __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()

Python 相关文章推荐
python3中set(集合)的语法总结分享
Mar 24 Python
python利用rsa库做公钥解密的方法教程
Dec 10 Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 Python
Django实现发送邮件找回密码功能
Aug 12 Python
Python timeit模块的使用实践
Jan 13 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
Python接收手机短信的代码整理
Aug 02 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
Dec 13 Python
python中pivot()函数基础知识点
Jan 03 Python
python数据可视化使用pyfinance分析证券收益示例详解
Nov 20 Python
python数字图像处理之图像自动阈值分割示例
Jun 28 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 #Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 #Python
Python实现的HTTP并发测试完整示例
Apr 23 #Python
安装dbus-python的简要教程
May 05 #Python
使用SAE部署Python运行环境的教程
May 05 #Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
May 05 #Python
在Python中使用mechanize模块模拟浏览器功能
May 05 #Python
You might like
XML的代替者----JSON
2007/07/21 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
2013/04/02 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
微信小程序使用wxParse解析html的实现示例
2018/08/30 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
详解jquery和vue对比
2019/04/16 jQuery
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
[00:10]神之谴戒
2019/03/06 DOTA
python二叉树遍历的实现方法
2013/11/21 Python
python实现xlsx文件分析详解
2018/01/02 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
使用pip安装python库的多种方式
2019/07/31 Python
Python reversed函数及使用方法解析
2020/03/17 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
EJB面试题
2015/07/28 面试题
程序员经常用到的UNIX命令
2015/04/13 面试题
初中差生评语
2014/12/29 职场文书
遗失说明具结保证书
2015/02/26 职场文书
讲文明倡议书
2015/04/29 职场文书
党支部半年考察意见
2015/06/01 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis
详解MySQL的内连接和外连接
2023/05/08 MySQL