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

批量下载漫画网站图片时无法检测<img>标签的技术求助

批量漫画图片下载失败的问题分析与解决

批量图片下载器无法检测到目标漫画网站的<img>标签,导致提取图片数量为零或不完整,但浏览器可正常加载图片,用Python脚本尝试下载也未成功。以下是具体原因和解决方案:

常见原因

  1. 动态加载机制:图片URL由JavaScript渲染生成,静态HTML源码中无真实<img>标签或有效src值
  2. 属性隐藏:图片URL存储在data-src、data-original等自定义属性中,而非默认的src属性
  3. 反爬限制:请求需携带Cookie(登录验证)、Referer(来源验证),或图片URL含临时签名,直接请求会失效

解决方案

1. 先排查图片加载方式

打开浏览器开发者工具(F12)→ 切换「网络」标签 → 筛选「图片」,刷新页面观察:

  • 若图片请求在页面加载后才发起,说明是JS动态加载,需用渲染工具执行JS
  • 若<img>标签存在但src为空/是占位图,查看元素的自定义属性(如data-src)

2. 改进脚本的具体方案

方案一:解析静态HTML中的自定义图片属性

如果图片URL存在于data-src这类属性中,直接爬取HTML后提取:

import requests
from bs4 import BeautifulSoup
import os

def download_image(image_url, save_dir="images", filename=None):
    os.makedirs(save_dir, exist_ok=True)
    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",
        "Referer": "目标漫画网站的页面URL"  # 必须添加,多数网站会验证来源
    }
    try:
        response = requests.get(image_url, headers=headers, stream=True, timeout=15)
        response.raise_for_status()
        if not filename:
            filename = os.path.basename(image_url.split("?")[0])
        file_path = os.path.join(save_dir, filename)
        with open(file_path, "wb") as file:
            for chunk in response.iter_content(chunk_size=8192):
                if chunk:
                    file.write(chunk)
        print(f"✅ 下载成功:{file_path}")
    except requests.exceptions.RequestException as e:
        print(f"❌ 下载失败:{e}")

def extract_images_from_page(page_url):
    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"
    }
    response = requests.get(page_url, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")
    # 替换为实际的属性名,如data-src、data-original
    image_elements = soup.find_all("img", attrs={"data-src": True})
    for idx, img in enumerate(image_elements):
        img_url = img["data-src"]
        # 补全相对URL的域名
        if not img_url.startswith(("http://", "https://")):
            img_url = "https://目标漫画网站域名" + img_url
        download_image(img_url, filename=f"comic_{idx+1}.jpg")

# 调用示例
extract_images_from_page("目标漫画章节的URL")

方案二:用Playwright动态渲染页面(适配JS加载场景)

若图片由JS动态生成,需用浏览器渲染引擎执行JS后提取:
先安装依赖:pip install playwright,再执行playwright install chrome

from playwright.sync_api import sync_playwright
import os
import requests

def download_image(image_url, save_dir="images", filename=None):
    os.makedirs(save_dir, exist_ok=True)
    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",
        "Referer": "目标漫画网站的页面URL"
    }
    try:
        response = requests.get(image_url, headers=headers, stream=True, timeout=15)
        response.raise_for_status()
        if not filename:
            filename = os.path.basename(image_url.split("?")[0])
        file_path = os.path.join(save_dir, filename)
        with open(file_path, "wb") as file:
            for chunk in response.iter_content(chunk_size=8192):
                if chunk:
                    file.write(chunk)
        print(f"✅ 下载成功:{file_path}")
    except requests.exceptions.RequestException as e:
        print(f"❌ 下载失败:{e}")

def extract_images_with_playwright(page_url):
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page(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")
        page.goto(page_url, wait_until="networkidle")  # 等待网络空闲,确保图片加载完成
        # 提取所有img标签的src或自定义属性
        image_urls = page.eval_on_selector_all("img", "elements => elements.map(el => el.src || el.dataset.src)")
        # 过滤无效URL
        image_urls = [url for url in image_urls if url.startswith(("http://", "https://"))]
        for idx, img_url in enumerate(image_urls):
            download_image(img_url, filename=f"comic_{idx+1}.jpg")
        browser.close()

# 调用示例
extract_images_with_playwright("目标漫画章节的URL")

方案三:处理登录验证场景

若网站需登录才能访问图片,将浏览器中的Cookie复制到请求头:

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",
    "Referer": "目标漫画网站的页面URL",
    "Cookie": "粘贴浏览器中复制的Cookie字符串"
}

注意事项

  • 避免频繁请求,可添加time.sleep(1)延时防止IP被封禁
  • 部分网站图片URL有过期时间,需及时下载
  • 遵守网站使用条款,勿用于商业用途

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 18:05:10