简单爬取wallpaper heaven高清壁纸

2021年1月30日更新
由于网站架构更改,以下内容已经并不能再实现爬取
思路大体不变,仅供参考思路


前言:wallpaper heaven是一个拥有百万高清壁纸的网站,其壁纸质量极佳,像我这种懒得用壁纸软件的人,便决定从该网站爬些图片,用来动态切换当作壁纸


文章目录

  • 简单爬取wallpaper heaven高清壁纸
    • URL分析
    • 程序设计
    • 代码实现

URL分析

首先看页面

我们随意点击后查看网址

https://alpha.wallhaven.cc/search?q=&categories=111&purity=100&sorting=random&order=desc

随机尝试对比后发现,q=后面加关键词即可达到搜索效果,

categories=111后面的三个数字即对应了General Anime People三个选项,选中为1,不选为0,

purity=100后面虽然有三个数字,但是只有前两个有用,对应SFW Sketchy,这里的SFWsafe for work如果你主要想看福利图片,不勾选这个选项即可),选中出现的是可以在工作时浏览的图片(不选中出现的图片,你懂的),Skectchy是写真的意思

sorting指结果相关度,参数有randomtoplist

order指结果排序,有升序和降序两个参数

当然远不止这些参数,还有分辨率,颜色,比例等等,我这里就不赘述了,可以自行尝试

还有非常重要的一点,就是翻页

该网址的翻页很方便,网址后面加一个page参数即可(&page=2即第二页)

程序设计

右击查看元素之后,我们即可获取到该图片的定位,但是定位到的url仅仅只是图片的缩略图,如果要爬取高清大图,我们还需要再进入一层链接

于是整体思路就出来了,先构建url,爬取每页的图片的详情页的网址,获取详情页的网址后进入详情页并获取高清大图的链接,进行爬取

因为并不是所有的图片都是符合我们预期的,为了能让结果更加贴合我们的心意,我们再设置两个参数,一个是星星数量(如下图),每张图片都是有人点赞的,其体现就在于星星的数量,我们只爬取高于一定数量的星星

我们只是为了爬取一定量的图片,并非是全网爬取,所以我们还需要设置一个数量参数,进行限制

程序的流程图大概是这样

代码实现

有了如上的思路之后,代码实现就相对简单了,因为是想实现一个小工具,所以代码里面添加了许多交互的内容,这样也便于封装

代码实现相对简单,这里便不再细讲代码了,可能有写的累赘的地方,且并未太注意细节,代码的鲁棒性不是太强,正在写UI界面,会在新版本中增强鲁棒性

利用pyinstaller这个库可以实现代码的封装,生成exe

github地址

对您有些帮助的话记得点个赞哦~

以下是代码

