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

使用Python+BeautifulSoup遍历网页批量下载图片的代码调试求助

代码问题排查
  • 原有代码是针对第三方图片站点MARCO编写的爬取逻辑,完全不适配Cryptopunks的资源规则:原逻辑依赖解析页面DOM提取<a>标签、匹配特定路径规则、从img标签alt属性提取文件后缀,这些规则在Cryptopunks站点完全不生效。
  • Cryptopunks的图片地址是固定规则的序列化URL,不需要爬取解析HTML页面,直接按照序号拼接地址即可,格式为https://cryptopunks.app/cryptopunks/cryptopunk{4位补零序号}.png,序号范围为1~9999。
  • 原代码缺少请求头伪装、超时控制、异常捕获、断点续传能力,批量下载10000个资源时极易被反爬拦截、因网络波动中断,且中断后无法续传,必须从头开始。
  • 原代码用os.system('mkdir')创建存储目录的方式跨平台兼容性差,在Windows等系统下容易出现路径创建失败的问题。
可行实现方案

首先安装依赖库,在终端执行命令:
pip install requests tqdm

完整可运行代码如下:

import os
import time
import requests
from tqdm import tqdm

# 配置项
SAVE_DIR = "cryptopunks"
START_ID = 1
END_ID = 10000
REQUEST_TIMEOUT = 10
# 伪装浏览器请求头,绕过基础反爬拦截
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Referer": "https://cryptopunks.app/"
}
RETRY_TIMES = 3
REQUEST_INTERVAL = 0.2  # 请求间隔,单位秒,可根据实际情况调整

def download_single_img(img_id: int) -> bool:
    # 拼接4位补零的文件名
    file_name = f"cryptopunk{img_id:04d}.png"
    save_path = os.path.join(SAVE_DIR, file_name)
    # 已存在的文件直接跳过,支持断点续传
    if os.path.exists(save_path):
        return True
    url = f"https://cryptopunks.app/cryptopunks/{file_name}"
    for _ in range(RETRY_TIMES):
        try:
            resp = requests.get(url, headers=HEADERS, timeout=REQUEST_TIMEOUT)
            resp.raise_for_status()
            with open(save_path, "wb") as f:
                f.write(resp.content)
            return True
        except Exception as e:
            time.sleep(1)
            continue
    # 重试全部失败后记录失败ID
    with open("download_failed.log", "a", encoding="utf-8") as f:
        f.write(f"{img_id}\n")
    return False

if __name__ == "__main__":
    # 创建存储目录,兼容全平台
    os.makedirs(SAVE_DIR, exist_ok=True)
    failed_count = 0
    # 带进度条遍历下载
    for punk_id in tqdm(range(START_ID, END_ID), desc="正在下载Cryptopunks图片"):
        if not download_single_img(punk_id):
            failed_count +=1
        time.sleep(REQUEST_INTERVAL)
    print(f"下载完成,共失败{failed_count}个,失败ID已记录到download_failed.log文件,可后续单独补下")
使用注意事项
  • 提前预留足够磁盘空间,10000张Cryptopunks原图总占用空间约300~500MB。
  • 如果运行时出现大量请求失败,可适当调大REQUEST_INTERVAL参数的值,降低请求频率,避免触发站点反爬规则。
  • 脚本自动支持断点续传,中途终止后重新运行会自动跳过已下载的文件,无需重复下载。
  • 所有下载完成的图片均为png格式,存放在脚本同级目录的cryptopunks文件夹下,可直接读取用于GAN模型训练。

内容的提问来源于stack exchange,提问作者Sterik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:57:18