引言
看到 bing 的高清大圖,覺得質量都很高,都挺好看的,升到 window 10 以後,每次開機的畫面都不一樣,也覺得很有特點,我們來做一個簡單的抓圖 Demo 版腳本。
版權所有:_ OE _, 轉載請註明出處:http://blog.csdn.net/csnd_ayo
簡介
操作系統: window 10
編程環境:Python 3.6.1
編程IDE:PyCharm
bing 接口
首先來介紹一下,我通過請求 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('<url>')
#不帶停,如果沒找到則退出循環
while a != -1:
# 以a的位置爲起點,找以jpg結尾的圖片
b = http_response.find('</url>', a, a+255)
# 如果找到就添加到圖片列表中
if b != -1:
img_addrs.append(http_response[a+5:b])
# 否則偏移下標
else:
b = a + 5
# 繼續找
a = http_response.find('<url>', 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)