编写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中的闭包实例详解
Aug 29 Python
Python类的多重继承问题深入分析
Nov 09 Python
python爬虫使用cookie登录详解
Dec 27 Python
Tensorflow环境搭建的方法步骤
Feb 07 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
Apr 08 Python
Python 16进制与中文相互转换的实现方法
Jul 09 Python
Sanic框架请求与响应实例分析
Jul 16 Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
Python中的引用和拷贝实例解析
Nov 14 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
PyCharm中如何直接使用Anaconda已安装的库
May 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
短波的认识
2021/03/01 无线电
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
Smarty模板配置实例简析
2019/07/20 PHP
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
javascript中this做事件参数相关问题解答
2013/03/17 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
详解Bootstrap插件
2016/04/25 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
Node.js 使用流实现读写同步边读边写功能
2017/09/11 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
python创建关联数组(字典)的方法
2015/05/04 Python
python实现二叉树的遍历
2017/12/11 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
程序集与命名空间有什么不同
2014/07/25 面试题
工业自动化专业毕业生推荐信
2013/11/18 职场文书
医学专业毕业生个人的求职信
2013/12/04 职场文书
实习单位评语
2014/04/26 职场文书
机械工程及自动化专业求职信
2014/09/03 职场文书
催款通知书范文
2015/04/17 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
Django与数据库交互的实现
2021/06/03 Python