编写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中zip()函数用法实例教程
Jul 31 Python
跟老齐学Python之永远强大的函数
Sep 14 Python
深入理解Python中变量赋值的问题
Jan 12 Python
django 常用orm操作详解
Sep 13 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
python中实现将多个print输出合成一个数组
Apr 19 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
python 提取tuple类型值中json格式的key值方法
Dec 31 Python
matplotlib.pyplot绘图显示控制方法
Jan 15 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 Python
Django项目如何获得SSL证书与配置HTTPS
Apr 30 Python
python playwright之元素定位示例详解
Jul 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
php中Ctype函数用法详解
2014/12/09 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
2016/06/12 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
jstree的简单实例
2016/12/01 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
Vue CL3 配置路径别名详解
2019/05/30 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
python实现自动化上线脚本的示例
2019/07/01 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
python爬虫中多线程的使用详解
2019/09/23 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
SQL语言面试题
2013/08/27 面试题
平面设计的岗位职责
2013/11/08 职场文书
高三历史教学反思
2014/01/09 职场文书
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python