这会儿是国内时间6点半了,感觉我是依然乐此不疲地学习怎么取爬取网站的图片,经过上一次的实验,感觉初步浅显地基本关键包的用法,以及自己本来就具有HTML的基础,这次我是找到了一个网站,从头到尾自己独立实验成功,内心有点小激动,感觉自己融会贯通的能力有上一层楼啊,于是赶紧写下来纪念一下。
话不多说,整起!

我们来爬取https://divnil.com/wallpaper/iphone/ 这个网址下的图片。
这是个日语网站,但不影响我们推理和爬取图片,总体看上去呢,网站具有一定的分层结构,https://divnil.com/wallpaper/iphone/,是根url,下面挂在了很多的tag标签的html。

每个页面的class都是“tag_link”,这样方便我们找出所有的标签,但是即得到要去重。

选择某个标签,就会出现分页式的html,命令也很有规律,就是在后面加上_num的方式。
下面这些统计是代码中爬取图片时候顺带统计打印出来的,在最后我贴了完整代码,只需要把 save_all_images 函数调用注释即可打印出所有需要访问的目录,注释到这样快一些,因为我只想看访问链接。

点击某个标签页,比如:

就会在网页下方出现

的按钮,虽然是日语,但是猜也能猜到这是下一页的意思。点击它进入分页。

所以如果我们确定了搜索某个tag,只要一直找这样的标签就能继续跳到下一个页面去爬取图片,找到这个按钮的href,经过观察,只要还在分页中,class=“btn_next”的数目就一定是等于2的,且第一个一定是按钮【下一个】,也就是我们要找的。

那么直到所有分页完了是什么情况呢?
经过观察,当分页结束了的最后一页的时候,class=“btn_next”的数目就不是2,且页面没有按钮【下一个】的字样。所以从这里可以判断出分页结束与否。

接下来我们看看每个图片的url有什么规律?

每个图片区域的< a>的“rel=wallpaper”,但是包含的img的href有的属性名是src,有的是original,这个也很好办,这里需要注意下就是。

完整测试代码如下:

import os
import requests
from bs4 import BeautifulSouprootrurl = 'https://divnil.com/wallpaper/iphone/'
save_dir = 'D:/estimages/'
no_more_pages = 'END'# 这是一个集合,不能重复,也就是不能重复下载图片
image_cache = set()
index = len(image_cache)# step 1: 找到所有的标签页
# 随便挑选了一个tag最多最全的一个页面来获取
tmpurl = 'https://divnil.com/wallpaper/iphone/%E6%98%9F%E7%A9%BA%E3%81%AE%E5%A3%81%E7%B4%99.html'
html = BeautifulSoup(requests.get(tmpurl).text, features="html.parser")
tag_list = set()
for link in html.find_all('a', {'class': 'tag_link'}):tag_list.add(link.get('href'))print("the number of unique tag is : %d" % len(tag_list))
print(tag_list)# step 2: 按照每个标签页反复区按照分页形式不断往下寻找
def save_all_images(html, saveDir):global indeximgs = html.find_all('a', {'rel': 'wallpaper'})print('total imgs is %d:' % len(imgs))for img in imgs:# 有一些图片的href是src, 有一些图片的href是original,因此都是要考虑的。href = img.find('img').get('src')if href == '/wallpaper/img/app/white.png':href = img.find('img').get('original')print(href)# 判断是否重复下载if href not in image_cache:with open('{}/{}'.format(saveDir, href.split("/")[-1]), 'wb') as jpg:  # 请求图片并写进去到本地文件jpg.write(requests.get(rootrurl + href).content)image_cache.add(href)print("正在抓取第%s条数据" % index)index += 1def findNextPage(html):nextBtn = html.find_all('li', {'class': 'btn_next'})  # 找到next按钮,获得下一个连接网页的位置if len(nextBtn) != 2:  # 只要分页没结束,这个数目一定是2print('no more page ============================ ')return no_more_pageselse:tmpurl = nextBtn[0].find('a').get('href')  # 只要分页没结束,这个数目一定是2,且第一个元素一定是我们要找的“下一个”按钮。return rootrurl + tmpurldef serachSubPages(tag):# 建立这个标签的子目录,图片太多了,按照标签建立子目录,方便存储和整理tag_name = tag.split(".")[0]if not os.path.exists(save_dir + tag_name):os.mkdir(save_dir + tag_name)print("current tag is : " + tag_name)url = rootrurl + tagwhile 1:print("next page: " + url)html = BeautifulSoup(requests.get(url).text, features="html.parser")save_all_images(html, save_dir + tag_name)url = findNextPage(html)if url == no_more_pages:break;if __name__ == '__main__':for tag in tag_list:serachSubPages(tag)

测试一些后我终止了程序,因为太慢了。
效果如下:



Python《爬取IPhone各式壁纸》相关推荐

  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. 模型压缩95%:Lite Transformer,MIT韩松等人
  2. 【Android 插件化】VAHunt 引入 | VAHunt 原理 | VAHunt 识别插件化引擎
  3. sql insert 自动增量值_SQL中有关DQL、DML、DDL、DCL的概念与区别
  4. flask-mail异步发送邮件_spring Boot手把手教学(6):发送邮件
  5. urlencode使用场景
  6. ado filter 多条记录_江苏气动断料锯商家,多条锯_邢台富宇来机械厂
  7. csrf攻击原理与解决方法_信息安全之CSRF攻击
  8. 软件项目管理0710:招标文件准备【求助】
  9. python改变turtle画笔方向的函数_哪个选项不能改变turtle画笔的运行方向?
  10. 媒体查询能html的ID吗,基于Javascript的媒体查询
  11. python3 常见命令
  12. linux嵌入式6818,嵌入式ARM实验箱(FS_6818M4)_华清远见研发中心
  13. php 调用dll静态库,vue-cli 2.x 项目优化之引入本地静态库文件
  14. python输出数字三角形_Python|2020蓝桥杯之数字三角形
  15. 政府应用系统应用解决方案
  16. 苹果9L0-403测试对于被选入苹果认证支持专家(ACSP)10.6名称
  17. ubuntu 网卡流量_Ubuntu下使用nload查看网卡实时流量
  18. (公式)用欧拉公式推导三角函数恒等式
  19. Python语言的应用前景如何,应用方向有哪些。
  20. 用原生JS和CSS3做一个有趣的cube相册

热门文章

  1. 1197: [HNOI2006]花仙子的魔法
  2. project euler Problem 52
  3. Spring多数据源解决方案
  4. javabean 学习笔记
  5. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂——区分“变与不变”
  6. 华为云MySQL数据库外网使用
  7. ubuntu18.04管理redis
  8. 面试刷题29:mysql事务隔离实现原理?
  9. 【记录】IDEA未正确关闭导致打开报错,进不了主界面,含解决办法
  10. 【MATLAB】主要功能