import requests
from lxml import etree
import re
import os
import timedef get_pictures(url,folder_name,dest_count,c):html = requests.get(url)res = etree.HTML(html.content)img_url = res.xpath('//img[@id="wallpaper"]/@src')[0]img_name = img_url.split('/')[-1]try:img_html = requests.get("https:"+img_url)if not os.path.exists(folder_name):os.mkdir(folder_name)with open('./'+folder_name+'/'+img_name,'wb') as f:f.write(img_html.content)print("正在下载第 {} 张图片=====> ".format(c+1)+img_name+' -----success!')return 1except:print("正在下载第 {} 张图片=====> ".format(c+1)+img_name+' -----failure!')return 0def get_next_url(url,folder_name,stars_num,dest_count,all):html = requests.get(url)res = etree.HTML(html.content)next_urls = res.xpath("//a[@class='preview']/@href")stars = res.xpath("//div[@class='thumb-info']/a[1]/text()")res_url = []sum = allfor i in range(0,len(stars)):if int(stars[i])>=int(stars_num):res_url.append(next_urls[i])for i in res_url:sum += get_pictures(i,folder_name,dest_count,sum)if sum >= dest_count:exit("目标已达成!")if len(next_urls) == 0:print("无更多图片!")time.sleep(3)exit("0")return sumif __name__ == "__main__":print("请选择获取方式:1.范围选择 2.关键词搜索 3.二者结合")style = input()categories = ['0','0','0']purity = ['0','0','0']url = ""keyword = ""sort_list = ['https://alpha.wallhaven.cc/search?q={}&categories={}&purity={}&sorting=date_added&order=desc&page={}','https://alpha.wallhaven.cc/search?q={}&categories={}&purity={}&resolutions=1920x1080&topRange=1M&sorting=toplist&order=desc&page={}','https://alpha.wallhaven.cc/search?q={}&categories={}&purity={}&resolutions=1920x1080&sorting=random&order=desc&page={}','https://alpha.wallhaven.cc/search?q={}&search_image=&page={}']if style == '1' or style == '3':if style == '3':print("请输入搜索关键词(建议英文):")keyword = input().replace(' ','+')print("请选择图片类型:1.General 2.Anime 3.People (可多选,默认全选,空格分割选项)")selection_str = input()selection = selection_str.split()for i in selection:try:categories[int(i)-1] = '1'except:categories = ['1','1','1']print("图片附加选项:1.SFW 2.Sketchy (可多选,默认选择1,空格分隔选项,建议选择SFW)")selection_str = input()selection = selection_str.split()for i in selection:try:purity[int(i)-1] = '1'except:purity = ['1','0','0']purity[2] = '0'if selection_str == "":purity = ['1','0','0']print("请选择排序方式:1.Latest 2.Toplist 3.Random (单选,默认Random)")selection_str = input()count = 1while selection_str != '1' and selection_str != '2' and selection_str != '3' and count <= 3 and selection_str != "":print("请正确选择(多次错误则默认选择)")selection_str = input()count += 1if count == 4:url = sort_list[2]elif selection_str == "":url = sort_list[2]else:url = sort_list[int(selection_str)-1]elif style == '2':print("请输入搜索关键词(建议英文):")keyword = input().replace(' ','+')url = sort_list[3]print("请输入文件夹的名称:")folder_name = input()while folder_name == "":folder_name = input()print("请输入最低的点赞数:")stars_num = input()print("请输入目标图片数量:")dest_count = input()all = 0    # 目前爬取的张数,用来控制下载张数for i in range(1,999):print('get the page: {}'.format(i))if style != '2':print("getting from " + url.format(keyword,"".join(categories),"".join(purity),i))all = get_next_url(url.format(keyword,"".join(categories),"".join(purity),i),folder_name,stars_num,int(dest_count),all)else:print("getting from " + url.format(keyword,i))all = get_next_url(url.format(keyword,i),folder_name,stars_num,int(dest_count),all)

