download-bing-py3.py
· 4.2 KiB · Python
Неформатований
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Create By Doracoin
# Github: https://github.com/doracoin
import json
import os
import sys
import urllib.error
import urllib.request
# 要查询的天数(尽量写大点, 反正最多只能查询到当天和过去7天的)
days = 1
# 超时时间
time_out = 10
# 是否下载全部可能支持的分辨率(大部分图片都有三个分辨率, 1920x1200, 1920x1080, 1366x768, 其中只有1920x1200有水印)
all_px = True
# 默认保存路径
down_dir = "." + os.path.sep + "bing_wallpaper"
# 接口地址
data_url = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n='
bingUrl = "".join([data_url, str(days)])
for i in range(0, len(sys.argv)):
if i == len(sys.argv) - 1:
key = sys.argv[i]
value = ""
else:
key = sys.argv[i]
value = sys.argv[i + 1]
# print "key: %s, value: %s" % (key, value)
if "-d" == key:
days = value
bingUrl = "".join([data_url, str(days)])
if "-t" == key:
ime_out = int(value)
if "-a" == key:
if "yes" == str(value).lower() or "y" == str(value).lower():
all_px = True
else:
all_px = False
if "-p" == key:
down_dir = value
if i < 2 and ("-h" == key or "-help" == key or "--help" == key):
print(" -d (number) 指定查询的天数, 最多只能查询到当天和过去7天的")
print(" -t (number) 请求超时时间, 单位:秒")
print(" -a (y/n, Y/N) 是否尝试下载所有分辨率的图片, 默认 yes")
print(" -p (string) 指定图片保存路径, 注意你的系统的分隔符 '\\' or '/'")
print(" -h 显示帮助")
exit(0)
def download_img(url):
try:
target_file_path = down_dir + os.path.sep + check_base_url(os.path.basename(url))
if not os.path.exists(target_file_path):
img_data = urllib.request.urlopen(url).read()
fp = open(target_file_path, 'wb')
fp.write(img_data)
fp.close()
print(url, "图片下载成功")
else:
print(url, "该图片已存在,跳过")
except urllib.error.HTTPError as err:
print(url, "该图片无法下载:", err.code, "" if err.reason is None else err.reason)
except OSError:
print("发生异常")
def get_bing_wallpaper():
global res_data
if not os.path.exists(down_dir):
os.makedirs(down_dir)
req = urllib.request.urlopen(url=bingUrl, timeout=time_out)
try:
res_data = req.read()
print("请求壁纸信息成功,正在解析\n")
except urllib.error.URLError as err:
print("查询接口失败,有可能是网络问题,或是Bing官方关闭了这个接口,请稍后重试", "" if err.reason is None else err.reason)
exit()
s = json.loads(res_data)
img_counts = len(s["images"])
for index in range(0, img_counts):
# item_url = s["images"][index]["url"] # 默认1920x1080分辨率: 2019-5-6:接口数据变动,该字段不便直接使用
item_url_base = s["images"][index]["urlbase"] # 图片baseurl,可以拼接分辨率
# 1920x1080
download_img("http://www.bing.com" + item_url_base + "_1920x1080.jpg")
if all_px:
# 1366x768
download_img("http://www.bing.com" + item_url_base + "_1366x768.jpg")
# 1920x1200 (有水印)
download_img("http://www.bing.com" + item_url_base + "_1920x1200.jpg")
print("\n")
# 该接口返回BaseUrl格式曾经有过变动,
# 为了防止以后再次遇到变动,
# 所以此处单独写一个函数方便扩展
def check_base_url(base_url):
base_url = str.replace(base_url, 'th?id=OHR.', '')
return base_url
if __name__ == '__main__':
print("\nWelcome to use <Bing Wallpaper Downloader v1.6>\n")
if down_dir.startswith('.'):
print("文件将会被下载到: ", os.path.dirname(sys.argv[0]) + down_dir[1:])
else:
print("文件将会被下载到: ", down_dir)
print("是否尝试多分辨率: ", "是" if all_px is True else "否")
print("尝试查询天数: ", days, "\n")
# 开始下载
get_bing_wallpaper()
| 1 | #!/usr/bin/env python |
| 2 | # -*- coding: utf-8 -*- |
| 3 | # Create By Doracoin |
| 4 | # Github: https://github.com/doracoin |
| 5 | |
| 6 | import json |
| 7 | import os |
| 8 | import sys |
| 9 | import urllib.error |
| 10 | import urllib.request |
| 11 | |
| 12 | # 要查询的天数(尽量写大点, 反正最多只能查询到当天和过去7天的) |
| 13 | days = 1 |
| 14 | # 超时时间 |
| 15 | time_out = 10 |
| 16 | # 是否下载全部可能支持的分辨率(大部分图片都有三个分辨率, 1920x1200, 1920x1080, 1366x768, 其中只有1920x1200有水印) |
| 17 | all_px = True |
| 18 | # 默认保存路径 |
| 19 | down_dir = "." + os.path.sep + "bing_wallpaper" |
| 20 | # 接口地址 |
| 21 | data_url = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=' |
| 22 | bingUrl = "".join([data_url, str(days)]) |
| 23 | |
| 24 | for i in range(0, len(sys.argv)): |
| 25 | if i == len(sys.argv) - 1: |
| 26 | key = sys.argv[i] |
| 27 | value = "" |
| 28 | else: |
| 29 | key = sys.argv[i] |
| 30 | value = sys.argv[i + 1] |
| 31 | # print "key: %s, value: %s" % (key, value) |
| 32 | if "-d" == key: |
| 33 | days = value |
| 34 | bingUrl = "".join([data_url, str(days)]) |
| 35 | if "-t" == key: |
| 36 | ime_out = int(value) |
| 37 | if "-a" == key: |
| 38 | if "yes" == str(value).lower() or "y" == str(value).lower(): |
| 39 | all_px = True |
| 40 | else: |
| 41 | all_px = False |
| 42 | if "-p" == key: |
| 43 | down_dir = value |
| 44 | if i < 2 and ("-h" == key or "-help" == key or "--help" == key): |
| 45 | print(" -d (number) 指定查询的天数, 最多只能查询到当天和过去7天的") |
| 46 | print(" -t (number) 请求超时时间, 单位:秒") |
| 47 | print(" -a (y/n, Y/N) 是否尝试下载所有分辨率的图片, 默认 yes") |
| 48 | print(" -p (string) 指定图片保存路径, 注意你的系统的分隔符 '\\' or '/'") |
| 49 | print(" -h 显示帮助") |
| 50 | exit(0) |
| 51 | |
| 52 | |
| 53 | def download_img(url): |
| 54 | try: |
| 55 | target_file_path = down_dir + os.path.sep + check_base_url(os.path.basename(url)) |
| 56 | if not os.path.exists(target_file_path): |
| 57 | img_data = urllib.request.urlopen(url).read() |
| 58 | fp = open(target_file_path, 'wb') |
| 59 | fp.write(img_data) |
| 60 | fp.close() |
| 61 | print(url, "图片下载成功") |
| 62 | else: |
| 63 | print(url, "该图片已存在,跳过") |
| 64 | |
| 65 | except urllib.error.HTTPError as err: |
| 66 | print(url, "该图片无法下载:", err.code, "" if err.reason is None else err.reason) |
| 67 | except OSError: |
| 68 | print("发生异常") |
| 69 | |
| 70 | |
| 71 | def get_bing_wallpaper(): |
| 72 | global res_data |
| 73 | if not os.path.exists(down_dir): |
| 74 | os.makedirs(down_dir) |
| 75 | req = urllib.request.urlopen(url=bingUrl, timeout=time_out) |
| 76 | try: |
| 77 | res_data = req.read() |
| 78 | print("请求壁纸信息成功,正在解析\n") |
| 79 | except urllib.error.URLError as err: |
| 80 | print("查询接口失败,有可能是网络问题,或是Bing官方关闭了这个接口,请稍后重试", "" if err.reason is None else err.reason) |
| 81 | exit() |
| 82 | s = json.loads(res_data) |
| 83 | img_counts = len(s["images"]) |
| 84 | for index in range(0, img_counts): |
| 85 | # item_url = s["images"][index]["url"] # 默认1920x1080分辨率: 2019-5-6:接口数据变动,该字段不便直接使用 |
| 86 | item_url_base = s["images"][index]["urlbase"] # 图片baseurl,可以拼接分辨率 |
| 87 | # 1920x1080 |
| 88 | download_img("http://www.bing.com" + item_url_base + "_1920x1080.jpg") |
| 89 | if all_px: |
| 90 | # 1366x768 |
| 91 | download_img("http://www.bing.com" + item_url_base + "_1366x768.jpg") |
| 92 | # 1920x1200 (有水印) |
| 93 | download_img("http://www.bing.com" + item_url_base + "_1920x1200.jpg") |
| 94 | print("\n") |
| 95 | |
| 96 | |
| 97 | # 该接口返回BaseUrl格式曾经有过变动, |
| 98 | # 为了防止以后再次遇到变动, |
| 99 | # 所以此处单独写一个函数方便扩展 |
| 100 | def check_base_url(base_url): |
| 101 | base_url = str.replace(base_url, 'th?id=OHR.', '') |
| 102 | return base_url |
| 103 | |
| 104 | |
| 105 | if __name__ == '__main__': |
| 106 | print("\nWelcome to use <Bing Wallpaper Downloader v1.6>\n") |
| 107 | if down_dir.startswith('.'): |
| 108 | print("文件将会被下载到: ", os.path.dirname(sys.argv[0]) + down_dir[1:]) |
| 109 | else: |
| 110 | print("文件将会被下载到: ", down_dir) |
| 111 | print("是否尝试多分辨率: ", "是" if all_px is True else "否") |
| 112 | print("尝试查询天数: ", days, "\n") |
| 113 | |
| 114 | # 开始下载 |
| 115 | get_bing_wallpaper() |