爬虫项目练手

python抓取优美图库小姐姐图片

整体功能概述

这段 Python 代码定义了一个名为 ImageDownloader 的类,其主要目的是从指定网站(https://www.umei.cc)上按照不同的图片分类,爬取图片并保存到本地相应的文件夹中。不过需要注意,未经授权爬取网站数据可能存在合法性问题,代码仅用于学习代码逻辑和合理的测试场景等情况。

代码思路详细拆解

  1. 类的初始化(__init__ 方法)

    • 定义了 base_url 变量,用于存储目标网站的基础地址,即 https://www.umei.cc
    • 创建了一个空字典 category_urls,后续将用于存放不同图片分类对应的具体页面链接。
    • 设置了请求头 headers,模拟浏览器发起请求,使服务器更有可能正常响应请求,避免因反爬机制而拒绝访问。
  2. 创建分类文件夹(create_category_directories 方法)

    • 遍历 category_urls 字典中的每个分类名称(键)。
    • 针对每个分类名称尝试创建对应的文件夹,若文件夹已存在,则打印提示信息跳过创建;若创建过程中出现其他 OSError 类型的错误,则打印相应的错误提示。
  3. 发送 HTTP GET 请求(send_get_request 方法)

    • 接收一个 url 参数,使用 requests 库发送 GET 请求,并传入设定好的请求头。
    • 若请求过程中出现 requests.RequestException 异常(比如网络连接问题、服务器拒绝访问等),则打印异常相关信息,并返回 None,表示请求失败;若请求成功,则设置响应内容的编码为 utf-8,然后返回响应对象。
  4. 下载图片(download_image 方法)

    • 接收图片名称 image_name 和图片的 URL image_url 作为参数。
    • 首先从图片 URL 中提取文件后缀名(例如 .jpg.png 等),然后通过调用 send_get_request 方法获取图片的二进制内容。
    • 使用 with 语句以二进制写入模式打开一个本地文件(文件名由图片名称和后缀名组成),并将获取到的图片二进制内容写入该文件,以此实现图片的下载保存。
  5. 主流程(main 方法)

    • 第一步,先向网站的图片分类主页面(base_url + '/weimeitupian/')发送 GET 请求,若请求成功,使用 BeautifulSoup 库解析返回的 HTML 页面内容。
    • 第二步,通过 CSS 选择器从解析后的页面中查找不同的图片分类元素,提取分类名称和对应的链接,并将它们存入 category_urls 字典中。
    • 第三步,调用 create_category_directories 方法,依据 category_urls 字典中的分类名称创建对应的本地文件夹。
    • 第四步,遍历 category_urls 字典,针对每个分类,再次向其对应的页面发送 GET 请求,若请求成功,同样使用 BeautifulSoup 解析页面,获取该分类下每张图片相关的元素信息。
    • 第五步,对于每张图片,提取图片名称以及图片详情页的链接,接着向图片详情页发送 GET 请求,若该请求也成功,继续解析详情页找到真正的图片 URL,最后调用 download_image 方法将图片下载保存到对应的分类文件夹下,同时在控制台打印保存成功的图片名称信息;在各个环节如果出现请求失败或者找不到相应元素等情况,会打印对应的提示信息,说明图片保存失败以及失败的原因。
  6. 实例化类并执行主流程
    在代码的最后,实例化了 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()

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

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

相关文章

对比json数据是否变化

在 JavaScript 中,你可以使用多种方法来对比两个 JSON 数据是否发生变化。以下是几种常见的方式: 1. 使用 JSON.stringify 最简单的方法是将两个 JSON 对象序列化为字符串,并比较这些字符串。但需要注意的是,这种方法对于对象属…

C++设计模式:代理模式(Proxy)(附案例代码)

什么是代理模式? 代理模式是一种结构型设计模式,主要用于为某个对象提供一个代理,以便在不直接访问对象的情况下控制对其的访问。代理可以在客户端和目标对象之间起到一个中介的作用,添加一些额外的操作,例如权限控制…

【笔记】软技能

硬技能:操控世界的能力,处理对象为【物】。软技能:影响他人的能力,处理对象为【人】。软技能包括一个人的情商、个性、社交礼仪、沟通、语言、个人习惯,还有解决问题的能力、领导能力、时间管理能力等一切非技术能力。…

uni-app简洁的移动端登录注册界面

非常简洁的登录、注册界面模板&#xff0c;使用uni-app编写&#xff0c;直接复制粘贴即可&#xff0c;无任何引用&#xff0c;全部公开。 废话不多说&#xff0c;代码如下&#xff1a; login.vue文件 <template><view class"content"><view class&quo…

单台服务器上创建多个端口MySQL服务

单台服务器上创建多个端口MySQL服务 直接拷贝已经运行的数据库文件: # ll /data/mysql/ 总用量 204 drwxr-x--- 2 mysql mysql 4096 9月 15 2023 bin -rw-r--r-- 1 mysql mysql

【开源免费】基于SpringBoot+Vue.JS购物推荐网站(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 073 &#xff0c;文末自助获取源码 \color{red}{T073&#xff0c;文末自助获取源码} T073&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

AI在SEO中的应用与关键词优化探讨

内容概要 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术为搜索引擎优化&#xff08;SEO&#xff09;带来了革命性的改变。传统的SEO主要依赖于人为的经验和判断&#xff0c;而AI则通过算法分析海量数据&#xff0c;提供更加精准和高效的方式优化关键词…

Tomcat新手成长之路:安装部署优化全解析(下)

接上篇《Tomcat新手成长之路&#xff1a;安装部署优化全解析&#xff08;上&#xff09;》: link 文章目录 7.应用部署7.1.上下文7.2.启动时进行部署7.3.动态应用部署 8.Tomcat 类加载机制8.1.简介8.2.类加载器定义8.3.XML解析器和 Java 9.JMS监控9.1.简介9.2.启用 JMX 远程监…

服务器数据恢复—服务器raid0阵列硬盘指示灯显示黄颜色的数据恢复案例

服务器数据恢复环境&故障情况&#xff1a; 某品牌服务器上有一组由两块SAS硬盘组建的raid0阵列&#xff0c;上层是windows server操作系统ntfs文件系统。服务器上一个硬盘指示灯显示黄颜色&#xff0c;该指示灯对应的硬盘离线&#xff0c;raid不可用。 服务器数据恢复过程…

Ant-Design-Vue 全屏下拉日期框无法显示,能显示后小屏又位置错乱

问题1&#xff1a;在全屏后 日期选择器的下拉框无法显示。 解决&#xff1a;在Ant-Design-Vue的文档中&#xff0c;很多含下拉框的组件都有一个属性 getPopupContainer可以用来指定弹出层的挂载节点。 在该组件上加上 getPopupContainer 属性,给挂载到最外层盒子上。 <temp…

php 系统函数 记录

PHP intval() 函数 PHP函数介绍—array_key_exists(): 检查数组中是否存在特定键名 如何使用PHP中的parse_url函数解析URL PHP is_array()函数详解&#xff0c;PHP判断是否为数组 PHP函数介绍&#xff1a;in_array()函数 strpos定义和用法 strpos() 函数查找字符串在另一字符串…

Hive学习基本概念

基本概念 hive是什么&#xff1f; Facebook 开源&#xff0c;用于解决海量结构化日志的数据统计。 基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能 本质是将HQL转化为MapReduce程序。 Hive处理的数据存储在H…

chrome使用问题记录

1. http自动跳转https问题 step1. 地址栏输入&#xff1a; chrome://net-internals/#hsts step2. 找到底部Delete domain security policies一栏&#xff0c;输入想处理的域名&#xff0c;点击delete。 注意&#xff1a;输入域名时去掉前缀http step3. 搞定了&#xff0c;再…

内网穿透 natapp安装与使用

前言 NATAPP是一款基于ngrok的内网穿透工具。以下是对NATAPP的详细概述&#xff1a; 基本概念 定义&#xff1a;内网穿透&#xff08;NAT穿透&#xff09;是一种技术&#xff0c;它允许具有特定源IP地址和端口号的数据包能够绕过NAT设备&#xff0c;从而被正确地路由到内网主机…

计算机光电成像理论基础

一、透过散射介质成像 1.1 光在散射介质中传输 光子携带物体信息并进行成像的过程是一个涉及光与物质相互作用的物理现象。这个过程可以分为几个步骤来理解&#xff1a; 1. **光的发射或反射**&#xff1a; - 自然界中的物体可以发射光&#xff08;如太阳&#xff09;&am…

视频监控汇聚平台Liveweb视频安防监控实时视频监控系统操作方案

Liveweb国标GB28181视频平台是一种基于国标GB/T28181协议的安防视频流媒体能力平台。它支持多种视频功能&#xff0c;包括实时监控直播、录像、检索与回看、语音对讲、云存储、告警以及平台级联等功能。该平台部署简单、可扩展性强&#xff0c;支持全终端、全平台分发接入的视频…

ASP.NET Core 9.0 静态资产传递优化 (MapStaticAssets )

一、结论 &#x1f4a2;先看结论吧&#xff0c; MapStaticAssets 在大多数情况下可以替换 UseStaticFiles&#xff0c;它已针对为应用在生成和发布时了解的资产提供服务进行了优化。 如果应用服务来自其他位置&#xff08;如磁盘或嵌入资源&#xff09;的资产&#xff0c;则应…

在 Windows 11 WSL (Ubuntu 24.04.1 LTS) | Python 3.12.x 下部署密码学库 charm

1. 在 Windows 11 上部署 Ubuntu (WSL) 由于作者没有高性能的 Ubuntu 服务器或个人电脑&#xff0c;且公司或学校提供的 Ubuntu 服务器虽然提供高性能 GPU 等硬件配置但通常不会提供 root 权限&#xff0c;因而作者通过在搭载了 Windows 11 的个人电脑上启动 Ubuntu (WSL) 来进…

element-ui radio和checkbox禁用时不置灰还是原来不禁用时的样式

把要紧用的内容加上一个class"notEdit-page" z注意要在style里面写不能加上scoped /*//checkBox自定义禁用样式*//*//checkBox自定义禁用样式*/ .notEdit-page.el-checkbox__input.is-disabled.is-checked.el-checkbox__inner::after {border-color: #fff; } .notEdi…

Qt自定义 Qt Designer 插件

创建 Qt Designer 插件项目 Qt 提供两种设计插件的 API&#xff0c;可以用于扩展 Qt 的功能。高级 API 用于设计插件以扩展 Qt 的功能&#xff0c;例如定制数据库驱动、图像格式、文本编码、定制样式等。Qt Designer 里大量采用了插件&#xff0c;点击 Qt Creator 的“Help”-…