今天不小心又发现了壁纸网站,感觉壁纸很多啊,多?我就忍不住了。爬一下咯。
我们今天爬取 网站是https://wallhaven.cc/。

先来分析分析:
进入首页:我们先去找标签,果然有个大标签地址链接。

点进去后发现:

一共有三层标签分类,第三层的标签就直接对应了很多的图片。
假如我们随便点击一个“anime girls”,我们发现他的标签号是5。

第一页呢只是几张图,但是有个按钮能看到更多,我们点进去。

发现url很有特点啊。q=tagId。我猜测这个q是query的意思。
后来经过测试,我们可以通过搜索自己输入的关键字,那时候q就是等于自己输入的关键字了。不过我们今天想从tag的角度来爬取网站。
往下翻一番,滑动下鼠标会发现,会出现page的分页标记。

%3A就是英文的冒号:。地址栏显示的时候就变成了%3A。

鼠标往下滑就是分页,而且在同一个页面展示,因此我们打开开发者模式的network去查看下XHR信息了。

好了,当我们确定;当我们得到个tagId,我们只需要去简单的添加page信息就可以得到完整的分页信息。

根据元素找到每一张图片,一般我们会先看到缩略图,点击缩略图后才能看到高清大图。
按照经验,一般而言,缩略图和高清图是存在某种直接的对应关系的,url存在规律的。
比如我们有缩略图:

所对应的高清图是:

再比如缩略图:

所对应的高清图是:

再比如缩略图:

所对应的高清图是:

发现确实存在规律哈
总结下就是得到如下规律:

好了分析完毕
完整代码如下:

import time
from concurrent.futures import ThreadPoolExecutor
import time
import os
import re
from urllib.parse import urlencodeimport requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import  Optionsrootrurl = 'https://wallhaven.cc/?'
searchUrl = 'https://wallhaven.cc/search?'
ImgUrl = 'https://w.wallhaven.cc/full/{}/wallhaven-{}'
save_dir = 'D:/estimages/'
headers = {"Referer": rootrurl,'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",'Accept-Language': 'en-US,en;q=0.8','Cache-Control': 'max-age=0','Connection': 'keep-alive'
}  ###设置请求的头部,伪装成浏览器def saveOneImg(dir, img_url):new_headers = {"Referer": img_url,'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",'Accept-Language': 'en-US,en;q=0.8','Cache-Control': 'max-age=0','Connection': 'keep-alive'}  ###设置请求的头部,伪装成浏览器,实时换成新的 header 是为了防止403 http code问题,防止反盗链,try:img = requests.get(img_url, headers=new_headers)  # 请求图片的实际URLif (str(img).find('200') > 1):with open('{}/{}.jpg'.format(dir, img_url.split('/')[-1].split('?')[0]), 'wb') as jpg:  # 请求图片并写进去到本地文件jpg.write(img.content)print(img_url)jpg.close()return Trueelse:return Falseexcept Exception as e:print('exception occurs: ' + img_url)print(e)return Falsedef processOnePages(tmpDir, imgs):for img in imgs:code = img.get('data-src').split('/')[-1]# 拼装高清大图的地址saveOneImg(tmpDir, ImgUrl.format(code[:2], code))passdef oneSpiderProcess(name, tag):tmpDir = '{}/{}'.format(save_dir, name)if not os.path.exists(tmpDir):os.makedirs(tmpDir)page = 1while 1:params = {'q': tag,'page' : page}url = searchUrl + urlencode(params)print('current page is: %s' % url)html = BeautifulSoup(requests.get(url, headers=headers).text, features="html.parser")footer = html.find('footer', {'class': 'pagination-notice'})if footer is not None:breakimgs = html.find('section', {'class': 'thumb-listing-page'}).find('ul').find_all('img')page = page + 1processOnePages(tmpDir, imgs)def getAllTags():# 此处应该是从标签页面去获取很多的。为了演示,这里自己手动填写了几个演示一下list = {'初音未来': 'id:3', '最终幻想VII': 'id:2659', 'Uzumaki Naruto': 'id:1188'}return listif __name__ == '__main__':taglist = getAllTags()# 给每个标签配备一个线程with ThreadPoolExecutor(max_workers=5) as t:  # 创建一个最大容纳数量为20的线程池for name, tag in taglist.items():t.submit(oneSpiderProcess, name, tag)# test one tag# oneSpiderProcess('初音未来', 'id:3')# 等待所有线程都完成。while 1:print('-------------------')time.sleep(1)

