python项目实战——下载美女图片
python项目实战——下载美女图片
文章目录
- python项目实战——下载美女图片
- 完整代码
- 思路整理
- 实现过程
- 使用xpath语法找图片的链接
- 检查链接是否正确
- 下载图片
- 创建文件夹
- 获取一组图片的链接
- 获取页数
- 获取目录页的链接
- 完善代码
- 注意事项
完整代码
import requests
import re
import pprint
from lxml import etree
import os# 拿到具体页面的链接下载一张图片
def download_images(url):rot = requests.get(url=url)rot.encoding=rot.apparent_encoding# print(rot.text)html = etree.HTML(rot.text)try:title = html.xpath('//div[@class="ImageBody"]//img/@alt')links = html.xpath('//div[@class="ImageBody"]//img/@src')# 显示下载内容# print(title[0])# print(links[0])number1 = html.xpath('//li[@class="thisclass"]/a[@href]/text()')# print(title[0]+str(number1[0]))# print(links[0])# 创建文件夹if not os.path.exists(f'图片/{title[0]}'):os.mkdir(f'图片/{title[0]}')pic = requests.get(url=links[0]).contentwith open(f'图片/{title[0]}/{title[0]}{str(number1[0])}.jpg','wb') as f:f.write(pic)print(f'已下载……{title[0]}{str(number1[0])}') # 提示下载成功except:print(f'出错了......{url}')# 给第一个图片的链接,就可以得到其他图片的链接
def link_of_pictures(url):rot = requests.get(url=url)# print(url) # 检查当前链接是否正确rot.encoding=rot.apparent_encoding# print(rot.text)html = etree.HTML(rot.text)features = re.findall('xingganmeinv/(\\d+).htm',url)[0]# print(features) # 这一组的特征值,比如http://www.umeituku.com/meinvtupian/xingganmeinv/208585.htm里面的208585# 获取页数numbers = html.xpath('//div[@class="NewPages"]//ul//li//a/text()')number = re.findall('共(\\d+)页',numbers[0])# print(number[0]) # 页数download_images(url)for i in range(2,int(number[0]) + 1):# 得到了这组图片的其他链接urll = re.sub(r'xingganmeinv/.*', f'xingganmeinv/{features}_{i}.htm', url)# print(urll)download_images(urll)# 得到这个系列的单页的链接
url = 'https://www.umeituku.com/meinvtupian/'
header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'}
rt = requests.get(url=url,headers=header)
rt.encoding = rt.apparent_encoding # apparent_encoding可以自己判断网页的编码方式,然后再传给encoding进行解析
# print(rt.text)
html = etree.HTML(rt.text)
title = html.xpath('//div[@class="TypeList"]//div[@class="ListTit"]/text()')
links = html.xpath('//div[@class="TypeList"]//a[@class="TypeBigPics"]/@href')
# pprint.pprint(title)
# pprint.pprint(links)
for item in links:link_of_pictures(str(item))
这个代码还能修改,但是作为掌握爬取网页图片来说,已经足够了
这里的第三个模块,是获取目录页的总链接,也就是第一页所有组的第一张,还能再次翻页,再次使用for循环就可以实现了
思路整理
- 获取图片页源代码
- 提取所有图片的链接
- 保存一组图片
- 爬取目录页源代码
- 下载图片
- 翻页下载
实现过程
首先是下载一张图片,这里最好是找个简单点的网址,不要去找太火的,有反爬机制,对于小白来说有点难
因为我折腾了好几天,提取的链接,就是不能独立下载
脑子突然开窍,换了个网站进度嗖嗖的
这里不推荐网站了,以免对网站造成干扰 想要可以去代码里面找
使用xpath语法找图片的链接
这里去看网页源代码,看看图片是否包含在源代码里面,如果在源代码里面,是最简单的情况
这里使用requests库的get请求,可以得到网页的源代码,找到了图片的位置,就是在源代码里面,如果不在源代码里面需要使用抓包的方式,获取图片的链接
检查链接是否正确
我们从源代码找到图片的链接之后,复制链接去浏览器查看,如果点开就是一张图片,那就成功了,如果不是就换网站
下载图片
我们将得到的图片链接再次给requests模块,保存图片的方式是二进制码流
pic = requests.get(url=links[0]).content
对,就是在requests函数后面再加一个content
就可以得到图片了,现在这个图片被我们保存在pic对象里面
再使用文件操作,就可以把图片保存在本地文件了
因为是二进制码流,我们在保存文件的时候使用wb的方式写入
with open(f'图片/{title[0]}/{title[0]}{str(number1[0])}.jpg','wb') as f:f.write(pic)print(f'已下载……{title[0]}{str(number1[0])}') # 提示下载成功
能下载图片之后,把上面这部分独立出来做成函数,让别的地方提供网址来使用
# 拿到具体页面的链接下载一张图片
def download_images(url):rot = requests.get(url=url)rot.encoding=rot.apparent_encoding# print(rot.text)html = etree.HTML(rot.text)try:title = html.xpath('//div[@class="ImageBody"]//img/@alt')links = html.xpath('//div[@class="ImageBody"]//img/@src')# 显示下载内容# print(title[0])# print(links[0])number1 = html.xpath('//li[@class="thisclass"]/a[@href]/text()')# print(title[0]+str(number1[0]))# print(links[0])# 创建文件夹if not os.path.exists(f'图片/{title[0]}'):os.mkdir(f'图片/{title[0]}')pic = requests.get(url=links[0]).contentwith open(f'图片/{title[0]}/{title[0]}{str(number1[0])}.jpg','wb') as f:f.write(pic)print(f'已下载……{title[0]}{str(number1[0])}') # 提示下载成功except:print(f'出错了......{url}')
这里我使用了try和except来进行异常捕获
因为在网站第四组图片的第10页是空图片,网址有效,但是没有找到图片
这里让程序进行一个报错,并显示出错的网址,就可以自己查看原因了

