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]).content
        with 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]).content
        with 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_encoding
    html = 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]).content
        with 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_encoding
    html = 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))

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git推送被拒

今天开发完成一个新的需求,将自己的分支合并到test分支后,推送到远程仓库,结果显示推送被拒: 原因是因为有人更新了test分支的代码,我在合并之前没有拉取最新的test分支代码,所以他提示我“推送前需要合并…

Steinberg VST Live Pro v2.1.1 演出音频灯光控制软件

现场演出音频视频灯光控制软件 Steinberg VST Live Pro 将让现场表演更轻松。这是一款独特、稳定的软件解决方案,专为想要进行精彩表演的音乐家而设计,无论身在何处都能使用声音、灯光和视频等相关功能。VST Live附带大量虚拟乐器,音乐同步功…

STM32学习--4-1 OLED显示屏

接线图 OLED.c #include "stm32f10x.h" #include "OLED_Font.h"/*引脚配置*/ #define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x)) #define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))/*引脚初始化*/ void …

(27)QPSK信号在非相关平坦莱斯(Rician)衰落信道上的误码率性能MATLAB仿真

文章目录 前言一、Rician衰落信道模型的MATLAB代码二、在非相关的平坦Rician衰落信道上传输QPSK符号模型1.MATLAB仿真代码2.仿真结果 前言 本文首先给出莱斯衰落信道的建模函数,然后基于该函数给出在非相关的平坦Rician衰落信道上传输QPSK数字调制符号的MATLAB仿真…

iTOP-3A5000主控板龙芯自主指令系统外加机箱就是一台电脑主机

性能强采用全国产龙芯3A5000处理器,基于龙芯自主指令系统 (LoongArch)的LA464微结构,并进一步提升频率,降低功耗,优化性能。桥片采用龙芯 7A2000,支持PCIE 3.0、USB 3.0和 SATA 3.0.显示接口2 路、HDMI 和1路 VGA&…

qt页面设计

1. Designer 设计师(掌握) Designer是Qt内置的一款界面设计程序,设计的界面文件为.ui格式。 C程序员通常不会单独启动Designer,如果要在项目中使用Designer程序,只需要在新建项目时,勾选“创建界面文件”选…

【关系模型】关系完整性约束

按照上面的框架我们已经讲了关系数据结构还有关系操作,今天来补充这一章的关系完整性约束 关系完整性约束 完整性约束 完整性约束可以保证数据的一致性和元组的唯一性 实体完整性约束 比如在学生表中,每一个元组都应该是唯一并且元组之间是可以区分…

【游戏模组】极品飞车12无间风云冬季mod,冬天版本的无间风云你体验过吗

各位好,今天小编给大家带来一款新的高清重置魔改MOD,本次高清重置的游戏叫《极品飞车12无间风云》。 《极品飞车12:无间风云》是由Black Box游戏制作室开发的竞速类游戏,于2008年11月18日在北美首发、2008年11月21日在欧洲先后推…

Java基础:面向对象编程7

1 Java 不可变对象 1.1 什么是不可变类 定义:一个类的对象在通过构造方法创建后,其状态(成员变量值)不会再被改变,这样的类称为不可变(immutable)类。特点: 所有成员变量的赋值仅在…

生成 Excel 表列名称

Excel 大家都用过,它的列名是用字母编号的,A 表示第一列,B 表示第二列,AA 表示第27列,AB 表示第28列等等。 现给定一个数字,如何得到列名称呢。比如输入28,输出 AB。 一开始以为就是一个简单的…

2017年计算机网络408真题解析

第一题: 解析:OSI体系结构数据包的逐层封装 应用层发送的400B数据称为应用层协议数据单元,也就是题目所说的PDU, 表示层将应用层发过来的PDU添加一个20B的首部,封装称为表示层PDU,并将其交付给会话层&#…

接口测试(一)基础

一、http请求格式 请求&#xff1a;从客户端到服务端的请求消息 请求消息格式 请求行&#xff1a;请求方法、请求URL、HTTP协议及版本 URL的一般形式为<协议>://<主机>:<端口>/<路径>/<文件名>请求头部空一行请求体 请求方法 请求方法get请求…

HCIP——以太网交换安全(四)DHCP Snooping

目录 一、DHCP Snooping的知识点 二、DHCP Snooping实验拓扑 三、总结 一、DHCP Snooping的知识点 1.1、DHCP snooping 概述&#xff1a; ①DHCP Snooping使能DHCP的一种安全特性&#xff0c;用于保证DHCP客户端从合法的DHCP服务端获取IP地址。DHCP服务器记录DHCP客户端IP…

pycharm 找不到conda环境

参考&#xff1a;新版Pycharm解决Conda executable is not found-CSDN博客

[C++刷题] 基础小知识点(1) 乘方函数pow()

乘方 pow() 该函数在math.h头文件中 例如: 求圆的面积公式 s3.14*pow(r,2); 例题: #include<iostream> using namespace std; #include<math.h>) int main() {int h;int r;cin >> h >> r;double v h * 3.14 * pow(r, 2);int ret 0;if (v > 200…

slam系列4:nerf和3dgs

常用的3维表示法&#xff1a; NeRF属于是density的模型&#xff0c;模型的参数如下&#xff1a; 传统的 3D 模型表示方法&#xff0c;如 离散的Mesh 和点云&#xff0c;以及连续的 Nerf&#xff0c;通常面临着一个主要问题&#xff1a;随机采样过程中产生的噪声&#xff0c;这…

P5430 7.68T U.2 NVME SBFPF2BU076T001 Solidigm固态硬盘

SBFPF2BU076T001 Solidigm P5430 7.68T U.2 NVME企业级固态硬盘 Solidigm针对企业应用推出D5-P5430固态硬盘&#xff0c;针对主流和读取密集型应用程序进行了优化&#xff0c;面向大量企业工作它采用PCIe Gen 4总线与QLC类型NAND颗粒&#xff0c;提供大量的存储密度并降低总拥…

《云计算网络技术与应用》实训6-1:配置KVM虚拟机使用NAT网络

任务1、计算节点基础环境准备 1. 使用VMware安装CentOS 7虚拟机&#xff0c;安装时记得开启CPU虚拟化&#xff0c;命名为“KVMC6”。 2. &#xff08;网卡配置和之前的一样&#xff0c;都用100网段&#xff09;网关设置为192.168.100.1&#xff0c;地址段为192.168.100.10-25…

数据分析:R语言计算XGBoost二分类模型的SHAP值

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍SHAP用途计算方法:应用加载R包导入数据建模平均SHAP值计算单个样本的每个特征的SHAP值蜜蜂图依赖图单个样本的SHAP解释(Force Plot)其他方法计算SHAP值单个个体预测结果系统信息…

轻松掌握:如何查找家中WiFi的IP地址

在如今数字化生活的时代&#xff0c;WiFi已成为我们日常生活中不可或缺的一部分。无论是上网冲浪、在线学习、还是远程办公&#xff0c;稳定的WiFi连接都显得尤为重要。然而&#xff0c;有时我们可能需要了解家中WiFi的IP地址&#xff0c;以便进行网络设置、故障排查或进行其他…