爬虫项目练手
python抓取优美图库小姐姐图片
整体功能概述
这段 Python 代码定义了一个名为 ImageDownloader 的类,其主要目的是从指定网站(https://www.umei.cc)上按照不同的图片分类,爬取图片并保存到本地相应的文件夹中。不过需要注意,未经授权爬取网站数据可能存在合法性问题,代码仅用于学习代码逻辑和合理的测试场景等情况。
代码思路详细拆解
-
类的初始化(
__init__方法):- 定义了
base_url变量,用于存储目标网站的基础地址,即https://www.umei.cc。 - 创建了一个空字典
category_urls,后续将用于存放不同图片分类对应的具体页面链接。 - 设置了请求头
headers,模拟浏览器发起请求,使服务器更有可能正常响应请求,避免因反爬机制而拒绝访问。
- 定义了
-
创建分类文件夹(
create_category_directories方法):- 遍历
category_urls字典中的每个分类名称(键)。 - 针对每个分类名称尝试创建对应的文件夹,若文件夹已存在,则打印提示信息跳过创建;若创建过程中出现其他
OSError类型的错误,则打印相应的错误提示。
- 遍历
-
发送 HTTP GET 请求(
send_get_request方法):- 接收一个
url参数,使用requests库发送 GET 请求,并传入设定好的请求头。 - 若请求过程中出现
requests.RequestException异常(比如网络连接问题、服务器拒绝访问等),则打印异常相关信息,并返回None,表示请求失败;若请求成功,则设置响应内容的编码为utf-8,然后返回响应对象。
- 接收一个
-
下载图片(
download_image方法):- 接收图片名称
image_name和图片的 URLimage_url作为参数。 - 首先从图片 URL 中提取文件后缀名(例如
.jpg、.png等),然后通过调用send_get_request方法获取图片的二进制内容。 - 使用
with语句以二进制写入模式打开一个本地文件(文件名由图片名称和后缀名组成),并将获取到的图片二进制内容写入该文件,以此实现图片的下载保存。
- 接收图片名称
-
主流程(
main方法):- 第一步,先向网站的图片分类主页面(
base_url + '/weimeitupian/')发送 GET 请求,若请求成功,使用BeautifulSoup库解析返回的 HTML 页面内容。 - 第二步,通过 CSS 选择器从解析后的页面中查找不同的图片分类元素,提取分类名称和对应的链接,并将它们存入
category_urls字典中。 - 第三步,调用
create_category_directories方法,依据category_urls字典中的分类名称创建对应的本地文件夹。 - 第四步,遍历
category_urls字典,针对每个分类,再次向其对应的页面发送 GET 请求,若请求成功,同样使用BeautifulSoup解析页面,获取该分类下每张图片相关的元素信息。 - 第五步,对于每张图片,提取图片名称以及图片详情页的链接,接着向图片详情页发送 GET 请求,若该请求也成功,继续解析详情页找到真正的图片 URL,最后调用
download_image方法将图片下载保存到对应的分类文件夹下,同时在控制台打印保存成功的图片名称信息;在各个环节如果出现请求失败或者找不到相应元素等情况,会打印对应的提示信息,说明图片保存失败以及失败的原因。
- 第一步,先向网站的图片分类主页面(
-
实例化类并执行主流程:
在代码的最后,实例化了ImageDownloader类,并调用其main方法启动整个图片爬取和保存的流程。
# encoding=utf-8
import requests
from bs4 import BeautifulSoup
import osclass ImageDownloader:def __init__(self):self.base_url = 'https://www.umei.cc'self.category_urls = {}self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'}def create_category_directories(self):"""创建以图片分类名称为名称的文件夹"""for category_name in self.category_urls:try:os.mkdir(f'./{category_name}')except FileExistsError:print(f"文件夹 {category_name} 已存在,跳过创建")except OSError as e:print(f"创建文件夹 {category_name} 时出现错误: {e}")def send_get_request(self, url):"""发送HTTP GET请求并返回响应对象,设置正确的编码"""try:response = requests.get(url, headers=self.headers)response.encoding = 'utf-8'return responseexcept requests.RequestException as e:print(f"请求 {url} 出现异常: {e}")return Nonedef download_image(self, image_name, image_url):"""根据给定的名称和图片URL,下载图片并保存到本地对应的文件夹中"""file_extension = image_url.split('.')[-1] # 获取后缀名image_content = self.send_get_request(image_url).contentwith open(f'./{image_name}.{file_extension}', 'wb') as file:file.write(image_content)def main(self):main_page_response = self.send_get_request(self.base_url + '/weimeitupian/')if main_page_response:main_page_soup = BeautifulSoup(main_page_response.text, 'html.parser')category_elements = main_page_soup.select('body > div.Clbc_top > div.taotu-nav')for category_element in category_elements:category_name = category_element.find('a').get_text()category_href = category_element.find('a').get('href')self.category_urls[category_name] = category_hrefself.create_category_directories() # 创建文件夹# 进行保存数据for category_name, category_href in self.category_urls.items():category_page_response = self.send_get_request(self.base_url + category_href)if category_page_response:category_page_soup = BeautifulSoup(category_page_response.text, 'html.parser')image_elements = category_page_soup.select('#infinite_scroll > div')for image_element in image_elements:image_link_element = image_element.select_one('div.item_b.clearfix > div.title > span > a')if image_link_element:image_name = image_link_element.get_text() # 图片名字image_href = 'https://www.umei.cc' + image_link_element.get('href') # 子页面地址sub_page_response = self.send_get_request(image_href)if sub_page_response:sub_page_soup = BeautifulSoup(sub_page_response.text, 'html.parser')img_url_element = sub_page_soup.select_one('body > div:nth-child(3) > div.photo > div.big-pic > a > img')if img_url_element:img_url = img_url_element.get('src')self.download_image(category_name + '/' + image_name, img_url)print(category_name + '/' + image_name) # 保存else:print(f"无法获取 {category_name + '/' + image_name} 的图片URL,保存失败")else:print(f"请求子页面 {image_href} 失败,{category_name + '/' + image_name} 保存失败")else:print(f"无法获取 {category_name} 分类下某张图片的元素信息,跳过保存")else:print(f"请求 {self.base_url + category_href} 失败,跳过该分类下图片保存")downloader = ImageDownloader()
downloader.main()
相关文章:
爬虫项目练手
python抓取优美图库小姐姐图片 整体功能概述 这段 Python 代码定义了一个名为 ImageDownloader 的类,其主要目的是从指定网站(https://www.umei.cc)上按照不同的图片分类,爬取图片并保存到本地相应的文件夹中。不过需要注意&…...
C程序设计:解决Fibonacci.数列问题
‘ 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、…...
35页PDF | 元数据与数据血缘落地实施(限免下载)
一、前言 这份报告详细介绍了元数据与数据血缘的概念、重要性以及在企业数据中台中的应用。报告阐述了数据中台的核心价值在于整合和管理体系内的数据,以提升数据资产化能力并支持业务决策。报告还涵盖了元数据的分类(技术元数据和业务元数据࿰…...
Lua元表和元方法的使用
元表是一个普通的 Lua 表,包含一组元方法,这些元方法与 Lua 中的事件相关联。事件发生在 Lua 执行某些操作时,例如加法、字符串连接、比较等。元方法是普通的 Lua 函数,在特定事件发生时被调用。 元表包含了以下元方法࿱…...
基于Pyhton的人脸识别(Python 3.12+face_recognition库)
使用Python进行人脸编码和比较 简介 在这个教程中,我们将学习如何使用Python和face_recognition库来加载图像、提取人脸编码,并比较两个人脸是否相似。face_recognition库是一个强大的工具,它基于dlib的深度学习模型,可以轻松实…...
Spring Boot+Netty
因工作中需要给第三方屏幕厂家下发广告,音频,图片等内容,对方提供TCP接口于是我使用Netty长链接进行数据传输 1.添加依赖 <!-- netty依赖--><dependency><groupId>io.netty</groupId><artifactId>netty-all&…...
LCR 023. 相交链表
一.题目: LCR 023. 相交链表 - 力扣(LeetCode) 二.我的原始解法-无: 三.其他人的正确及好的解法,力扣解法参考: 哈希表法及双指针法:LCR 023. 相交链表 - 力扣(LeetCode࿰…...
Linux命令行下载工具
1. curl 1.1. 介绍 curl是一个功能强大的命令行工具,用于在各种网络协议下传输数据。它支持多种协议,包括但不限于 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、SMTP、POP3、IMAP 等,这使得它在网络数据交互场景中有广泛的应用。curl可以模拟浏览器…...
期末复习-Hadoop名词解释+简答题纯享版
目录 一、名称解释(8选5) 1.什么是大数据 2.大数据的5V特征 3.什么是SSH 4.HDFS(p32) 5.名称节点 6.数据节点 7.元数据 8.倒排索引 9.单点故障 10.高可用 11.数据仓库 二、简答题 1.简述Hadoop的优点及其含义 2.简述…...
嵌入式Linux无窗口系统下搭建 Qt 开发环境
嵌入式Linux无窗口系统下搭建 Qt 开发环境 本文将介绍如何在树莓派的嵌入式 Linux 环境下,搭建 Qt 开发环境,实现无窗口系统模式(framebuffer)下的图形程序开发。 1. 安装 Qt 环境 接下来,安装核心 Qt 开发库以及与 …...
C#基础教程
1. C# 基础语法和操作符 C# 中的运算符优先级 namespace OperatorsAppl {class Program7{static void Main(string[] args){int a 20; // 定义变量aint b 10; // 定义变量bint c 15; // 定义变量cint d 5; // 定义变量dint e; // 定义变量e// 演示运算符优先级&…...
Alibaba EasyExcel 导入导出全家桶
一、阿里巴巴EasyExcel的优势 首先说下EasyExcel相对 Apache poi的优势: EasyExcel也是阿里研发在poi基础上做了封装,改进产物。它替开发者做了注解列表解析,表格填充等一系列代码编写工作,并将此抽象成通用和可扩展的框架。相对p…...
Spring Cloud + MyBatis Plus + GraphQL 完整示例
Spring Cloud MyBatis Plus GraphQL 完整示例 1、创建Spring Boot子项目1.1 配置POM,添加必要的依赖1.2 配置MyBatis-Plus 2、集成GraphQL2.1 定义schema.graphqls2.2 添加GraphQL解析器2.3 配置schame文件配置 3、访问测试3.1 查询测试(演示ÿ…...
uni-app简洁的移动端登录注册界面
非常简洁的登录、注册界面模板,使用uni-app编写,直接复制粘贴即可,无任何引用,全部公开。 废话不多说,代码如下: login.vue文件 <template><view class"content"><view class&quo…...
LongVU:用于长视频语言理解的空间时间自适应压缩
晚上闲暇时间看到一种用于长视频语言理解的空间时间自适应压缩机制的研究工作LongVU,主要内容包括: 背景与挑战:多模态大语言模型(MLLMs)在视频理解和分析方面取得了进展,但处理长视频仍受限于LLM的上下文长…...
Elasticsearch数据迁移(快照)
1. 数据条件 一台原始es服务器(192.168.xx.xx),数据迁移后的目标服务器(10.2.xx.xx)。 2台服务器所处环境: centos7操作系统, elasticsearch-7.3.0。 2. 为原始es服务器数据创建快照 修改elas…...
Linux Cgroup学习笔记
文章目录 Cgroup(Control Group)引言简介Cgroup v1通用接口文件blkio子系统cpu子系统cpuacct子系统cpuset子系统devices子系统freezer子系统hugetlb子系统memory子系统net_cls子系统net_prio子系统perf_event子系统pids子系统misc子系统 Cgroup V2基础操作组织进程和线程popula…...
百问FB显示开发图像处理 - PNG图像处理
2.3 PNG图像处理 2.3.1 PNG文件格式和libpng编译 跟JPEG文件格式一样,PNG也是一种使用了算法压缩后的图像格式,与JPEG不同,PNG使用从LZ77派生的无损数据压缩算法。对于PNG文件格式,也有相应的开源工具libpng。 libpng库可从…...
【JavaWeb后端学习笔记】MySQL多表查询(内连接、外连接、子查询)
MySQL 多表查询 1、连接查询1.1 内连接1.2 外连接 2、子查询2.1 标量子查询2.2 列子查询2.3 行子查询2.4 表子查询 3、多表查询案例 多表查询有两大类:连接查询和子查询。 连接查询又分为隐式/显式内连接和左/右外连接。 子查询又分为标量子查询、列子查询、行子查询…...
RocketMQ 过滤消息 基于tag过滤和SQL过滤
RocketMQ 过滤消息分为两种,一种tag过滤,另外一种是复杂的sql过滤。 tag过滤 首先创建producer然后启动,在这里创建了字符串的数组tags。字符串数组里面放置了多个字符串,然后去发送15条消息。 15条消息随着i的增长,…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
