爬虫运用--实战爬取高清图片

embedded/2025/2/22 13:37:06/

实战爬取高清图片

选择目标

首先选择一个网站,随便找了一下,发现这个网站质量还行
image.png

既然如此,直接开搞

分析结构

分析

随便查看一下,发现是通过index_{数字}.html控制图片显示的,这个就很好全部爬取下来了,先尝试爬取index_1.html的内容,之后直接for循环就行了
image.png
ctrl+u查看源码,发现图片的地址结构
image.png

访问验证一下,发现图片地址
image.png

总结

  • 首先每一个链接地址,都在class="imgw"这个类特定的类名下面
  • 图片的url就在img标签下的lay-src属性下面
  • 所有我们现在只需要提取class值为imgw的a标签,之后再提取出img标签中的lay-src的url值

实现

获取html网页内容

使用requests获取源码

def fetch_page_content(url):  headers = {  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'  }  try:  response = requests.get(url, headers=headers)  response.raise_for_status()  # 确保请求成功  return response.text  except requests.RequestException as e:  print(f"Error fetching the page content: {e}")  return None

指定请求头信息

    headers = {  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'  }

返回respose.text,获取网页内容

url地址获取

使用BeautifulSoup解析html内容获取图片的url地址

def extract_image_urls(html_content):  soup = BeautifulSoup(html_content, 'html.parser')  containers = soup.find_all('a', attrs={'class': 'imgw'})  print(containers)  image_urls = []  for container in containers:  url = container.find('img')['lay-src']  image_urls.append(url)  print(url)  return image_urls
提取a标签数据

分析代码,find_all函数会返回一个列表,这里是提取

  • class值为imgw的a标签
    containers = soup.find_all('a', attrs={'class': 'imgw'})  print(containers)

可以print验证一下,成功提取
image.png

提取出img标签中的lay-src的url值

使用for循环得到url

    for container in containers:  url = container.find('img')['lay-src']  image_urls.append(url)  print(url)
  • container.find('img'):在当前 container 元素中查找第一个 <img> 标签。
  • ['lay-src']:获取该 <img> 标签的 lay-src 属性的值。lay-src 是一个自定义属性,通常用于存储实际的图像 URL。
  • url 变量存储了这个 lay-src 属性的值

下载图片

使用Image和BytesIO下载图片

def download_and_save_image(image_url, save_path):  try:  response = requests.get(image_url)  response.raise_for_status()  image = Image.open(BytesIO(response.content))  image.save(save_path)  print(f"Image saved successfully at {save_path}")  except requests.RequestException as e:  print(f"Error downloading image from {image_url}: {e}")  except IOError as e:  print(f"Error saving image: {e}")
  • BytesIO(response.content) 将响应的二进制内容转换为一个内存中的文件对象。
  • Image.open(...) 使用 PIL 库打开这个内存中的文件对象,将其解析为一个图像对象。
  • image.save(save_path) 将图像对象保存到指定的 save_path

完整代码

import os  
import requests  
from bs4 import BeautifulSoup    
from io import BytesIO  
from PIL import Image  # 1. 获取网页内容  
def fetch_page_content(url):  headers = {  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'  }  try:  response = requests.get(url, headers=headers)  response.raise_for_status()  # 确保请求成功  return response.text  except requests.RequestException as e:  print(f"Error fetching the page content: {e}")  return None  # 2. 解析网页内容,提取图片地址  
def extract_image_urls(html_content):  soup = BeautifulSoup(html_content, 'html.parser')  containers = soup.find_all('a', attrs={'class': 'imgw'})  print(containers)  image_urls = []  for container in containers:  url = container.find('img')['lay-src']  image_urls.append(url)  print(url)  return image_urls  # 3. 下载图片  
def download_and_save_image(image_url, save_path):  try:  response = requests.get(image_url)  response.raise_for_status()  image = Image.open(BytesIO(response.content))  image.save(save_path)  print(f"Image saved successfully at {save_path}")  except requests.RequestException as e:  print(f"Error downloading image from {image_url}: {e}")  except IOError as e:  print(f"Error saving image: {e}")  # 4. 主函数  
def main():  url = 'https://www.3gbizhi.com/meinv/mnxz/index_1.html'  # 目标网站  save_directory = 'downloaded_images'  # 保存图片的文件夹  if not os.path.exists(save_directory):  os.makedirs(save_directory)  html_content = fetch_page_content(url)  if html_content is None:  print("Failed to fetch page content.")  return  image_urls = extract_image_urls(html_content)  for index, image_url in enumerate(image_urls):  save_path = os.path.join(save_directory, f'image_{index}.jpg')  download_and_save_image(image_url, save_path)  if __name__ == "__main__":  main()

运行结果
image.png

image.png

下载高清图片

我们可以发现,这种直接爬取下来的图片画质不怎么样,只能说要用就用高清的

思路

我们发现点击图片进入,发现不但有更多的图片,而且有下载按钮
image.png
点击下载发现需要登录,不过可以发现注册不需要邮箱,可以直接注册
image.png
注册之后发现,可以直接打包下载
image.png
先下载下来,观察一下,发现是zip文件,需要解压,解压之后可以看到高清图片
image.png

实现

在下载按钮右击鼠标,查看一下,发现下载链接是需要执行javascript代码才会生成的
image.png
点击之后
image.png

使用selenium库

实战_selenium

选择目标

目标还是之前那个,可以下去看一下上一篇文章

image.png

分析下载流程

需要使用selenium库

我们发现点击图片进入,发现不但有更多的图片,而且有下载按钮
image.png
点击下载发现需要登录,不过可以发现注册不需要邮箱,可以直接注册
image.png
注册之后发现,可以直接打包下载
image.png
先下载下来,观察一下,发现是zip文件,需要解压,解压之后可以看到高清图片
image.png

在下载按钮右击鼠标,查看一下,发现下载链接是需要执行javascript代码才会生成的
image.png
点击之后
image.png
所以,这里我们需要使用selenium库

需要爬取页面链接地址

我们可以发现,如果是使用搜索功能
image.png
进入之后,可以切换另一种图片
image.png
但是切换之后不是我们搜索的图片的下一张
image.png

所以我们需要写一个脚本直接爬取搜索页面的所有图片的查看地址,这个
image.png

需要进行递归解压

因为下载下来的是zip文件,解压之后发现除了图片以为,还有别的,所以我们需要判断
假设我们的需求是将所有的文件解压然后将图片复制到一个总的文件夹img_all下面
image.png

实现爬取页面url

分析

image.png
可以看到结构很简单

  • 首先可以提取class=imgw的值
  • 然后提取a标签的href的值
import requests  
from bs4 import BeautifulSoup  with open("urls.txt", "a") as f:  for i in range(1,100):  url = f"https://desk.3gbizhi.com/search/0-0-2-0/ai%E7%BE%8E%E5%A5%B3/index_{i}.html"  r = requests.get(url)  if "找不到相关图片,您可以换一个关键词试试" in r.text:  break  soup = BeautifulSoup(r.text, "html.parser")  a=soup.find_all("a",attrs={"class":"imgw"})  for i in a:  url=i.get("href")  print(url)  f.write(url+"\n")

使用

比如我们搜索:ai美女
image.png

image.png

实现递归解压

实现

import os  
import zipfile  
import shutil  # 支持的图片格式  
IMAGE_EXTENSIONS = ['.jpeg', '.jpg', '.png', '.gif', '.bmp', '.tiff', '.webp']  def find_zip_files(directory):  """ 递归搜索目录下的所有 .zip 文件 """    zip_files = []  for root, dirs, files in os.walk(directory):  print(f"Searching in directory: {root}")  # 打印当前搜索的目录  for file in files:  if file.endswith('.zip'):  full_path = os.path.join(root, file)  print(f"Found .zip file: {full_path}")  # 打印找到的 .zip 文件  zip_files.append(full_path)  return zip_files  def extract_images_from_zip(zip_path, output_dir):  with zipfile.ZipFile(zip_path, 'r') as zip_ref:  for member in zip_ref.namelist():  if any(member.lower().endswith(ext) for ext in IMAGE_EXTENSIONS):  # 提取文件  zip_ref.extract(member, path=output_dir)  # 移动文件到目标文件夹  source_file = os.path.join(output_dir, member)  target_file = os.path.join(output_dir, os.path.basename(member))  os.makedirs(os.path.dirname(target_file), exist_ok=True)  shutil.move(source_file, target_file)  print(f"Extracted and moved: {target_file}")  # 打印提取和移动的文件  def main():  img_directory = 'img'  # 源文件夹  img_all_directory = r'img_all'  # 目标文件夹  # 创建目标文件夹如果它不存在  os.makedirs(img_all_directory, exist_ok=True)  # 查找所有 .zip 文件  zip_files = find_zip_files(img_directory)  # 处理每个 .zip 文件  for zip_file in zip_files:  print(f"Processing {zip_file}")  extract_images_from_zip(zip_file, img_all_directory)  if __name__ == '__main__':  main()

解释:

extract_images_from_zip:

  • find_zip_files 函数递归地搜索指定目录下的所有 .zip 文件。
  • os.walk(directory):递归地遍历目录树,返回一个生成器,生成器的每个元素是一个三元组 (root, dirs, files),分别表示当前目录路径、子目录列表和文件列表。
  • file.endswith('.zip'):检查文件是否以 .zip 结尾。
  • full_path = os.path.join(root, file):构建文件的完整路径。
  • zip_files.append(full_path):将找到的 .zip 文件路径添加到 zip_files 列表中。
    extract_images_from_zip函数:
  • extract_images_from_zip 函数从指定的 .zip 文件中提取所有支持的图片格式文件,并将这些文件移动到目标文件夹中。
  • zipfile.ZipFile(zip_path, 'r'):打开指定的 .zip 文件进行读取。
  • zip_ref.namelist():获取 .zip 文件中的所有成员(文件和目录)的名称列表。
  • any(member.lower().endswith(ext) for ext in IMAGE_EXTENSIONS):检查成员是否是支持的图片格式。
  • zip_ref.extract(member, path=output_dir):从 .zip 文件中提取指定的文件到目标文件夹。
  • source_file = os.path.join(output_dir, member):构建提取文件的完整路径。
  • target_file = os.path.join(output_dir, os.path.basename(member)):构建目标文件的完整路径。
  • os.makedirs(os.path.dirname(target_file), exist_ok=True):创建目标文件夹的父目录,如果它们不存在。
  • shutil.move(source_file, target_file):将提取的文件移动到目标位置。

http://www.ppmy.cn/embedded/164341.html

相关文章

计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

关闭超时订单和七天自动确认收货+RabbitMQ规范

关闭超时订单 创建订单之后的一段时间内未完成支付而关闭订单的操作&#xff0c;该功能一般要求每笔订单的超时时间是一致的 TTL&#xff08;Time To Live&#xff09;存活时间&#xff0c;只能被设置为某个固定的值&#xff0c;不能更改&#xff0c;否则抛出异常 死信&#…

贪心算法-买卖股票的最佳时机

买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天 的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股 票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易…

✨2.快速了解HTML5的标签类型

✨✨HTML5 的标签类型丰富多样&#xff0c;每种类型都有其独特的功能和用途&#xff0c;以下是一些常见的 HTML5 标签类型介绍&#xff1a; &#x1f98b;结构标签 &#x1faad;<html>&#xff1a;它是 HTML 文档的根标签&#xff0c;所有其他标签都包含在这个标签内&am…

JUC并发—9.并发安全集合三

大纲 1.并发安全的数组列表CopyOnWriteArrayList 2.并发安全的链表队列ConcurrentLinkedQueue 3.并发编程中的阻塞队列概述 4.JUC的各种阻塞队列介绍 5.LinkedBlockingQueue的具体实现原理 6.基于两个队列实现的集群同步机制 1.并发安全的数组列表CopyOnWriteArrayList …

小米路由器 AX3000T 降级后无法正常使用,解决办法

问题描述 买了个 AX3000T 路由器&#xff0c;想安装 OpenWRT 或者 安装 Clash 使用&#xff0c;看教程说是需要降级到 v1.0.47 版本。 结果刷机之后路由器无法打开了&#xff0c;一直黄灯亮&#xff0c;中间灭一下&#xff0c;又是黄灯长亮&#xff0c;没有 WIFI 没有连接。以…

微软宣布 Windows 11 将不再免费升级:升级需趁早

大家都知道如果你现在是Windows 10 系统&#xff0c;其实可以免费升级到正版 Windows 11&#xff0c;只要你的电脑配置满足 TPM2.0要求。 而最近微软已经公布了 Windows 10 的最后支持时间&#xff0c;也就是今年10月14日&#xff0c;在这之后微软将不再对Windows 10负责&#…

uniapp中引入Vant Weapp的保姆级教学(包含错误处理)

废话不多说&#xff0c;直接上方法&#xff0c;网上的教学好多都是错误的 1.安装vant weapp 在Hbuilder的终端&#xff0c;输入以下代码 npm install vant/weapp -S --production 2.新建wxcomponents文件夹 在项目的跟目录新建一个“wxcomponents’文件夹&#xff0c;与app.…