爬虫项目练手
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的增长,…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
