【详解】批量下载b站壁纸站首页的所有壁纸

本例,我们来实现批量下载b站壁纸站首页的所有壁纸。

实现下载,首先要找到下载链接,我们通过查看下载按钮元素,得到的下载链接形式如下:

http://h.bilibili.com/wallpaper?action=download&img_id=147929
http://h.bilibili.com/wallpaper?action=download&img_id=147930
http://h.bilibili.com/wallpaper?action=download&img_id=147928
发现下载url是由固定的字符串

http://h.bilibili.com/wallpaper?action=download&img_id=
和图片id拼出来的!

我们需要得到这个图片id!

直接从返回来的网站首页HTML找,发现搜索不到!即,id是动态信息!

不是js计算得到,就是json返回的数据!
经过筛查,我们在json类型的请求反馈中找到了图片id数据。

【详解】批量下载b站壁纸站首页的所有壁纸_第1张图片

json 类型的请求返回的,是json类型的数据!

我们需要对JSON数据进行解析!


【Python解析JSON数据】

我们以前使用Python解析过json数据,这里再回顾一下!

简单来说,使用Python解析json数据的要点就是两步:

1.json.loads

data=json.loads(resp)

2.一层一层剥开去找。

     因为json数据往往是由字典类型和列表类型的数据组合而成的。一层一层去剥就能够找到!

     字典dict类型数据,用名字定位;

     列表list类型数据,用下标标号定位。

     所以寻找的时候,需要判断数据类型,使用print type(data)来判断!

通过解析数据,我们可以拿到图片ID,拼出下载字符串,剩下的就是循环下载了!

全部代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

__author__ = "$Author: wangxin.xie$"
__version__ = "$Revision: 1.0 $"
__date__ = "$Date: 2015-12-07 11:09$"

###############################################################
# 功能:批量下载b站壁纸站首页的所有壁纸
###############################################################
import urllib
import urllib2
import datetime
import sys
import json

###################全局变量#######################################

#################################################################
def getData():
    mainUrl="http://h.bilibili.com/wallpaperApi?action=getOptions&page=1"
    resp=urllib2.urlopen(mainUrl).read()
    data=json.loads(resp)
    return data
def toPic():
    data=getData()
    for i in range(1, 103):
        id=data[i]['detail'][0]['id']
        picUrl="http://h.bilibili.com/wallpaper?action=download&img_id="+id
        picName="D:\\pic\\"+str(i)+".png"
        try:
            urllib.urlretrieve(picUrl, picName)
        except Exception, e:
            print str(e)
        print 'NO'+str(i)+' Pic Saved!'

def main():
    print "===%s start===%s"%(sys.argv[0], datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"))
    toPic()
    print "===%s end===%s"%(sys.argv[0], datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"))

if __name__ == "__main__":
    main()
其中的循环范围:
   for i in range(1, 103):

是因为我们分析看到的json数据一共有103个Object,所以定了这个范围。

其中壁纸文件的后缀名:

picName="D:\\pic\\"+str(i)+".png"
是我们分析了大多数壁纸文件判断得到的。


【网络问题导致程序异常中断的处理】

我们在测试如上代码时,出现过程序异常中断的情况,原因是网络问题,导致下载出错!

程序报错,导致脚本运行直接中断,不能下载之后的壁纸文件。这里就涉及到了异常处理。

处理方法:

        try:
            urllib.urlretrieve(picUrl, picName)
        except Exception, e:
            print str(e)

打印错误信息!

即,如果遇到下载出错,打印出错信息后,进入下一轮循环。

这里我们才体会到了,异常处理的好处!

好处之一就是能够在循环出错的情况下,跳过错误循环,执行完整个程序!







你可能感兴趣的:(python,23,planB)