编写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 相关文章推荐
python time模块用法实例详解
Sep 11 Python
Python开发常用的一些开源Package分享
Feb 14 Python
Python中的高级数据结构详解
Mar 27 Python
Python多进程并发(multiprocessing)用法实例详解
Jun 02 Python
解决Matplotlib图表不能在Pycharm中显示的问题
May 24 Python
python异步实现定时任务和周期任务的方法
Jun 29 Python
全面了解django的缓存机制及使用方法
Jul 22 Python
python基于pdfminer库提取pdf文字代码实例
Aug 15 Python
python 实现多维数组转向量
Nov 30 Python
python图片验证码识别最新模块muggle_ocr的示例代码
Jul 03 Python
matplotlib subplot绘制多个子图的方法示例
Jul 28 Python
python装饰器代码解析
Mar 23 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
使用php显示搜索引擎来的关键词
2014/02/13 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
深入理解JavaScript系列(16) 闭包(Closures)
2012/04/12 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
python 多线程应用介绍
2012/12/19 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
Python使用matplotlib 画矩形的三种方式分析
2019/10/31 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
大学生万能检讨书范例
2014/10/04 职场文书
培训通知书模板
2015/04/17 职场文书
爱国影片观后感
2015/06/18 职场文书
身份证丢失证明
2015/06/19 职场文书
python编写函数注意事项总结
2021/03/29 Python
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技
使用Ajax实现进度条的绘制
2022/04/07 Javascript
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python