简单爬取wallpaper heaven高清壁纸(福利满满~)相关推荐

  1. python爬取王者_python 爬取王者荣耀高清壁纸

    一.前言 打过王者的童鞋一般都会喜欢里边设计出来的英雄吧,特别想把王者荣耀的英雄的高清图片当成电脑桌面 预览一下桌面吧: 是不是看着这样的桌面也很带感,_ (学会这个技术,你可以爬取其他网站的类似图片 ...

  2. python 爬取王者荣耀高清壁纸

    代码地址如下: http://www.demodashi.com/demo/13104.html 一.前言 打过王者的童鞋一般都会喜欢里边设计出来的英雄吧,特别想把王者荣耀的英雄的高清图片当成电脑桌面 ...

  3. python爬虫爬取必应每日高清壁纸

    python爬虫爬取必应每日高清壁纸 一.简介 二.使用的环境 三.网页分析 1.分析网页每一页url形式以及总页数 2.网页重要信息收集 3.在源码中寻找所需信息的位置 四.代码实现 五.运行爬虫 ...

  4. Python多线程爬虫之二:爬取王者荣耀高清壁纸(多线程)

    一.项目分析 1.查询爬取网址 robots 权限 1.王者荣耀官网:https://pvp.qq.com/ 2.访问王者荣耀官网 rbots 权限: https://pvp.qq.com/robot ...

  5. python多线程爬取王者荣耀高清壁纸过程

    多线程与爬虫 目标url json中查找url 访问url 读取json 查看json的list数组 全部图片 粗暴的单线程获取 多线程执行 目标url 查看http://pvp.qq.com/web ...

  6. Python爬虫实战| Python爬取英雄联盟高清壁纸

    先看一下最终爬取的效果,每个英雄的壁纸都被爬取下来了: "黑暗之女 安妮"的12张壁纸: 高清大图: 下面开始正式教学! 版本:Python 3.5 工具:Jupyter note ...

  7. Python爬虫入门-scrapy爬取唯一图库高清壁纸

    首先,就是进入到唯一图库,点击上面的高清壁纸项目: 进入之后,下拉,发现是正常的下拉没有Ajax加载,拉到最后面点击末页,可以看出这个栏目里面总共有292页: 翻页看一下URL有什么变化,可以发现只有 ...

  8. 如何爬取王者荣耀高清壁纸(详细分析教程)

    1.准备工作 Python 3.7 Python安装有requests模块 王者荣耀官网地址:https://pvp.qq.com/web201605/wallpaper.shtml### 2.网站分 ...

  9. Python爬虫实战 使用线程池批量爬取必应1080P高清壁纸

    本文纯粹为了技术学习,内容如有侵权,请告知! 目标URL:https://bing.ioliu.cn 爬取的图片 Python用到的主要模块 import requests from lxml imp ...

最新文章

  1. 保护了无数医护人员的N95口罩,原来是华裔科学家和一位学生共同发明的!
  2. 使用DML语句【weber出品必属精品】
  3. 【Flask项目】项目准备之-创建模块的蓝图
  4. 静态链接库LIB和动态链接库DLL的区别 创建和示例
  5. Loj #149. 01 分数规划(01分数规划模板题)
  6. 项目总结2:ionic3开发跨平台App如何设置和替换应用图标及启动图
  7. (1)FPGA面试题Setup和Holdup时间
  8. Filter过滤器的生命周期
  9. 所有的 iPhone 和高端 Android 设备都被破解了!
  10. php测线路网速,php 测试网速
  11. 服务器安全值得深思的几点问题?
  12. JTS Java空间几何计算、距离、最近点、subLine等计算
  13. 瞻博网络持续深耕 以“本土化”撬动“中国心”
  14. 边云协同的优点_与云端握手 是时候谈谈边云协同这个边缘计算新风向了
  15. 京东回应显卡售后传闻;​IBM发布第一个2纳米芯片;苹果以工程师数量评估收购对象 | EA周报...
  16. 如何解决未能初始化战场服务器,解决绝地求生无法初始化steam教程详解
  17. CVPR 2019 Oral 论文精选汇总,值得一看的 CV 论文都在这里(持续更新中)
  18. [系统相关]WPS Office 2016 专业增强版 10.8.0.6470 免序列号无限制
  19. 计算机程序扩展名是什么,c语言源程序的扩展名是什么?
  20. Linux与几种电脑系统的区别

热门文章

  1. rtthread_scons简介
  2. Marp之简单编写PPT格式范例
  3. 论语之雍也第六、述而第七
  4. Padding和Margin不同数量参数表示什么意思
  5. android读取本地网页
  6. python入门教程廖雪峰-Python 入门1 浅读廖雪峰老师的网站入门教程
  7. 防止勒索病毒,请立即照此方法设置电脑!
  8. 汽车工业能效管理平台助力能源管理体系的建立和实施
  9. 微信小程序开发如何实现微信支付
  10. android 混淆高德地图,开发注意事项-创建工程-开发指南-Android 地图SDK | 高德地图API...