bing背景图很不错,一直用别人的bing壁纸获取软件(大部分C#写的), 但是那些都或多或少不符合自己期望,不是会自动改桌面壁纸就是需要常驻后台,或者保存数量有上限。 然后想用python练个手。 看源码,有 g_img={url: 后面的url就是图片地址,点击右下角的上一页下一页可以换图片。 FF中的FireBug没找出具体路径,那就HttpFox来抓个包吧。

get it!有一串json加载进了一张jpeg和相关信息 http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&nc=1361089515117&FORM=HYLH1 返回的是一个json,格式化后如下

{
     images : [
        {
             startdate :  20150402 ,
             fullstartdate :  201504021600 ,
             enddate :  20150403 ,
             url :  http://s.cn.bing.net/az/hprichbg/rb/FranzJosef_ZH-CN6046406720_1920x1080.jpg ,
             urlbase :  /az/hprichbg/rb/FranzJosef_ZH-CN6046406720 ,
             copyright :  新西兰弗兰兹·约瑟夫冰河的徒步旅行者 (© Keri Oberly/Aurora Photos) ,
             copyrightlink :  http://www.bing.com/search?q=%E5%BC%97%E5%85%B0%E5%85%B9%C2%B7%E7%BA%A6%E7%91%9F%E5%A4%AB%E5%86%B0%E6%B2%B3&form=hpcapt&mkt=zh-cn ,
             wp : true,
             hsh :  7f487ef404037a5dda101b4febf83362 ,
             drk : 1,
             top : 1,
             bot : 1,
             hs : [
                {
                     desc :  它由大块的冰和雪块组成的,绵延12.1公里, ,
                     link :  http://www.bing.com/search?q=%E5%BC%97%E5%85%B0%E5%85%B9%C2%B7%E7%BA%A6%E7%91%9F%E5%A4%AB%E5%86%B0%E6%B2%B3&form=hphot1&mkt=zh-cn ,
                     query :  它是弗兰兹·约瑟夫冰河。 ,
                     locx : 21,
                     locy : 39
                },
                {
                     desc :  看过它的长相,你可能会猜想,会不会是某人不小心, ,
                     link :  http://www.bing.com/images/search?q=Franz+Josef+Glacier+in+New+Zealand&form=hphot2&mkt=zh-cn ,
                     query :  而将这个冰河掉落在两座山之间? ,
                     locx : 34,
                     locy : 49
                },
                {
                     desc :  在这,不要让你的背包或者车辆处于无人看守的情况…… ,
                     link :  http://www.bing.com/videos/search?q=%E5%95%84%E7%BE%8A%E9%B9%A6%E9%B9%89&form=hphot3&mkt=zh-cn ,
                     query :  聪明又狡猾的鸟儿正在旁盯着呢! ,
                     locx : 55,
                     locy : 38
                }
            ],
             msg : [
                {
                     title :  今日图片故事 ,
                     link :  http://www.bing.com/search?q=%E5%BC%97%E5%85%B0%E5%85%B9%C2%B7%E7%BA%A6%E7%91%9F%E5%A4%AB%E5%86%B0%E6%B2%B3&form=pgbar1&mkt=zh-cn ,
                     text :  弗兰兹·约瑟夫冰河,旅行者
                }
            ]
        }
    ],
     tooltips : {
         loading :  正在加载... ,
         previous :  上一页 ,
         next :  下一页 ,
         walle :  此图片不能下载用作壁纸。 ,
         walls :  下载今日美图。仅限用作桌面壁纸。
    }
}

知道API之后就好办了,话不多说,直接上代码

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# python3抓取bing主页所有背景图片
import urllib.request,re,sys,os,getopt,json
def get_bing_backphoto(index, path='bing_photos/'):
	url = 'http://cn.bing.com/HPImageArchive.aspx?format=js&idx='+str(index)+'&n=1&nc=1361089515117&FORM=HYLH1'
	html = urllib.request.urlopen(url).read()
	if html == 'null':
		print( 'open & read bing error!')
		sys.exit(-1)
	html = html.decode('utf-8')
	s = json.loads(html)
	if s!=None:
		date = s[ images ][0][ enddate ]
		imgurl = s[ images ][0][ url ]
		right = imgurl.rindex('/')
		name = imgurl.replace(imgurl[:right+1],'')
		savepath = path + date + '_' + name
		urllib.request.urlretrieve(imgurl, savepath)
		print (date + '_' + name + ' save success!')
def get_bing_all(num, savepath='photos/'):
	if (os.path.exists(savepath)== False):
		os.mkdir(savepath)
	for i in range(0,int(num)):
		get_bing_backphoto(i, savepath)
def usage():
	print( \n\tuse command like this:\n\t\t./bing.py [-n num] [-f savepath] )
	print( \n\tExample:\n\t\t./bing.py -n 17 -f bing_photos/ )
	print( \t参数:\n\t\tn\t获取最前n天的壁纸,默认为1(当天),由于bing网站只保留十几天的壁纸,最大取20 )
	print( \t\tf\t存放目录,支持相对路径和绝对路径,请以'/'结尾 )
opts, args = getopt.getopt(sys.argv[1:],  hn:f: )
num= 1
output_folder= bing_photos/
for op, value in opts:
	if op ==  -n :
		num = value if (int(value)<20) else '20'
	elif op ==  -f :
		output_folder = value if (value[-1]=='/') else (value + '/')
	elif op ==  -h :
		usage()
		sys.exit()
get_bing_all(num, output_folder)