看到 bing 的高清大图,觉得质量都很高,都挺好看的,升到 window 10 以后,每次开机的画面都不一样,也觉得很有特点,我们来做一个简单的抓图 Demo 版脚本。
版权所有:_ OE _, 转载请注明出处:http://blog.csdn.net/csnd_ayo
操作系统: window 10
编程环境:Python 3.6.1
编程IDE:PyCharm
首先来介绍一下,我通过请求 bing 搜索引擎的时候,截取到的一个 http 请求接口。
/*
* @param : format 返回的格式, js(json),xml
* @param : idx 图片下标
* @param : n 图片数量
* /
原请求:http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&nc=0&pid=hp&video=1
分析后:http://cn.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1
/*
* 可以通过截取xml的url部分与bing官网进行拼接,已达到获取高清图片的目的。
* 例如:http://www.bing.com/az/hprichbg/rb/Dipper_ZH-CN11205462091_1366x768.jpg
* 后缀的分辨率可以改成常用的显示屏分辨率,已达到修改照片分辨率的目的。
* 例如:http://www.bing.com/az/hprichbg/rb/Dipper_ZH-CN11205462091_1920*1080.jpg
*/
一个抓图的过程,我们涉及以下几步:
打开网页(获得网页源码)
检索网页(获得图片URL)
拼接URL(获得图片的真实地址)
保存图片
打开网页(获取图片数据)
保存本地(保存成本地文件)
对应总纲内的逻辑步骤,我们将实现4个函数
# 打开网页
def open_url(url):
pass
# 获得 response 中的图片 url
def find_picture_url(http_response):
pass
# url 拼接
def url_joint(picture_url):
pass
# 保存 url
def save_url_image(url,addr):
pass
根据总纲的逻辑步骤,我们将实现如下的调用
# 打开网页
http_response = open_url("url地址")
# 检索网页
temp_picture_url = find_picture_url(http_response)
# 拼接URL
picture_url = url_joint(temp_picture_url)
# 保存图片
save_url_image(picture_url, "1.jpg")
# -*- coding:utf-8 -*-
import urllib.request
import datetime
# @brief 打开网页
# url : 网页地址
# @return 返回网页数据
def open_url(url):
# 根据当前URL创建请求包
req = urllib.request.Request(url)
# 添加头信息,伪装成浏览器访问
req.add_header('User-Agent',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36')
# 发起请求
response = urllib.request.urlopen(req)
# 返回请求到的HTML信息
return response.read()
# 找图片
def find_picture_url(http_response):
# 查找当前页面所有图片的URL
http_response = http_response.decode('utf-8')
img_addrs = []
# 找图片
a = http_response.find('' )
#不带停,如果没找到则退出循环
while a != -1:
# 以a的位置为起点,找以jpg结尾的图片
b = http_response.find('', a, a+255)
# 如果找到就添加到图片列表中
if b != -1:
img_addrs.append(http_response[a+5:b])
# 否则偏移下标
else:
b = a + 5
# 继续找
a = http_response.find('' , b)
return img_addrs
# url 拼接
def url_joint(picture_url):
return "http://cn.bing.com/" + picture_url
# @brief 保存图片
# url : 图片url
# addr : 保存的地址
def save_picture(url,addr):
with open(addr, 'wb') as f:
img = open_url(url_joint(url))
if img:
f.write(img)
print("图片已保存")
return
i = 0
while i < 5:
i += 1
# [1] 打开网页
temp_str = "http://cn.bing.com/HPImageArchive.aspx?format=xml&idx=%d&n=100" % (i)
response = open_url(temp_str)
# [2] 找到图片
list_picture = find_picture_url(response)
local_time = datetime.datetime.now().microsecond
j = 0
# [3] 保存图片
for picture_url in list_picture:
j += 1
local_time_file_name = str(local_time) + str(j) + ".jpg"
print(local_time_file_name)
save_picture(picture_url, local_time_file_name)