##原文链接:链接: 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()