效果如下:


Python《wallhaven壁纸爬取》相关推荐

  1. Github配置(git+vscode+python+jupyter)

    ①下载git 打开 git bash 工具的用户名和密码存储 $ git config --global user.name "Your Name" $ git config -- ...

  2. 【实验楼】python简明教程

    ①终端输入python进入 欣赏完自己的杰作后,按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器. ②vim键盘快捷功能分布 ③这里需要注意如果程序中 ...

  3. 【Kaggle Learn】Python 5-8

    五. Booleans and Conditionals Using booleans for branching logic x = True print(x) print(type(x))''' ...

  4. 【Kaggle Learn】Python 1-4

    [Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...

  5. 使用python愉快地做高数线代题目~

    今天接触到了python,发现真是极易上手啊!对比c语言是什么鬼东西= = 诶,等下,看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了,觉得c语言真的是废材! 不...不是的. ...

  6. python 位运算与等号_Python 运算符

    和大多数语言一样,Python也有很多运算符,并且运算符跟其他语言的运算符大同小异接下来一一介绍: 算术运算符: 运算符描述实例 +加 - 两个对象相加a+b的输出结果是30 -减 - 得到复数或者一 ...

  7. python减小内存占用_如何将Python内存占用缩小20倍?

    当程序执行过程中RAM中有大量对象处于活动状态时,可能会出现内存问题,特别是在对可用内存总量有限制的情况下. 下面概述了一些减小对象大小的方法,这些方法可以显著减少纯Python程序所需的RAM数量. ...

  8. python中排序英文单词怎么写_Python实现对文件进行单词划分并去重排序操作示例...

    本文实例讲述了Python实现对文件进行单词划分并去重排序操作.,具体如下: 文件名:test1.txt 文件内容: But soft what light through yonder window ...

  9. python程序如何执行死刑图片_如何判断对象已死

    已死的对象就是不可能被任何途径使用的对象,有以下几种方法判断一个对象是否已经死了: 引用计数 给对象添加一个引用计数器,每当有一个地方引用他,计算器就加 1:当引用失效时,计数器减 1:任何时刻计数器 ...

  10. Python gRPC 安装

    1. 安装依赖库 sudo pip3 install grpcio sudo pip3 install protobuf sudo pip3 install grpcio_tools 2. 生成对应文 ...

最新文章

  1. 第四章,简答题4-5,2017-4-6
  2. 结构分析的计算机方法有哪些,第6篇 桥梁结构分析计算机方法.ppt
  3. Java ArrayList set()方法与示例
  4. CentOS配置本地YUM源
  5. golang 的channels 行为
  6. 1040. 有几个PAT(25)- PAT乙级真题
  7. spark 字符串操作
  8. SQL Server 2012完全备份、差异备份、事务日志备份和还原操作
  9. 思考小型管理软件的诸多问题:附美萍部分客户的销售统计表
  10. C语言基础入门(经典收藏)
  11. Fast R-CNN算法
  12. 荐书 | 心理学如何编程,看看这9本书
  13. 重磅精品课程总有一门是你想要找的
  14. Total Command快捷键大全
  15. windows下ntp时间校对
  16. 中国黑色金属行业产量需求与十四五战略规划报告2022版
  17. 阿里云服务器为什么总是那么不稳定经常崩溃掉线?
  18. 【前端-IE兼容】Win10和Win11使用Edge调试前端兼容IE6、IE7、IE8、IE9、IE10、IE11问题
  19. 自动化测试Selenium java学习
  20. Python+OpenCV+pyQt5录制双目摄像头视频

热门文章

  1. python详细基础知识笔记
  2. 学编程的用什么软件比较好,你知道吗?
  3. 为什么企业不喜欢标准成本法?
  4. 读书笔记:算法图解 using Python
  5. 【JavaSE】异常 超详讲解(编程思想)
  6. mac系统npm 安装淘宝镜像
  7. FPGA综合项目——图像边缘检测系统
  8. 计算机科班出身的优势
  9. Excel中实现模糊查询-LOOKUP+FIND函数
  10. COBOL--02--案例1