You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Python代码批量下载指定档案的500张图片并修复下载异常

问题分析与代码修改方案

问题根源

  • 动态加载限制:目标网站的图片通过JavaScript动态加载,静态请求仅能获取页面初始渲染的52张图片,无法触达全部500张。
  • 链接解析错误:原代码直接读取data-srcset的完整字符串(包含多分辨率链接),导致请求无效;同时错误地将图片二进制数据尝试转为UTF-8编码,破坏了图片文件结构。
  • 爬虫识别拦截:无请求头的纯requests请求易被网站识别为爬虫,拒绝返回图片资源。

代码修改方案

1. 引入动态渲染工具

使用selenium模拟浏览器加载页面,等待所有图片加载完成后再抓取完整HTML,确保获取全部图片链接。先安装依赖:

pip install selenium beautifulsoup4 requests webdriver-manager

2. 修正图片链接解析逻辑

针对data-srcset字段,提取最高分辨率的图片链接;移除错误的UTF-8解码步骤,直接写入二进制数据。

3. 完善请求配置

添加浏览器请求头,模拟正常访问;处理会话cookie,提升请求成功率。

修改后的完整代码

from bs4 import BeautifulSoup
import requests
import os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 创建文件夹
def folder_create():
    while True:
        folder_name = input("输入文件夹名称:- ")
        if not os.path.exists(folder_name):
            os.mkdir(folder_name)
            return folder_name
        print("该文件夹已存在,请重新输入!")

# 下载单张图片
def download_single_image(image_url, folder_name, index):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    }
    try:
        response = requests.get(image_url, headers=headers, timeout=10)
        response.raise_for_status()
        with open(f"{folder_name}/image_{index+1}.jpg", "wb") as f:
            f.write(response.content)
        return True
    except Exception as e:
        print(f"下载图片 {index+1} 失败: {str(e)}")
        return False

# 批量下载图片
def download_images(images, folder_name):
    total = len(images)
    success_count = 0
    print(f"共发现 {total} 张图片!")

    for i, image in enumerate(images):
        image_link = None
        # 优先解析data-srcset,取最高分辨率链接
        if image.get("data-srcset"):
            srcset_links = image["data-srcset"].split(",")
            # 取最后一个链接,通常是最高分辨率,去除前后空格
            image_link = srcset_links[-1].split()[0].strip()
        elif image.get("data-src"):
            image_link = image["data-src"]
        elif image.get("src"):
            image_link = image["src"]
        
        if image_link:
            if download_single_image(image_link, folder_name, i):
                success_count += 1
        else:
            print(f"图片 {i+1} 未找到有效链接")
    
    print(f"下载完成:共 {success_count} 张图片成功下载,剩余 {total - success_count} 张失败")

# 主函数:动态获取页面内容
def main(url):
    # 初始化浏览器
    options = webdriver.ChromeOptions()
    options.add_argument("--headless=new")  # 无头模式,不显示浏览器窗口
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
    
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    driver.get(url)
    
    # 等待页面加载完成,可根据网络情况调整超时时间
    try:
        # 等待所有图片元素加载完成
        WebDriverWait(driver, 30).until(
            EC.presence_of_all_elements_located((By.TAG_NAME, "img"))
        )
        # 额外等待几秒,确保动态加载的图片全部出现
        time.sleep(5)
    except Exception as e:
        print("页面加载超时: ", str(e))
    
    # 获取完整的页面HTML
    page_source = driver.page_source
    driver.quit()
    
    # 解析HTML
    soup = BeautifulSoup(page_source, 'html.parser')
    images = soup.find_all('img')
    
    # 创建文件夹并下载
    folder_name = folder_create()
    download_images(images, folder_name)

# 执行
if __name__ == "__main__":
    url = input("输入URL:- ")
    main(url)

额外说明

  • 若需进行OCR处理,下载完成后可使用pytesseract库识别图片,安装命令:pip install pytesseract pillow,同时需本地安装Tesseract OCR引擎。
  • 若网站有反爬机制,可在download_single_image函数中添加time.sleep(1)增加请求间隔,避免IP被封禁。

内容的提问来源于stack exchange,提问作者Koen vI Anon55438

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:35:20