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循环就可以实现了

思路整理

  1. 获取图片页源代码
  2. 提取所有图片的链接
  3. 保存一组图片
  4. 爬取目录页源代码
  5. 下载图片
  6. 翻页下载

实现过程

首先是下载一张图片,这里最好是找个简单点的网址,不要去找太火的,有反爬机制,对于小白来说有点难

因为我折腾了好几天,提取的链接,就是不能独立下载

脑子突然开窍,换了个网站进度嗖嗖的

这里不推荐网站了,以免对网站造成干扰 想要可以去代码里面找

使用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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java算术运算符 C语言的二维数组初始化

1. //算术运算符 public static void main(String[] args) {System.out.println(3.25.01);//若有小数参与,有可能不精确System.out.println(5-1);System.out.println(5*2);System.out.println(10.0/3);//这里不精确System.out.println(10%2);System.out.println();…

2024.10月16日- Vue.js(1)

一 VUE概述与环境搭建 1.1 Vue概述 1.1.1 简介 Vue (发音为 /vjuː/,类似 view) 是一款轻量级的用于构建用户界面的 渐进式的JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高…

Vivado - Aurora 8B/10B IP

目录 1. 简介 2. 设计调试 2.1 Physical Layer 2.2 Link Layer 2.3 Receiver 2.4 IP 接口 2.5 调试过程 2.5.1 Block Design 2.5.2 释放 gt_reset 2.5.3 观察数据 3. 实用技巧 3.1 GT 坐标与布局 3.1.1 选择器件并进行RTL分析 3.1.2 进入平面设计 3.1.3 收发器布…

堆排序(C++实现)

参考: 面试官:请写一个堆排序_哔哩哔哩_bilibiliC实现排序算法_c从小到大排序-CSDN博客 堆的基本概念 堆排实际上是利用堆的性质来进行排序。堆可以看做一颗完全二叉树。 堆分为两类: 最大堆(大顶堆):除根…

Java-IO流使用场景

Java IO 流是Java编程中非常重要的组成部分,用于处理文件读写、网络通信等数据传输任务。 1. 字节流 1.1 读取文件 import java.io.FileInputStream; import java.io.IOException;public class ReadFileExample {public static void main(String[] args) {try (FileInputSt…

Unity实现自定义图集(一)

以下内容是根据Unity 2020.1.0f1版本进行编写的   Unity自带有图集工具,包括旧版的图集(设置PackingTag),以及新版的图集(生成SpriteAtlas)。一般来说,unity自带的图集系统已经够用了,但是实际使用上还是存在一些可优化的地方,例如加载到Canvas上的资源,打图集不能…

PyQt 入门教程(3)基础知识 | 3.2、加载资源文件

文章目录 一、加载资源文件1、PyQt5加载资源文件2、PyQt6加载资源文件 一、加载资源文件 常见的资源文件有图像与图标,下面分别介绍下加载资源文件的常用方法 1、PyQt5加载资源文件 2、PyQt6加载资源文件 PyQt6版本暂时没有提供pyrcc工具,下面介绍下在不…

雷池社区版本SYSlog使用教程

雷池会对恶意攻击进行拦截,但是日志都在雷池机器上显示 如何把日志都同步到相关设备进行统一的管理和分析呢? 如需将雷池攻击日志实时同步到第三方服务器, 可使用雷池的 Syslog 外发 功能 启用 Syslog 外发 进入雷池 系统设置 页面, 配置 Syslog 设置…

北京京恋在喧嚣的都市中助你邂逅自己的爱情

北京的夜晚,灯火璀璨,车水马龙。刘凡站在他位于国贸的公寓阳台上,望着眼前熙熙攘攘的街道,心中却有一丝落寞。32岁的他,是一家知名互联网公司的中层管理,事业有成,收入稳定,甚至朋友…

anaconda(jupyter)安装教程

目录 一、下载anaconda安装包 二、安装程序 三、怎么使用 四、把jupyter界面语言修改成中文 一、下载anaconda安装包 anaconda官网:下载 Anaconda Distribution |蟒蛇 清华大学开源软件镜像站官网:清华大学开源软件镜像站 | Tsinghua Open Source M…

嵌入式linux中条件变量的具体实现

大家好,今天主要给大家分享一下,如何使用条件变量以及具体实现方法。 第一:条件变量分析 条件变量是另一种逻辑稍微复杂一点点的同步互斥机制,他必须跟互斥锁一起配合使 他的应用场景也是非常常见的,先来看一个例子: 用,小楠是一名在校学生,每个月都会从父母那里得到一笔…

考研C语言程序设计_语法相关(持续更新)

目录 一、语法题strlen转义字符内置数据类型字符串结束标志局部变量和全局变量名字冲突 局部优先switch语句中的关键字数组初始化是否正确注意define不是关键字C语言中不能用连等判断switch( )的括号里可以是什么类型?关于if关于switch关于while 二、程序阅读题有关static有关…

【openGL学习笔记】----GLFW、GLAD环境配置

glew、glad、freeglut、glfw的区别? glew(The OpenGL Extension Wrangler Library)是对底层OpenGL接口的封装,可以让你的代码跨平台。glad与glew作用相同,可以看作它的升级版。Freeglut(OpenGL Utility To…

计算机组成原理(笔记7高速缓冲存储器Cache,计算机组成原理的重难点全、直接、组相连)

为什么要设立高速缓冲存储器 (Cache)? Cache是介于CPU和主存之间的小容量存储器,存取速度比主存快。它能高速地向CPU提供指令和数据,加快程序的执行速度。它是为了解决CPU和主存之间速度不匹配而采用的一项重要技术。…

使用Mockaroo生成测试数据

使用Mockaroo生成测试数据 最近在学习【Spring Boot & React】Spring Boot和React教程视频的P51.Generating 1000 students一课中,看到了https://www.mockaroo.com/网站可以用来模拟生成测试数据,觉得还不错,特此记录一下。感觉每次看老…

centOS部署Jenkins实现项目可持续自动化部署

个人看的是尚硅谷的视频,跟着实战,但因为视频是21年的,所以很容易出现jenkins插件不适配问题。 因而个人直接用较新版的jdk和jenkins. 先切换到root用户 sudo su一、安装jdk 先查询可安装版本 yum list java*安装jdk(只复制圈…

【Python爬虫实战】正则:中文匹配与贪婪非贪婪模式详解

🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配中文 (一)匹配单个中文字符 (二…

DeepFM模型代码详解

直到看到这篇文章,我才搞明白类别特征怎么做lookup的,也看明白了代码逻辑。如果你看完没懂,私信留下wx,给你讲懂。 1、Deepfm 的原理,DeepFM 是一个模型还是代表了一类模型,DeepFM 对 FM 做了什么样的改进…

单细胞copyKat分析学习和整理

CopyKAT(肿瘤拷贝数核型分析)是一种使用综合贝叶斯方法的计算工具,能够在单细胞中以5MB分辨率检测全基因组非整倍体,以便从高通量单细胞RNA测序数据中区分肿瘤细胞与正常细胞,并识别肿瘤亚克隆。 (这里提一下,“5MB”是指 5兆碱基对(5 megab…

CTF-PWN方向 栈溢出等基础知识笔记(2)

C语言基本函数补充 write函数 ret2syscall 要求有0x80这种系统调用存在 (0x0A是回车的意思) 案例 通过file查看这个文件 发现是静态编译的文件 所以很多库函数都被编译进去了 但是不存在bin/sh字符串 不存在system和backdoor函数 修改,rea…