Python爬取网页图片

**

效果展示

**
在这里插入图片描述

**

代码介绍

**

1. os (操作系统接口)
用来创建文件夹(os.makedirs())和保存图片(os.path.join())到指定的目录。

用途:处理文件路径、创建输出文件夹等。

2. time (时间功能)
用于暂停执行的时间(例如 time.sleep()),确保页面加载完毕或完成模拟滚动。

用途:延迟操作,避免页面还未加载完成就执行下一步操作。

3. requests (HTTP 请求库)
用于发送 HTTP 请求并下载图片。如果图片是通过 HTTP(S) 访问的,requests 用来获取图片的内容。

用途:下载图片数据,如果图片是通过 HTTP(S) URL 获取的,通过 requests.get() 获取并保存图片。

4. base64 (Base64 编码解码)
用于处理 Base64 编码的图片数据。如果图片的 URL 是 Base64 格式(即 data:image 开头),代码会解析并解码该图片。

用途:解码 Base64 编码的图片并保存为文件。

5. urllib3 (HTTP 库)
用于禁用 SSL 警告,因为在访问一些网页时,可能会遇到 SSL 警告。通过 urllib3.disable_warnings() 来关闭 SSL 警告。

用途:禁用 SSL 警告,避免在不安全的 HTTPS 请求时打印警告信息。

6. selenium (浏览器自动化)
用于模拟浏览器的操作,包括加载网页、滚动页面、获取图片元素等。selenium 通过 webdriver 访问页面,并与页面交互。

用途:自动化浏览器操作,加载网页、滚动页面,等待页面元素加载,并获取网页中的所有图片元素。

selenium.webdriver: 用于启动和控制浏览器的主要接口。

webdriver.Edge(): 启动 Microsoft Edge 浏览器。

Service(): 用来指定浏览器驱动的路径。

By.TAG_NAME: 用来定位网页中的元素,这里是定位所有图片元素。

WebDriverWait 和 expected_conditions (EC): 用来等待图片元素的加载,确保页面内容完全渲染。

driver.execute_script():用来执行 JavaScript 代码,模拟滚动页面。

7. tkinter (图形用户界面库)
用于创建图形用户界面(GUI)。它提供了窗口、按钮、标签、文本框等组件来创建用户交互界面。

用途:创建输入框让用户输入网页 URL 和需要下载的图片数量,显示下载结果,以及开始下载按钮。

tk.Tk(): 创建主窗口。

tk.Label(): 创建标签,用于显示提示文本。

tk.Entry(): 创建输入框,让用户输入 URL 和图片数量。

tk.Button(): 创建按钮,当用户点击按钮时触发 start_download 函数。

tk.Text(): 创建一个多行文本框,用于显示下载的结果或错误信息。

8. re (正则表达式)
用于检查 URL 是否符合有效的 URL 格式,确保用户输入的是有效的 URL。

用途:验证 URL 的格式是否合法,确保用户输入的链接是有效的,并带有协议(如 http:// 或 https://)。

9. concurrent.futures (并发编程)
用于并行下载多个图片,ThreadPoolExecutor 用来创建一个线程池,并发执行多个图片下载任务。

用途:使用多线程提高下载效率,将多个图片下载任务并行执行。

10. requests.exceptions.RequestException 和 Exception
用于捕获请求异常和其他可能发生的错误。通过异常处理确保在下载过程中出现错误时能够捕获并打印相应的错误信息。

**

部分源码

**

##完整源码gongzhonghao:PandaYY回复1019
import os
import time
import requests
import base64
import urllib3
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import tkinter as tk
import re
from concurrent.futures import ThreadPoolExecutor
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def is_valid_url(url):
    regex = re.compile(
        r'^(?:http|ftp)s?://'
        r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|'
        r'localhost|'
        r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|'
        r'\[?[A-F0-9]*:[A-F0-9:]+\]?)'
        r'(?::\d+)?'
        r'(?:/?|[/?]\S+)$', re.IGNORECASE)
    return re.match(regex, url) is not None


def download_single_image(img_url, output_dir, index):
    try:
        print(f"开始下载第 {index + 1} 张图片: {img_url}")
        # 如果是 Base64 图片,则直接处理
        if img_url.startswith('data:image'):
            img_data = img_url.split(',')[1]
            img_data = base64.b64decode(img_data)
        else:
            # 对图片进行 HTTP 请求
            response = requests.get(img_url, verify=False, timeout=10)
            response.raise_for_status() 
            img_data = response.content

        # 保存图片到文件
        with open(os.path.join(output_dir, f'image_{index}.jpg'), 'wb') as img_file:
            img_file.write(img_data)
        print(f"第 {index + 1} 张图片下载成功")

    except requests.exceptions.RequestException as e:
        print(f"下载第 {index + 1} 张图片失败: {e}")
    except Exception as e:
        print(f"保存图片时发生错误,第 {index + 1} 张图片: {e}")


def download_images(url, image_count):
    driver_path = R'C:\Users\Y\Downloads\edgedriver_win64\msedgedriver.exe'  # Edge 驱动路径
    service = Service(driver_path)
    driver = webdriver.Edge(service=service)

    output_dir = 'output'
    os.makedirs(output_dir, exist_ok=True)

    try:
        driver.get(url)
        print("页面加载中...")
        time.sleep(3)  # 延迟,确保页面加载

        driver.maximize_window()  # 最大化浏览器窗口
        for _ in range(5):  
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            print(f"滚动页面 {_ + 1} 次...")
            time.sleep(2)

        # 等待所有图片元素加载
        WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.TAG_NAME, 'img')))

        # 获取页面中的所有图片元素
        img_elements = driver.find_elements(By.TAG_NAME, 'img')
        print(f"找到的图片数量: {len(img_elements)}")

        # 提取图片 URL
        img_urls = []
        for index, img in enumerate(img_elements[:image_count]):
            img_url = img.get_attribute('src')

            if img_url:
                img_urls.append((img_url, index))



其他源码

Python查询WiFi密码(附源码)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值