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

如何获取网页Blob响应?爬取Blob格式漫画图片的方法咨询

解决方案

一、修复Playwright实现(解决下滑加载+Blob转存)

原代码核心问题是未触发页面下滑加载图片,且硬编码Blob地址可能因签名过期失效。以下是修改后的可行方案:

from playwright.sync_api import sync_playwright, expect
import base64

page_url = "https://www.colamanga.com/manga-fh164016/1/98.html"
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"

with sync_playwright() as p:
    # 调试阶段用带界面浏览器,上线可改为headless=True
    browser = p.chromium.launch(headless=False)
    context = browser.new_context(user_agent=user_agent)
    page = context.new_page()
    page.goto(page_url, wait_until="networkidle")

    # 模拟下滑滚动触发懒加载
    page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
    # 等待图片元素加载完成(替换为页面真实的图片选择器)
    image_selector = "img.manga-img"
    expect(page.locator(image_selector)).to_be_visible(timeout=10000)

    # 动态获取Blob数据并转base64
    blob_base64 = page.evaluate("""async (selector) => {
        const img = document.querySelector(selector);
        if (!img) return null;
        const response = await fetch(img.src);
        const blob = await response.blob();
        return new Promise((resolve) => {
            const reader = new FileReader();
            reader.onloadend = () => resolve(reader.result.split(',')[1]);
            reader.readAsDataURL(blob);
        });
    }""", image_selector)

    if blob_base64:
        with open("manga_image.jpg", "wb") as f:
            f.write(base64.b64decode(blob_base64))
        print("图片保存成功")
    else:
        print("未找到目标图片")

    browser.close()

关键优化点:

  • 模拟下滑触发图片懒加载
  • 用expect等待图片可见,确保加载完成
  • 动态获取Blob地址,避免硬编码无效链接
  • 保留浏览器上下文的Cookie和Headers,绕过反爬验证

二、直接抓取图片API接口(更高效)

浏览器渲染效率较低,可通过抓包找到图片真实API接口,直接请求下载:

操作步骤:

  1. 打开浏览器开发者工具(F12),切换到Network面板
  2. 下滑页面触发图片加载,过滤XHR/Fetch或Images类型请求
  3. 复制图片请求的URL和Request Headers(重点保留Referer、Cookie、User-Agent)
  4. 用requests库直接请求并保存

示例代码:

import requests

# 替换为抓包得到的真实图片URL和Headers
image_url = "https://example.com/real-image-url.jpg"
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://www.colamanga.com/manga-fh164016/1/98.html",
    "Cookie": "your-cookie-from-browser"  # 从开发者工具复制
}

response = requests.get(image_url, headers=headers)
if response.status_code == 200:
    with open("direct_image.jpg", "wb") as f:
        f.write(response.content)
    print("图片下载成功")
else:
    print(f"请求失败,状态码:{response.status_code}")

三、Go语言实现方案(使用chromedp)

偏好Go语言的话,可使用chromedp模拟浏览器操作:

package main

import (
	"context"
	"encoding/base64"
	"os"

	"github.com/chromedp/chromedp"
)

func main() {
	pageURL := "https://www.colamanga.com/manga-fh164016/1/98.html"
	imageSelector := "img.manga-img" // 替换为页面真实选择器

	ctx, cancel := chromedp.NewContext(context.Background())
	defer cancel()

	var blobBase64 string
	err := chromedp.Run(ctx,
		chromedp.Navigate(pageURL),
		// 模拟下滑滚动
		chromedp.Evaluate(`window.scrollTo(0, document.body.scrollHeight)`, nil),
		// 等待图片可见
		chromedp.WaitVisible(imageSelector, chromedp.ByQuery),
		// 获取Blob并转base64
		chromedp.EvaluateAsDevTools(`async (selector) => {
			const img = document.querySelector(selector);
			const response = await fetch(img.src);
			const blob = await response.blob();
			return new Promise((resolve) => {
				const reader = new FileReader();
				reader.onloadend = () => resolve(reader.result.split(',')[1]);
				reader.readAsDataURL(blob);
			});
		}`, &blobBase64, imageSelector),
	)
	if err != nil {
		panic(err)
	}

	// 解码并保存图片
	imgData, err := base64.StdEncoding.DecodeString(blobBase64)
	if err != nil {
		panic(err)
	}
	os.WriteFile("go_manga_image.jpg", imgData, 0644)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:27:08