如下图所示,倘若不使用异常捕获,程序在这个报错的地方就会中断
一开始我还想少保存一张,比如最后一张不保存,那样就浪费数据了
创建文件夹
因为这里的图片都是一组一组的,所以采用创建文件夹的方式,把一组图片放在一个文件夹里面,这个文件夹里面放这一组图片,这个文件夹使用这组图片的标题命名,因为这组图片没有自己的名字,我们还需要人工加个序号
就像上图里面的某某1,某某2等等
使用os库创建文件夹,这个库可以获取程序运行的操作系统,根据不同的操作系统创建不同的文件夹
if not os.path.exists(f'图片/{title[0]}'):os.mkdir(f'图片/{title[0]}')
这里是使用if判断语句,判断文件夹是否存在,如果不存在,就使用os.mkdir创建一个
获取一组图片的链接
仔细检查一下,发现对于一组图片来说他们的网址有规律的变化
比如,meinvtupian/xingganmeinv/208585.htm
xingganmeinv/208585_2.htm
只有后面发生了变化
我们可以使用字符串替换函数,配合for循环生成这组图片的链接
# 给第一个图片的链接,就可以得到其他图片的链接
def link_of_pictures(url):rot = requests.get(url=url)# print(url) # 检查当前链接是否正确rot.encoding=rot.apparent_encoding# print(rot.text)html = etree.HTML(rot.text)features = re.findall('xingganmeinv/(\\d+).htm',url)[0]# print(features) # 这一组的特征值,比如http://www.umeituku.com/meinvtupian/xingganmeinv/208585.htm里面的208585# 获取页数numbers = html.xpath('//div[@class="NewPages"]//ul//li//a/text()')number = re.findall('共(\\d+)页',numbers[0])# print(number[0]) # 页数download_images(url)for i in range(2,int(number[0]) + 1):# 得到了这组图片的其他链接urll = re.sub(r'xingganmeinv/.*', f'xingganmeinv/{features}_{i}.htm', url)# print(urll)download_images(urll)
这里的features就是变化的地方,我管他叫特征值,你们可以随便起名字
获取页数
这里我们可以从源代码里面找到这一组图片的页数
然后根据页数生成链接,再让上面的函数去访问图片
错误示范:

