如何获取网页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接口,直接请求下载:
操作步骤:
- 打开浏览器开发者工具(F12),切换到Network面板
- 下滑页面触发图片加载,过滤XHR/Fetch或Images类型请求
- 复制图片请求的URL和Request Headers(重点保留
Referer、Cookie、User-Agent) - 用
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
相关产品推荐
相关产品推荐

