当前位置: 首页 > news >正文

爬虫项目练手

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.lryc.cn/news/498109.html

相关文章:

  • C程序设计:解决Fibonacci.数列问题
  • 35页PDF | 元数据与数据血缘落地实施(限免下载)
  • Lua元表和元方法的使用
  • 基于Pyhton的人脸识别(Python 3.12+face_recognition库)
  • Spring Boot+Netty
  • LCR 023. 相交链表
  • Linux命令行下载工具
  • 期末复习-Hadoop名词解释+简答题纯享版
  • 嵌入式Linux无窗口系统下搭建 Qt 开发环境
  • C#基础教程
  • Alibaba EasyExcel 导入导出全家桶
  • Spring Cloud + MyBatis Plus + GraphQL 完整示例
  • uni-app简洁的移动端登录注册界面
  • LongVU:用于长视频语言理解的空间时间自适应压缩
  • Elasticsearch数据迁移(快照)
  • Linux Cgroup学习笔记
  • 百问FB显示开发图像处理 - PNG图像处理
  • 【JavaWeb后端学习笔记】MySQL多表查询(内连接、外连接、子查询)
  • RocketMQ 过滤消息 基于tag过滤和SQL过滤
  • element-ui 基本样式的一些更改【持续更新】
  • element-ui radio和checkbox禁用时不置灰还是原来不禁用时的样式
  • 第一部分:基础知识 6. 函数 --[MySQL轻松入门教程]
  • 【蓝桥杯每日一题】扫雷
  • 【算法】棋盘覆盖问题源代码及精简版
  • Django的介绍
  • 【Spring工具插件】lombok使用和EditStarter插件
  • 掌控时间,成就更好的自己
  • Ruby On Rails 笔记2——表的基本知识
  • 【AI系统】EfficientNet 系列
  • 【Python小白|Python内置函数学习2】Python有哪些内置函数?不需要导入任何模块就可以直接使用的!现在用Python写代码的人还多吗?