【Python实战】爬取5K分辨率超清唯美壁纸

简介

壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物。然而,终究有一天你已经产生审美疲劳了,但你下定决定要换壁纸的时候,又发现网上的壁纸要么分辨率低,要么带有水印。

这里有一款Mac下的小清新壁纸神器Pap.er,可能是Mac下最好的壁纸软件,自带5K超清分辨率壁纸,富有多种类型壁纸,当我们想在Windows或者Linux下使用的时候,就可以考虑将5K超清分辨率壁纸爬取下来。

编写思路

首先,打开Charles软件,进行抓包。打开Pap.er,开始抓包。(由于是Mac系统下的APP,所以非Mac系统的朋友可以直接看抓包结果)

参数page不用改动,per_page指的是每页提取的数量,也就是我们想要提取的图片数量。

抓完包之后,我们开始编写5K壁纸解析程序

  1. # 爬取不同类型图片
  2. def crawler_photo(type_id, photo_count):
  3. # 最新 1, 最热 2, 女生 3, 星空 4
  4. if(type_id == 1):
  5. url = 'https://service.paper.meiyuan.in/api/v2/columns/flow/5c68ffb9463b7fbfe72b0db0?page=1&per_page=' + str(photo_count)
  6. elif(type_id == 2):
  7. url = 'https://service.paper.meiyuan.in/api/v2/columns/flow/5c69251c9b1c011c41bb97be?page=1&per_page=' + str(photo_count)
  8. elif(type_id == 3):
  9. url = 'https://service.paper.meiyuan.in/api/v2/columns/flow/5c81087e6aee28c541eefc26?page=1&per_page=' + str(photo_count)
  10. elif(type_id == 4):
  11. url = 'https://service.paper.meiyuan.in/api/v2/columns/flow/5c81f64c96fad8fe211f5367?page=1&per_page=' + str(photo_count)
  12. 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'}
  13. # 获取图片链接列表数据,json格式
  14. respond = requests.get(url, headers=headers)
  15. # 对json格式转化为python对象
  16. photo_data = json.loads(respond.content)
  17. # 已经下载的图片张数
  18. now_photo_count = 1
  19. # 所有图片张数
  20. all_photo_count = len(photo_data)
  21. # 开始下载并保存5K分辨率壁纸
  22. for photo in photo_data:
  23. # 创建一个文件夹存放我们下载的图片(若存在则不用重新创建)
  24. if not os.path.exists('./' + str(type_id)):
  25. os.makedirs('./' + str(type_id))
  26. # 准备下载的图片链接,5K超清壁纸链接
  27. file_url = photo['urls']['raw']
  28. # 准备下载的图片名称,不包含扩展名
  29. file_name_only = file_url.split('/')
  30. file_name_only = file_name_only[len(file_name_only) -1]
  31. # 准备保存到本地的完整路径
  32. file_full_name = './' + str(type_id) + '/' + file_name_only
  33. # 开始下载图片
  34. Down_load(file_url, file_full_name, now_photo_count, all_photo_count)
  35. # 已经下载的图片数量加1
  36. 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) * 100print('\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高清壁纸:

  1. if __name__ == '__main__':
  2. # 最新 1, 最热 2, 女生 3, 星空 4
  3. # 爬取类型为3的图片(女生),一共准备爬取100张
  4. print('程序已经开始运行,请稍等……')
  5. crawler_photo(1, 100)
  6. crawler_photo(2, 100)
  7. crawler_photo(3, 100)
  8. crawler_photo(4, 100)

使用教程

  1. 确保以下库均已安装:

# 如果没有安装,请使用pip install module安装import requestsimport filetypeimport osimport jsonfrom contextlib import closing

演示图片

完整源代码

  1. # -*- coding:utf-8 -*-
  2. from requests import get
  3. from filetype import guess
  4. from os import rename
  5. from os import makedirs
  6. from os.path import exists
  7. from json import loads
  8. from contextlib import closing
  9. # 文件下载器
  10. def Down_load(file_url, file_full_name, now_photo_count, all_photo_count):
  11. 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'}
  12. # 开始下载图片
  13. with closing(get(file_url, headers=headers, stream=True)) as response:
  14. chunk_size = 1024 # 单次请求最大值
  15. content_size = int(response.headers['content-length']) # 文件总大小
  16. data_count = 0 # 当前已传输的大小
  17. with open(file_full_name, 'wb') as file:
  18. for data in response.iter_content(chunk_size=chunk_size):
  19. file.write(data)
  20. done_block = int((data_count / content_size) * 50)
  21. data_count = data_count + len(data)
  22. now_jd = (data_count / content_size) * 100
  23. 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=' ')
  24. # 下载完图片后获取图片扩展名,并为其增加扩展名
  25. file_type = guess(file_full_name)
  26. rename(file_full_name, file_full_name + '.' + file_type.extension)
  27. # 爬取不同类型图片
  28. def crawler_photo(type_id, photo_count):
  29. # 最新 1, 最热 2, 女生 3, 星空 4
  30. if(type_id == 1):
  31. url = 'https://service.paper.meiyuan.in/api/v2/columns/flow/5c68ffb9463b7fbfe72b0db0?page=1&per_page=' + str(photo_count)
  32. elif(type_id == 2):
  33. url = 'https://service.paper.meiyuan.in/api/v2/columns/flow/5c69251c9b1c011c41bb97be?page=1&per_page=' + str(photo_count)
  34. elif(type_id == 3):
  35. url = 'https://service.paper.meiyuan.in/api/v2/columns/flow/5c81087e6aee28c541eefc26?page=1&per_page=' + str(photo_count)
  36. elif(type_id == 4):
  37. url = 'https://service.paper.meiyuan.in/api/v2/columns/flow/5c81f64c96fad8fe211f5367?page=1&per_page=' + str(photo_count)
  38. # 获取图片列表数据
  39. 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'}
  40. respond = get(url, headers=headers)
  41. photo_data = loads(respond.content)
  42. # 已经下载的图片张数
  43. now_photo_count = 1
  44. # 所有图片张数
  45. all_photo_count = len(photo_data)
  46. # 开始下载并保存5K分辨率壁纸
  47. for photo in photo_data:
  48. # 创建一个文件夹存放我们下载的图片
  49. if not exists('./' + str(type_id)):
  50. makedirs('./' + str(type_id))
  51. # 准备下载的图片链接
  52. file_url = photo['urls']['raw']
  53. # 准备下载的图片名称,不包含扩展名
  54. file_name_only = file_url.split('/')
  55. file_name_only = file_name_only[len(file_name_only) -1]
  56. # 准备保存到本地的完整路径
  57. file_full_name = './' + str(type_id) + '/' + file_name_only
  58. # 开始下载图片
  59. Down_load(file_url, file_full_name, now_photo_count, all_photo_count)
  60. now_photo_count = now_photo_count + 1
  61. if __name__ == '__main__':
  62. # 最新 1, 最热 2, 女生 3, 星空 4
  63. # 爬取类型为3的图片(女生),一共准备爬取20000张
  64. wall_paper_id = 1
  65. wall_paper_count = 10
  66. while(True):
  67. # 换行符
  68. print('\n\n')
  69. # 选择壁纸类型
  70. wall_paper_id = input('壁纸类型:最新壁纸 1, 最热壁纸 2, 女生壁纸 3, 星空壁纸 4\n请输入编号以便选择5K超清壁纸类型:')
  71. # 判断输入是否正确
  72. while(wall_paper_id != str(1) and wall_paper_id != str(2) and wall_paper_id != str(3) and wall_paper_id != str(4)):
  73. wall_paper_id = input('壁纸类型:最新壁纸 1, 最热壁纸 2, 女生壁纸 3, 星空壁纸 4\n请输入编号以便选择5K超清壁纸类型:')
  74. # 选择要下载的壁纸数量
  75. wall_paper_count = input('请输入要下载的5K超清壁纸的数量:')
  76. # 判断输入是否正确
  77. while(int(wall_paper_count) <= 0):
  78. wall_paper_count = input('请输入要下载的5K超清壁纸的数量:')
  79. # 开始爬取5K高清壁纸
  80. print('正在下载5K超清壁纸,请稍等……')
  81. crawler_photo(int(wall_paper_id), int(wall_paper_count))
  82. print('\n下载5K高清壁纸成功!')
(0)

相关推荐