Python3 爬虫 - 爬取 bing 高清桌面大图

引言

看到 bing 的高清大图,觉得质量都很高,都挺好看的,升到 window 10 以后,每次开机的画面都不一样,也觉得很有特点,我们来做一个简单的抓图 Demo 版脚本。

版权所有:_ OE _, 转载请注明出处:http://blog.csdn.net/csnd_ayo

简介

操作系统: window 10
编程环境:Python 3.6.1
编程IDE:PyCharm


  • 引言
  • 简介
  • bing 接口
  • 总纲
  • 函数
  • 调用
  • 源码
  • 效果


bing 接口

首先来介绍一下,我通过请求 bing 搜索引擎的时候,截取到的一个 http 请求接口。

Python3 爬虫 - 爬取 bing 高清桌面大图_第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
*/

总纲

一个抓图的过程,我们涉及以下几步:

  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('')
    #不带停,如果没找到则退出循环
    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)

效果

Python3 爬虫 - 爬取 bing 高清桌面大图_第2张图片

你可能感兴趣的:(Python,《Python,必知必会》)