python爬虫实战选择wallhaven网站去爬取壁纸。
wallhaven网站有大量精美的壁纸,但在国内无法直接下载,所以我们准备设计和实现一个爬取壁纸网站的爬虫。下载国外壁纸网站的精美图片,并可以自动新建文件夹保存图片,可保存到百度网盘,自动选择下载的页数,下载图片的数量,选择图片的分辨率,和图片的大小。
第一步:先导入需要的库
#导入所需要的库
import requests
import re
import os
from bypy import ByPy
from PIL import Image
import os.path
import glob
第二步:就是各种各样的查找方式获取url
def get_url(base_url):
# keyword=input("请输入英文关键词:")
if keyword=='toplist': #获取排行榜的url模板
base_url=base_url+keyword+'?page='
else: #获取基于关键词
base_url=base_url+'search?q='+keyword+'&page='
# base_url=base_url+'search?q='+keyword+'&categories=110&purity=100&ratios='+radio+'&sorting=relevance&order=desc'+'&page='
return base_url
#通过图片大小进行查找
def get_url_radio(base_url_radio):
if keyword=='toplist': #获取排行榜的url模板
base_url_radio=base_url+keyword+'?page='
else: #获取基于关键词
# base_url=base_url+'search?q='+keyword+'&page='
base_url_radio=base_url_radio+'search?q='+keyword+'&categories=110&purity=100&ratios='+radio+'&sorting=relevance&order=desc'+'&page='
return base_url_radio
#通过具体分辨率进行查找
def get_url_radios(base_url_radios):
if keyword=='toplist': #获取排行榜的url模板
base_url_radio=base_url+keyword+'?page='
else: #获取基于关键词
#base_url=base_url+'search?q='+keyword+'&page='
#https://wallhaven.cc/search?q=anime&categories=110&purity=100&atleast=1920x1080&ratios=16x9&sorting=relevance&order=desc
base_url_radios=base_url_radios+'search?q='+keyword+'&categories=110&purity=100&atleast='+radios+'&ratios='+radio+'&sorting=relevance&order=desc'+'&page='
return base_url_radios
第三步:获取每页每张壁纸缩略图的url并存放在一个列表中
def get_img_url(base_url):
header={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36 Edg/96.0.1054.53'
} #模拟浏览器头部,伪装成用户
img_url_list=[] #创建一个空列表
page_num=input("请输入下载页数:")
for num in range(1,int(page_num)+1): #循环遍历每页
new_url=base_url+str(num) #将模板进行拼接得到每页壁纸完整的url
page_text=requests.get(url=new_url,headers=header).text #获取url源代码
ex='<a class="preview" href="(.*?)"'
img_url_list+=re.findall(ex,page_text,re.S) #利用正则表达式从源代码中截取每张壁纸缩略图的url并全部存放在一个列表中
return img_url_list #返回列表
第四步:将列表中的壁纸缩略图的url进行字符串的增删获得壁纸原图下载的url,下载后存放在文件夹中
def download_img(img_url_list):
header={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36 Edg/96.0.1054.53'
} #模拟浏览器头部,伪装成用户
# key_word=input("请再次输入关键词以方便创建文件夹:")
count=int(input("请输入下载壁纸数量:"))
if not os.path.exists('E:/wallpapers'): #在E盘目录下创建一个名为wallpapers的文件夹
os.mkdir('E:/wallpapers')
path='E:/wallpapers/'+key_word
if not os.path.exists(path): #在wallpapers文件夹下创建一个以关键词命名的子文件夹以存放此次下载的所有壁纸
os.mkdir(path)
for i in range(count): #遍历列表,对每张壁纸缩略图的url进行字符串的增删获得壁纸原图下载的url
x=img_url_list[i].split('/')[-1] #获取最后一个斜杠后面的字符串
a=x[0]+x[1] #获取字符串的前两位
img_url='https://w.wallhaven.cc/full/'+a+'/wallhaven-'+x+'.jpg'
code=requests.get(url=img_url,headers=header).status_code
if code==404:
img_url='https://w.wallhaven.cc/full/'+a+'/wallhaven-'+x+'.png'
img_data=requests.get(url=img_url,headers=header,timeout=20).content
img_name=img_url.split('-')[-1] #生成图片名字
img_path=path+'/'+img_name
with open(img_path,'wb') as fp:
fp.write(img_data)
print(img_name,'下载成功') #每张图片下载成功后提示
第五步:就是把图片下载下来进行一个改名操作
class BatchRename(): #定义一个重命名的类
def __init__(self):
self.path ='E:/wallpapers/'+key_word
def rename(self):
filelist = os.listdir(self.path)
total_num = len(filelist)
i = 0
for item in filelist:
if item.endswith('.png'): #将bmp格式的图片改为jpg
src = os.path.join(os.path.abspath(self.path), item)
dst = os.path.join(os.path.abspath(self.path), key_word + str(i) + '.jpg') #重新命名并改格式
try:
os.rename(src, dst)
print('converting %s to %s ...' % (src, dst))
i = i + 1
except:
continue
for item in filelist:
if item.endswith('.jpg'):
src = os.path.join(os.path.abspath(self.path), item)
dst = os.path.join(os.path.abspath(self.path), key_word + str(i) + '.jpg') ##重新命名
try:
os.rename(src, dst)
print('converting %s to %s ...' % (src, dst))
i = i + 1
except:
continue
第六步:百度网盘操作
#上传到网盘后删除本地文件的图片节约空间
def del_pic():
for infile in glob.glob(os.path.join(path, '*.jpg')):
os.remove(infile)
# 将下载到本地的壁纸上传到百度网盘
class BaiduNetdisk(object):
def __init__(self):
self.bp = ByPy()
def upload(self):
filePath = r'E:\wallpapers'
self.bp.upload(filePath)
最后编写主函数
#编写主函数并调用
def main(url):
#对基于关键字的调用
base_url=get_url(url)
#对壁纸大小的调用
base_url_radio=get_url_radio(base_url)
#对壁纸具体的分辨率的调用
base_url_radios=get_url_radios(base_url_radio)
#对url的列表调用并下载
img_url_list=get_img_url(base_url_radios)
download_img(img_url_list)
#修改图片
demo = BatchRename()
demo.rename()
# 进行百度网盘的文件上传
bp=BaiduNetdisk()
bp.upload()
print("上传成功")
#调用函数
del_pic()
main('https://wallhaven.cc/')