编写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 正则表达式操作指南
May 04 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
Python实现图片转字符画的示例代码
Aug 21 Python
python使用RNN实现文本分类
May 24 Python
python实现简单多人聊天室
Dec 11 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
Pytorch数据拼接与拆分操作实现图解
Apr 30 Python
Python代码中如何读取键盘录入的值
May 27 Python
Python如何实现FTP功能
May 28 Python
浅谈Python中的字符串
Jun 10 Python
python 贪心算法的实现
Sep 18 Python
关于Python字符编码与二进制不得不说的一些事
Oct 04 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
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
JS实现的四级密码强度检测功能示例
2017/05/11 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
Python实现基于权重的随机数2种方法
2015/04/28 Python
python实现K最近邻算法
2018/01/29 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
德国网上花店:Valentins
2018/08/15 全球购物
应届大学生自荐信格式
2013/09/21 职场文书
银行求职推荐信范文
2013/11/30 职场文书
幼儿园美术教学反思
2014/01/31 职场文书
学校节能减排倡议书
2014/05/16 职场文书
航海技术专业毕业生推荐信
2014/07/09 职场文书
英文感谢信格式
2015/01/21 职场文书
保研推荐信格式
2015/03/25 职场文书
工作简报怎么写
2015/07/21 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL
浅析python中特殊文件和特殊函数
2022/02/24 Python
PHP 时间处理类Carbon
2022/05/20 PHP