获取bing 的每日一图 python 爬虫 壁纸

胡说八道的背景交代

一直对bing 的主页的图片流口水,然而,貌似那个不是挺好保存的,虽然可以通过审查元素,然后ctrl+f获取地址,然后保存,但是操作实在是繁琐。
前几个月的时候也曾网上百度过bing每日一图的爬虫代码。然而,真正的搜索结果感觉就2-3个。
比较不幸的是有着“只获取了国内版的”、“使用的python版本比较老以致我无法解决第三方依赖库”、“莫名的问题”等等之类的问题,里面有一个能爬取国内版的比较靠谱的,然后就算很开心了,但是那个貌似使用的是据说微博里bing给的一个什么图片地址的,然后只有国内版,所以尝试着改成国际版失败了。
于是那个时候立了个flag——有空的时候自己写一下爬虫去爬取。
忙了几个月学业之后,暑假总算有点自由的时间了。于是学了一下爬虫,迫不及待的就开始用爬虫来爬取bing首页图片了。

时间及相关软件版本备注

测试时间2019年7月15日

条目 版本
Python 3.7.2
bs4 0.0.1
beautifulsoup4 4.7.1
requests 2.22.0
lxml 4.3.4

代码

  • prepare.py
def edge_headers(host):
    headers = {
        'Host': host,
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763'
    }
    return headers


def download_img_headers(host):
    headers = {
        'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-Hans-CN, zh-Hans; q=0.8, en-US; q=0.5, en; q=0.3',
        'Host': host,
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763'
    }

  • get_background.py
import os
import sys
import datetime
import requests
from bs4 import BeautifulSoup
import prepare


def get_bg_img_link(url, host, link='https://cn.bing.com/'):
    # 获取bing首页
    headers = prepare.edge_headers(host)
    r = requests.get(url=url, timeout=2)
    print('页响应状态码:', r.status_code)

    # 利用BeautifulSoup解析bing首页获取背景图片地址的一部分
    # 以下主要是利用浏览器的审查元素
    # 所以要做修改的话,需要浏览器审查元素以做具体修改
    # 通过id定位
    soup = BeautifulSoup(r.text, "lxml")
    bg_img_link = soup.find("link", id="bgLink")['href']
    bg_img_link = bg_img_link[:bg_img_link.find('''&rf=''')]
    
    # 链接前半部分和后半部分拼接的细节处理
    # 避免两个斜杆('/')拼一起或者前后两部分都没有斜杆
    if link[-1] != '/':
        link += '/'
    if bg_img_link[0] == '/':
        bg_img_link = bg_img_link[1:]
    
    # 返回拼接好的完整的图片地址
    return link+bg_img_link


def get_img_and_save(img_link, host, prefix):
    filename = prefix + str(datetime.date.today()) + img_link[img_link.rfind('.'):]
    headers = prepare.download_img_headers(host)
    img = requests.get(url=img_link, headers=headers).content
    with open(filename, 'wb') as f:
        f.write(img)
    print(img_link)
    print('成功下载图片并保存为', filename)


def main():
    host = 'cn.bing.com'
    img_link = get_bg_img_link(url = 'https://cn.bing.com/?FORM=BEHPTB', host=host)
    get_img_and_save(img_link, host=host, prefix='国内版')
    
    img_link = get_bg_img_link(url = 'https://cn.bing.com/?FORM=BEHPTB&ensearch=1', host=host)
    get_img_and_save(img_link, host = host, prefix='国际版')
    print('运行完毕')



if __name__ == '__main__':
    main()

测试说明

目前仅仅测试过一次,成功的把国内版和国际版各一张爬下来了。
However, 大概就在15点30分。我再运行一次的时候,惊奇地发现居然国内版和国际版得到地是同一张图片,不知原因。
后来发现浏览器打开看到的也是同一张图片。另外我发现貌似bing现在首页不只一张图片了,右下角是有下一张可供切换的,以及有些图片是有下载按钮供直接下载当壁纸。这么看来bing已经很为用户着想了,不能下载的应该是版权方面的问题。
不过话说我这个程序发现发现问题也太快了,失效的优点快。让我哭一会儿。

你可能感兴趣的:(获取bing 的每日一图 python 爬虫 壁纸)