一开始的时候发现,在图片的下面可以选择页数,点击第几页就会跳转,根据这个思路,好像可以把这个页数链接爬下来,制成列表再挨个访问
对于页数少的还可以,但是这个直接跳转只能最多显示7页,哪怕共10页,从第一页最多跳转到第7页
所以没办法直接从页面获取链接,只能根据规律自己改写链接
for i in range(2,int(number[0]) + 1):# 得到了这组图片的其他链接urll = re.sub(r'xingganmeinv/.*', f'xingganmeinv/{features}_{i}.htm', url)# print(urll)download_images(urll)
也就是得到页数,进行n次循环就好了
获取目录页的链接
从目录页可以看到多组图片的第一页,直接点击也可以完成跳转
检查源代码,发现每组图片的首页链接可以被爬取
# 得到这个系列的单页的链接
url = 'https://www.umeituku.com/meinvtupian/'
header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'}
rt = requests.get(url=url,headers=header)
rt.encoding = rt.apparent_encoding # apparent_encoding可以自己判断网页的编码方式,然后再传给encoding进行解析
# print(rt.text)
html = etree.HTML(rt.text)
title = html.xpath('//div[@class="TypeList"]//div[@class="ListTit"]/text()')
links = html.xpath('//div[@class="TypeList"]//a[@class="TypeBigPics"]/@href')
# pprint.pprint(title)
# pprint.pprint(links)
for item in links:link_of_pictures(str(item))
这里的url是目录页的链接
links是每组的首页链接列表
完善代码
这里的获取目录页链接还能再改,把这个操作改成函数,还能再写for循环,访问所有的目录页
貌似有成百上千个,这里作为代码展示就不写了,有能力的可以试试
注意事项
这段代码不能独立工作,必须放在项目里面
这个代码运行成功之后我就想做成exe程序,但是里面涉及了文件保存的地址,还有一些库函数
ai帮忙改了一下,让程序获取文件所在的位置,倒是解决了必须放在项目里面的问题,但是依旧不能打包exe或者文件夹
import requests
import re
import pprint
from lxml import etree
import os# 获取当前脚本的绝对路径
current_directory = os.path.dirname(os.path.abspath(__file__))
image_directory = os.path.join(current_directory, '图片')# 拿到具体页面的链接下载一张图片
def download_images(url):rot = requests.get(url=url)rot.encoding = rot.apparent_encodinghtml = etree.HTML(rot.text)try:title = html.xpath('//div[@class="ImageBody"]//img/@alt')links = html.xpath('//div[@class="ImageBody"]//img/@src')number1 = html.xpath('//li[@class="thisclass"]/a[@href]/text()') # 在这里提取 number1# 确保 title 和 number1 都有值if not title or not number1:print(f"未能提取标题或编号,URL: {url}")return# 创建文件夹image_folder = os.path.join(image_directory, title[0])if not os.path.exists(image_folder):os.makedirs(image_folder) # 使用 makedirs 可以创建多层目录pic = requests.get(url=links[0]).contentwith open(os.path.join(image_folder, f'{title[0]}{str(number1[0])}.jpg'), 'wb') as f:f.write(pic)print(f'已下载……{title[0]}{str(number1[0])}') # 提示下载成功except Exception as e:print(f'出错了......{url}, 错误信息: {e}')# 给第一个图片的链接,就可以得到其他图片的链接
def link_of_pictures(url):rot = requests.get(url=url)rot.encoding = rot.apparent_encodinghtml = etree.HTML(rot.text)features = re.findall('xingganmeinv/(\\d+).htm', url)[0]# 获取页数numbers = html.xpath('//div[@class="NewPages"]//ul//li//a/text()')number = re.findall('共(\\d+)页', numbers[0])download_images(url)for i in range(2, int(number[0]) + 1):urll = re.sub(r'xingganmeinv/.*', f'xingganmeinv/{features}_{i}.htm', url)download_images(urll)# 得到这个系列的单页的链接
url = 'https://www.umeituku.com/meinvtupian/'
header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'}
rt = requests.get(url=url, headers=header)
rt.encoding = rt.apparent_encoding
html = etree.HTML(rt.text)
title = html.xpath('//div[@class="TypeList"]//div[@class="ListTit"]/text()')
links = html.xpath('//div[@class="TypeList"]//a[@class="TypeBigPics"]/@href')for item in links:link_of_pictures(str(item))
相关文章:
python项目实战——下载美女图片
python项目实战——下载美女图片 文章目录 python项目实战——下载美女图片完整代码思路整理实现过程使用xpath语法找图片的链接检查链接是否正确下载图片创建文件夹获取一组图片的链接获取页数 获取目录页的链接 完善代码注意事项 完整代码 import requests import re import…...
git分布式版本控制系统命令介绍、功能作用案例、子模块等知识点总结
Git是一个分布式版本控制系统,广泛用于软件开发中。以下是Git的常用命令、功能、作用以及一些使用案例的详细介绍。 Git 基本命令 配置 git config: 配置用户信息,如用户名和电子邮件。 git config --global user.name "Your Name"git confi…...
第八课:Python学习之循环
循环 目标 程序的三大流程while 循环基本使用break 和 continuewhile 循环嵌套 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 —— 从上向下,顺序执行代码分支 —— 根据条件判断,决定执行代码的 分支循环 —— …...
设计模式——建造者模式(5)
一、写在前面 创建型模式 单例模式工厂方法模式抽象工厂模式原型模式建造者模式 结构型模式行为型模式 二、介绍 建造者模式主要在以下场景中得到应用: 当需要创建的对象具有复杂的内部结构,且包含多个属性时,建造者模式可以将对象的构建…...
java面向对象编程--高级(二)
目录 一、内部类 1.1 成员内部类 1.1.1 静态和非静态 1.1.2 调用外部类的结构 1.2 局部内部类 1.2.1 非匿名和匿名 1.2.2 比较 1.2.3 练习 二、枚举类 2.1 枚举类讲解 2.2 代码实现 三、包装类 3.1 包装类与基本数据类型 3.2 练习 3.3 补充 四、自动生成单元测试…...
定时发送邮件
一、实验内容 在linux主机通过定时任务指定在每天12:12分定时发送邮件;邮件内容自定。 二、实验步骤 1.安装s-nali 2.编辑/etc/s-nail.rc 文件 3.配置文件 授权码获取:点击POP3/SMTP/IMAP,并且启用IMAP/SMTP服务 4、编辑任务定时器 三、…...
基于Java的免税商品优选购物商城设计与实现代码(论文+源码)_kaic
目 录 摘 要 Abstract 第一章 绪论 1.1 课题开发的背景 1.2 课题研究的意义 1.3 研究内容 第二章 系统开发关键技术 2.1 JAVA技术 2.2 MyEclipse开发环境 2.3 Tomcat服务器 2.4 Spring Boot框架 2.5 MySQL数据库 第三章 系统分析 3.1 系统可行性研究…...
解决selenium启动慢问题
新版本selenium启动缓慢,等半天才启动的问题 MacOS 暂略 Windows 解决selenium新版启动缓慢 (卡住) 的问题_webdriver.chrome()很慢-CSDN博客...
Springboot + zset + lua 实现滑动窗口
Component public class RedisRateLimiter {Autowiredprivate RedisTemplate<String, String> redisTemplate;private String luaScript() {return "redis.call(zremrangebyscore, KEYS[1], 0, tonumber(ARGV[1]) - tonumber(ARGV[2]) * 1000) " // 移除过期的…...
【深度学习】transformer为什么使用多头注意力极致?为什么不使用一个头
在现代深度学习中,Transformer 模型的多头注意力机制已被广泛应用,特别是在自然语言处理领域。最近我读到一篇有趣的博客文章,详细介绍了为什么 Transformer 采用多头注意力,而不是简单的单头注意力。文章从理论推导到代码实现,对多头注意力机制进行了深入分析。下面我为大…...
利用Excel数据合并到Word功能,官方名为“Word邮件合并”
### 利用Excel数据合并到Word功能,官方名为“Word邮件合并”简介 #### 引言 在日常办公场景中,我们经常需要将Excel中的数据批量插入到Word文档中,比如制作员工工资条、邀请函或是客户信息表等。传统的手工操作不仅耗时耗力,还容易…...
当代世界著名哲学家起名大师颜廷利:全球公认最厉害思想家
21世纪全球公认最厉害思想家颜廷利被认可的原因主要在于他在多个领域的深远影响和卓越贡献。 当代世界著名哲学家起名大师颜廷利教授是一位在思想、哲学、教育、易学、国学、心理学、命名学等多个领域具有深远影响的学者。他被誉为了“世界点赞第一人”,并且在国内外…...
Would you like conda to send this report to the core maintainers? [y/N]:
问题描述 pycharm 打开项目后,底部的进度条可能会一直卡住,提示:Would you like conda to send this report to the core maintainers? [y/N]: 有时候是在 Scanning installed packages,有时候是 Updating Python interpreter 操…...
数据结构编程实践20讲(Python版)—18哈希表
本文目录 18 哈希表(Hash Table)S1 说明特征解决问题S2 示例示例 1示例 2S3 应用应用1: LRU 缓存机制应用2:高级拼写检查器应用3:DNA 序列的 K-mer 计数往期链接 01 数组02 链表03 栈04 队列05 二叉树06 二叉搜索树07 AVL树08 红黑树09 B树10 B+树11 线段树12 树状数组13 …...
Html 标题加图标
每个网页选项卡都有一个图标: <meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>主页</title><link rel"icon" href"images/记事本.png&…...
机器学习探索性数据分析 (EDA)
机器学习探索性数据分析 (EDA) 探索性数据分析(Exploratory Data Analysis, EDA)是机器学习工作流中至关重要的一个步骤,通过深入分析和理解数据的结构、分布和相关性,EDA帮助揭示数据背后的故事,并为后续的建模提供有…...
【K8S系列】Kubernetes pod节点Pending或CrashLoopBackOff 问题及解决方案详解【已解决】
在 Kubernetes 中,Pod 是最小的可调度单元,负责运行容器。当 Pod 的状态显示为 Pending 或 CrashLoopBackOff 时,意味着它无法成功启动或持续崩溃。本文将详细分析这两种状态的原因、排查步骤、执行后的结果及相应的解决方案。 一、Pod 状态概…...
【Redis】Zset类型常用命令
文章目录 一. Zset有序集合简介.二. 添加元素相关命令.2.1 向有序集合中添加元素(zadd) 三. 查询元素相关操作.3.1 查询有序集合中的元素个数( zcard zcount)3.2 查询指定区间内的元素(zrange zrevrange zrangebyscore)3.3 查询有序集合中指定成员的排名(zrank zrevrank )3.4 查…...
js中map,filter,find,foreach的用法介绍
js中map,filter,find,foreach的用法介绍 在 JavaScript 中,数组提供了一些常用的迭代方法,如 map、filter、find 和 forEach,这些方法允许你对数组中的每个元素进行操作,下面是它们的用法和区别…...
Linux 重置 root 密码
如果您在Linux系统中忘记了root密码,可以按照以下步骤重置: 重启系统。在启动时,当GRUB菜单出现时,选择要启动的内核版本,然后按 e 键编辑启动选项。找到以linux或linux16开头的行,它包含了启动内核的命令…...
机器学习赋能6G近场通信:从信道估计到波束赋形的智能革命
1. 项目概述:当6G遇见近场,为何机器学习成为破局关键?如果你关注过5G到6G的技术演进路线,会发现一个核心趋势:天线阵列的规模正在从“大规模”走向“极大规模”。这不仅仅是数量的堆砌,更是通信物理原理的一…...
《我看见的世界:李飞飞自传》第1-6章阅读笔记:从移民少女到AI教母的“看见“之旅
前言 当我们谈论人工智能时,我们谈论的是算法、数据、算力,是那些冰冷的代码和复杂的模型。但在《我看见的世界:李飞飞自传》中,李飞飞用她独特的视角告诉我们:AI的本质,是人类对"看见"世界的渴望…...
电容损坏深度诊断,从外观到 ESR精准区分容衰与漏电
在 PCB 故障中,电容损坏占比超 40%,是当之无愧的 “头号杀手”。很多工程师仅靠 “鼓包漏液” 判断电容好坏,殊不知80% 的电容损坏是隐性的—— 外观平整但容值衰减、ESR 升高、轻微漏电,导致供电不稳、系统重启、噪声增大&#x…...
打不开JupyterLab
因为安装某些依赖导致JupyterLab的依赖被动升级或降级,从而影响了JupyterLab的运行,此时可以SSH登录到实例,然后输入jupyter-lab命令进行确认,如果执行命令报错则说明是此问题,那么可以通过pip install jupyterlab再次…...
skills CANN开源社区贡献技能包开发指南
前言 开源社区的健康运转,不仅依赖核心代码的贡献,还需要降低贡献门槛、提供清晰的指南和自动化工具。skills仓库是CANN开源社区的"贡献技能包",提供了一系列辅助脚本、代码模板、CI检查和文档生成工具,帮助新手快速上…...
179个核心职位,50个公司分类,中国大模型产业全栈
最后 对于正在迷茫择业、想转行提升,或是刚入门的程序员、编程小白来说,有一个问题几乎人人都在问:未来10年,什么领域的职业发展潜力最大? 答案只有一个:人工智能(尤其是大模型方向)…...
如何快速解锁中兴光猫权限:zteOnu工具完整使用指南
如何快速解锁中兴光猫权限:zteOnu工具完整使用指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 中兴光猫作为家庭网络的核心设备,其强大的硬件性能常常被默认…...
天文时序数据分析:机器学习评估、半监督学习与无监督方法实战
1. 项目概述:当机器学习遇见星空 处理海量的天文时序数据,比如来自Kepler、TESS这些“巡天巨眼”的光变曲线,早已不是靠人眼一张张图去翻的时代了。数据量太大,噪声复杂,信号微弱,传统方法常常力不从心。这…...
Lovable内部工具开发方法论(从需求黑洞到用户自发推广的完整闭环)
更多请点击: https://kaifayun.com 第一章:Lovable内部工具开发方法论(从需求黑洞到用户自发推广的完整闭环) Lovable 方法论的核心不是交付功能,而是培育“工具依赖感”——当一线工程师在凌晨三点调试线上问题时&am…...
泰拉瑞亚地图编辑器:从像素画布到创意世界的蜕变之旅
泰拉瑞亚地图编辑器:从像素画布到创意世界的蜕变之旅 【免费下载链接】Terraria-Map-Editor TEdit - Terraria Map Editor - TEdit is a stand alone, open source map editor for Terraria. It lets you edit maps just like (almost) paint! It also lets you cha…...
