编写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 相关文章推荐
pyqt4教程之实现半透明的天气预报界面示例
Mar 02 Python
浅谈Python中列表生成式和生成器的区别
Aug 03 Python
python交互式图形编程实例(一)
Nov 17 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
django使用LDAP验证的方法示例
Dec 10 Python
Python内置数据类型list各方法的性能测试过程解析
Jan 07 Python
Python 实现日志同时输出到屏幕和文件
Feb 19 Python
基于Python数据分析之pandas统计分析
Mar 03 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 Python
Python实现扫码工具的示例代码
Oct 09 Python
Python环境搭建过程从安装到Hello World
Feb 05 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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
php实现复制移动文件的方法
2015/07/29 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
2016/12/06 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
vue 需求 data中的数据之间的调用操作
2020/08/05 Javascript
学习python处理python编码问题
2011/03/13 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
Python数据持久化shelve模块用法分析
2018/06/29 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
python中np是做什么的
2020/07/21 Python
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
财经学院自荐信范文
2014/02/02 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
查摆剖析材料范文
2014/09/30 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
大学生支教感言
2015/08/01 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL
Python中for后接else的语法使用
2021/05/18 Python