编写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调用windows api锁定计算机示例
Apr 17 Python
Python序列之list和tuple常用方法以及注意事项
Jan 09 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
Python smtplib实现发送邮件功能
May 22 Python
用Python逐行分析文件方法
Jan 28 Python
libreoffice python 操作word及excel文档的方法
Jul 04 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
Aug 07 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
python中for in的用法详解
Apr 17 Python
实例代码讲解Python 线程池
Aug 24 Python
python控制台打印log输出重复的解决方法
May 14 Python
详解Flask开发技巧之异常处理
Jun 15 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
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
PHP4实际应用经验篇(7)
2006/10/09 PHP
php使用ICQ网关发送手机短信
2013/10/30 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python重试装饰器示例
2014/02/11 Python
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
讲解Python中fileno()方法的使用
2015/05/24 Python
深入解析Python编程中JSON模块的使用
2015/10/15 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
python 导入数据及作图的实现
2019/12/03 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
Python 如何创建一个简单的REST接口
2020/07/30 Python
自我推荐书
2013/12/04 职场文书
阿德的梦教学反思
2014/02/06 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
吃通javascript正则表达式
2021/04/21 Javascript