Python3 爬蟲 - 爬取 bing 高清桌面大圖

引言

看到 bing 的高清大圖,覺得質量都很高,都挺好看的,升到 window 10 以後,每次開機的畫面都不一樣,也覺得很有特點,我們來做一個簡單的抓圖 Demo 版腳本。

版權所有:_ OE _, 轉載請註明出處:http://blog.csdn.net/csnd_ayo

簡介

操作系統: window 10
編程環境:Python 3.6.1
編程IDE:PyCharm



bing 接口

首先來介紹一下,我通過請求 bing 搜索引擎的時候,截取到的一個 http 請求接口。

1

/*
* @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
*/

2

總綱

一個抓圖的過程,我們涉及以下幾步:

  1. 打開網頁(獲得網頁源碼)

  2. 檢索網頁(獲得圖片URL)

  3. 拼接URL(獲得圖片的真實地址)

  4. 保存圖片

    1. 打開網頁(獲取圖片數據)

    2. 保存本地(保存成本地文件)

函數

對應總綱內的邏輯步驟,我們將實現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)

效果

3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章