爬虫项目练手
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的增长,…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
