如何修改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
相关产品推荐
相关产品推荐

