简介
壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物。然而,终究有一天你已经产生审美疲劳了,但你下定决定要换壁纸的时候,又发现网上的壁纸要么分辨率低,要么带有水印。
这里有一款Mac下的小清新壁纸神器Pap.er,可能是Mac下最好的壁纸软件,自带5K超清分辨率壁纸,富有多种类型壁纸,当我们想在Windows或者Linux下使用的时候,就可以考虑将5K超清分辨率壁纸爬取下来。
编写思路
首先,打开Charles软件,进行抓包。打开Pap.er,开始抓包。(由于是Mac系统下的APP,所以非Mac系统的朋友可以直接看抓包结果)
抓包分析结果如下:
参数page
不用改动,per_page
指的是每页提取的数量,也就是我们想要提取的图片数量。
抓完包之后,我们开始编写5K壁纸解析程序
-
# 爬取不同类型图片
-
def crawler_photo(type_id, photo_count):
-
-
# 最新 1, 最热 2, 女生 3, 星空 4
-
if(type_id ==
1):
-
url =
'https://service.paper.meiyuan.in/api/v2/columns/flow/5c68ffb9463b7fbfe72b0db0?page=1&per_page=' + str(photo_count)
-
elif(type_id ==
2):
-
url =
'https://service.paper.meiyuan.in/api/v2/columns/flow/5c69251c9b1c011c41bb97be?page=1&per_page=' + str(photo_count)
-
elif(type_id ==
3):
-
url =
'https://service.paper.meiyuan.in/api/v2/columns/flow/5c81087e6aee28c541eefc26?page=1&per_page=' + str(photo_count)
-
elif(type_id ==
4):
-
url =
'https://service.paper.meiyuan.in/api/v2/columns/flow/5c81f64c96fad8fe211f5367?page=1&per_page=' + str(photo_count)
-
-
-
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
-
# 获取图片链接列表数据,json格式
-
respond = requests.get(url, headers=headers)
-
# 对json格式转化为python对象
-
photo_data = json.loads(respond.content)
-
-
# 已经下载的图片张数
-
now_photo_count =
1
-
# 所有图片张数
-
all_photo_count = len(photo_data)
-
-
# 开始下载并保存5K分辨率壁纸
-
for photo
in photo_data:
-
-
# 创建一个文件夹存放我们下载的图片(若存在则不用重新创建)
-
if
not os.path.exists(
'./' + str(type_id)):
-
os.makedirs(
'./' + str(type_id))
-
-
# 准备下载的图片链接,5K超清壁纸链接
-
file_url = photo[
'urls'][
'raw']
-
-
# 准备下载的图片名称,不包含扩展名
-
file_name_only = file_url.split(
'/')
-
file_name_only = file_name_only[len(file_name_only)
-1]
-
-
# 准备保存到本地的完整路径
-
file_full_name =
'./' + str(type_id) +
'/' + file_name_only
-
-
# 开始下载图片
-
Down_load(file_url, file_full_name, now_photo_count, all_photo_count)
-
-
# 已经下载的图片数量加1
-
now_photo_count = now_photo_count +
1
根据不同类型的壁纸,创建不同的文件夹编号进行分类。
上面的Down_load()
函数是下载文件的意思,调用requests
库,具体代码如下:
-
# 文件下载器
-
def Down_load(file_url, file_full_name, now_photo_count, all_photo_count):
-
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
-
-
# 开始下载图片
-
with closing(requests.get(file_url, headers=headers, stream=
True))
as response:
-
chunk_size =
1024
# 单次请求最大值
-
content_size = int(response.headers[
'content-length'])
# 文件总大小
-
data_count =
0
# 当前已传输的大小
-
with open(file_full_name,
"wb")
as file:
-
for data
in response.iter_content(chunk_size=chunk_size):
-
file.write(data)
-
done_block = int((data_count / content_size) *
50)
-
data_count = data_count + len(data)
-
now_jd = (data_count / content_size) *
100
-
print(
"\r %s:[%s%s] %d%% %d/%d" % (file_full_name, done_block *
'█',
' ' * (
50 -
1 - done_block), now_jd, now_photo_count, all_photo_count), end=
" ")
-
-
# 下载完图片后获取图片扩展名,并为其增加扩展名
-
file_type = filetype.guess(file_full_name)
-
os.rename(file_full_name, file_full_name +
'.' + file_type.extension)
chunk_size
指的是单次请求的最大值,content_size
指的就是我们下载5K超清壁纸的大小,为了能够直观显示下载情况,所以添加了下载进度条的显示效果。核心代码为file.write(data)
。
下载完毕后,为了方便我们查看文件,所以需要给图片添加对应的扩展名,比如jpg,png,gif
,这里使用到filetype
库对文件进行解析,判断其类型。
最后,开始在main中爬取5K高清壁纸:
-
if __name__ ==
'__main__':
-
-
# 最新 1, 最热 2, 女生 3, 星空 4
-
# 爬取类型为3的图片(女生),一共准备爬取100张
-
print(
"程序已经开始运行,请稍等……")
-
crawler_photo(
1,
100)
-
crawler_photo(
2,
100)
-
crawler_photo(
3,
100)
-
crawler_photo(
4,
100)
使用教程
-
确保以下库均已安装:
-
# 如果没有安装,请使用pip install module安装
-
import requests
-
import filetype
-
import os
-
import json
-
from contextlib
import closing
演示图片
完整源代码
-
# -*- coding:utf-8 -*-
-
-
from requests
import get
-
from filetype
import guess
-
from os
import rename
-
from os
import makedirs
-
from os.path
import exists
-
from json
import loads
-
from contextlib
import closing
-
-
-
# 文件下载器
-
def Down_load(file_url, file_full_name, now_photo_count, all_photo_count):
-
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
-
-
# 开始下载图片
-
with closing(get(file_url, headers=headers, stream=
True))
as response:
-
chunk_size =
1024
# 单次请求最大值
-
content_size = int(response.headers[
'content-length'])
# 文件总大小
-
data_count =
0
# 当前已传输的大小
-
with open(file_full_name,
"wb")
as file:
-
for data
in response.iter_content(chunk_size=chunk_size):
-
file.write(data)
-
done_block = int((data_count / content_size) *
50)
-
data_count = data_count + len(data)
-
now_jd = (data_count / content_size) *
100
-
print(
"\r %s:[%s%s] %d%% %d/%d" % (file_full_name, done_block *
'█',
' ' * (
50 -
1 - done_block), now_jd, now_photo_count, all_photo_count), end=
" ")
-
-
# 下载完图片后获取图片扩展名,并为其增加扩展名
-
file_type = guess(file_full_name)
-
rename(file_full_name, file_full_name +
'.' + file_type.extension)
-
-
-
-
# 爬取不同类型图片
-
def crawler_photo(type_id, photo_count):
-
-
# 最新 1, 最热 2, 女生 3, 星空 4
-
if(type_id ==
1):
-
url =
'https://service.paper.meiyuan.in/api/v2/columns/flow/5c68ffb9463b7fbfe72b0db0?page=1&per_page=' + str(photo_count)
-
elif(type_id ==
2):
-
url =
'https://service.paper.meiyuan.in/api/v2/columns/flow/5c69251c9b1c011c41bb97be?page=1&per_page=' + str(photo_count)
-
elif(type_id ==
3):
-
url =
'https://service.paper.meiyuan.in/api/v2/columns/flow/5c81087e6aee28c541eefc26?page=1&per_page=' + str(photo_count)
-
elif(type_id ==
4):
-
url =
'https://service.paper.meiyuan.in/api/v2/columns/flow/5c81f64c96fad8fe211f5367?page=1&per_page=' + str(photo_count)
-
-
# 获取图片列表数据
-
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
-
respond = get(url, headers=headers)
-
photo_data = loads(respond.content)
-
-
# 已经下载的图片张数
-
now_photo_count =
1
-
-
# 所有图片张数
-
all_photo_count = len(photo_data)
-
-
# 开始下载并保存5K分辨率壁纸
-
for photo
in photo_data:
-
-
# 创建一个文件夹存放我们下载的图片
-
if
not exists(
'./' + str(type_id)):
-
makedirs(
'./' + str(type_id))
-
-
# 准备下载的图片链接
-
file_url = photo[
'urls'][
'raw']
-
-
# 准备下载的图片名称,不包含扩展名
-
file_name_only = file_url.split(
'/')
-
file_name_only = file_name_only[len(file_name_only)
-1]
-
-
# 准备保存到本地的完整路径
-
file_full_name =
'./' + str(type_id) +
'/' + file_name_only
-
-
# 开始下载图片
-
Down_load(file_url, file_full_name, now_photo_count, all_photo_count)
-
now_photo_count = now_photo_count +
1
-
-
-
-
if __name__ ==
'__main__':
-
-
# 最新 1, 最热 2, 女生 3, 星空 4
-
# 爬取类型为3的图片(女生),一共准备爬取20000张
-
wall_paper_id =
1
-
wall_paper_count =
10
-
while(
True):
-
-
# 换行符
-
print(
'\n\n')
-
-
# 选择壁纸类型
-
wall_paper_id = input(
"壁纸类型:最新壁纸 1, 最热壁纸 2, 女生壁纸 3, 星空壁纸 4\n请输入编号以便选择5K超清壁纸类型:")
-
# 判断输入是否正确
-
while(wall_paper_id != str(
1)
and wall_paper_id != str(
2)
and wall_paper_id != str(
3)
and wall_paper_id != str(
4)):
-
wall_paper_id = input(
"壁纸类型:最新壁纸 1, 最热壁纸 2, 女生壁纸 3, 星空壁纸 4\n请输入编号以便选择5K超清壁纸类型:")
-
-
-
# 选择要下载的壁纸数量
-
wall_paper_count = input(
"请输入要下载的5K超清壁纸的数量:")
-
# 判断输入是否正确
-
while(int(wall_paper_count) <=
0):
-
wall_paper_count = input(
"请输入要下载的5K超清壁纸的数量:")
-
-
-
# 开始爬取5K高清壁纸
-
print(
"正在下载5K超清壁纸,请稍等……")
-
crawler_photo(int(wall_paper_id), int(wall_paper_count))
-
print(
'\n下载5K高清壁纸成功!')
-
-
-
转载:https://blog.csdn.net/A_7878520/article/details/116491760
查看评论