复习Python爬取必应的壁纸

傅胡媚
2023-12-01

对于bing上的精美壁纸垂涎已久,也看过好多人写的爬取代码,时常想一天爬取一下未免也太麻烦了吧,直到今天看到这个博客,介绍了一个收集了bing精美图片的网站,眼睛放光.jpg

##原文链接:链接: link.

简介

必应是微软推出的搜索引擎,相比于百度具有广告少的显著优点,比较良心。以下为必应的网址:https://cn.bing.com/
经常使用必应应该可以发现,其主页每天都会更新一张图片,博主发现这些图片非常符合博主的审美,希望每天能够下载收藏每张图片。幸运的是已经有人完成了这项工作,具体请看这个网站:必应每日高清壁纸(https://bing.ioliu.cn/)
这个网站收录了必应每天的主页图片,并且提供直接下载(管理猿太良心了,祝愿少掉一些头发,少写一些bug來來來)。但是博主发现这个网站缺少一个一键全部下载功能,只能一张一张图片手动下载,如果要把所有图片都下载下来,非常麻烦,因此用python写了一个下载网站上所有图片的小爬虫,分享给大家。

二、使用的环境

python3.8.1(较新版本都可)
requests库(需要使用pip工具下载该库)
re库(python自带,不用下载,直接导入就行)
bs4库(需要使用pip工具下载该库)## 如何改变文本的样式

操作过程

对网站的解析此处不多介绍,自己去原网站链接: link.了解查看去

import os
import time
import threading
import re
import requests
from bs4 import BeautifulSoup	
''' ***在博主的介绍网页的基础对源代码进行优化
    ***原博主的博客链接为:https://blog.csdn.net/qq153471503/article/details/89476026
    ***在其基础上进行改进  一为降低爬取速度防止网站检测爬虫封IP
                          二为添加部分优化代码,对原来存在的图片不在进行重复下载,提高效率
'''
path = "Pictures" #读取相对路劲下的目标文件内所有的文件
files= os.listdir(path)

def GetMaxPageCount():
    # 获取主页信息,并且获取网站的最大页数
    #对目的的页面进行解析
    max_page_count = 0
    url = 'https://bing.ioliu.cn/'
    soup = BeautifulSoup(GetHtmlText(url).text, "html.parser")
    tag_page = soup.find('div', {'class':'page'})
    page_txt = None
    for tag_child in tag_page.children:
        if(tag_child.name == 'span'):
            page_txt = tag_child.string
            match = re.search(r'(?<=1 / )\d*', page_txt)
            max_page_count = int(match.group(0))
    return max_page_count
def GetHtmlText(url):
    # 根据传入的url得到的数据
    try:
        #尽可能的模仿客户端进行操纵
        user_agent = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'}
        rspon = requests.get(url, headers = user_agent)
        rspon.encoding = rspon.apparent_encoding
        rspon.raise_for_status()
    except:
        print('网页获取失败:', rspon.status_code)
        return None
    return rspon



def SavePictureInUrl(pic_url,pic_name,pic_path):
    # 根据传入的url链接获取图片的二进制数据,并且根据传入的路径和文件名将文件写入到对应的路径中。
    source = GetHtmlText(pic_url)
    if source == None:
        return
    file_name = '{}.jpg'.format(pic_name)
    file = open(pic_path+file_name, "wb")    #以二进制写的方式打开文件。
    file.write(source.content)
    file.close()

def GetOnePageJpg(page_count, pic_path):
    # 从返回的网页数据中获取每张图片的相关信息以及图片下载的url,然后调用相关函数下载图片
    url = 'https://bing.ioliu.cn/?p={}'.format(page_count)
    suop = BeautifulSoup(GetHtmlText(url).text, 'html.parser')
    tag_container = suop.find_all('div', {'class':'container'})
    tag_item = tag_container[1]
    url_photo = 'https://bing.ioliu.cn'
    for tag_pic in tag_item.children:
        time.sleep(2) #降低爬取速度
        tag_title = tag_pic.find('h3')
        text_title = tag_title.string
        a = re.findall(r'[^\*"/:?\\|<>]', text_title, re.S)     
        text_title = ''.join(a)
        tag_calendar = tag_pic.find('p', {'class':'calendar'})
        tag_em = tag_calendar.find('em')
        text_calendar = tag_em.string
        text_pic_name = text_calendar + '__' + text_title
        if text_pic_name  not  in files: #进行数据检测
            # 获取图片的下载url
            tag_download = tag_pic.find('a', {'class':'ctrl download'})
            url_pic = url_photo + tag_download['href']
            #信息保存到图片中
            SavePictureInUrl(url_pic, text_pic_name, pic_path)
            print('.', end='', flush=True)        #输出进度信息

def GetAllPageJpg(pic_path):
    # 爬取所有的图片,并保存在输入的路径参数下
    max_page_count = GetMaxPageCount()
    for page_index in range(1, max_page_count):
        GetOnePageJpg(page_index, pic_path)
        print('\r', '正在获取,已完成:{:.2f} %'.format(page_index/max_page_count*100), end = '', flush=True)      #输出进度信息



def main():
    # 程序执行
    pic_path = 'C://Users//surface//Desktop//Python_GraspPic//'   #文件保存路径
    GetAllPageJpg(pic_path)
main()       

复习Python爬取必应的一些网站

  • 简介
    • 操作
      • 实现
 类似资料: