编写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编写一个模仿CPU工作的程序
Apr 16 Python
Python读取图片属性信息的实现方法
Sep 11 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
简单谈谈python基本数据类型
Sep 26 Python
Python Numpy库安装与基本操作示例
Jan 08 Python
详解小白之KMP算法及python实现
Apr 04 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
python  logging日志打印过程解析
Oct 22 Python
Python基于os.environ从windows获取环境变量
Jun 09 Python
Selenium 配置启动项参数的方法
Dec 04 Python
如何使用Python实现一个简易的ORM模型
May 12 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 无线电
推荐5款跨平台的PHP编辑器
2014/12/25 PHP
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
Jquery图片滚动与幻灯片的实例代码
2013/04/08 Javascript
取消选中单选框radio的三种方式示例介绍
2013/12/23 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
基于ant design日期控件使用_仅月份的操作
2020/10/27 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
python turtle 绘制太极图的实例
2019/12/18 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
详解Canvas事件绑定
2018/06/27 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
物业经理求职自我评价
2013/09/22 职场文书
梅花魂教学反思
2014/04/25 职场文书
项目经理任命书范本
2014/06/05 职场文书
村级四风对照检查材料
2014/08/24 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
领导班子对照检查材料
2014/09/22 职场文书
个人租房协议书(范本)
2014/10/14 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
Java使用HttpClient实现文件下载
2022/08/14 Java/Android