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

Scrapy集成Selenium中间件:获取原始图片内容及判断方式

Scrapy结合Selenium下载图片的问题解决办法

一、获取原始图片内容的方法

不要直接用Selenium驱动打开图片URL后取driver.page_source——浏览器会自动把图片包装成带展示界面的HTML,以下是几种可行方案:

1. 借助浏览器Fetch API获取Base64编码的图片

通过Selenium执行JS代码调用浏览器原生Fetch,将图片Blob转成Base64后解码为二进制:

import base64

# 假设driver已打开目标图片URL
base64_img = driver.execute_script("""
    return fetch(document.location.href)
           .then(res => res.blob())
           .then(blob => new Promise((resolve) => {
               const reader = new FileReader();
               reader.onload = () => resolve(reader.result);
               reader.readAsDataURL(blob);
           }));
""")
# 剥离Base64前缀并解码为二进制
img_binary = base64.b64decode(base64_img.split(',')[1])

2. 复用Selenium请求上下文,用requests直接请求

提取Selenium浏览器的Cookies和User-Agent,用requests库发起请求获取原始二进制:

import requests

# 从Selenium中提取请求所需的上下文信息
cookies = {c['name']: c['value'] for c in driver.get_cookies()}
user_agent = driver.execute_script("return navigator.userAgent")

# 请求图片URL
response = requests.get(img_url, cookies=cookies, headers={'User-Agent': user_agent})
if response.status_code == 200:
    img_binary = response.content

3. 更优分工方案

让Selenium只负责处理动态渲染的页面(比如加载图片列表的页面),拿到图片URL后,直接交给Scrapy自带的下载器下载——这是Scrapy+Selenium的合理分工,避免用Selenium处理资源文件请求。

二、判断何时用page_source或原始内容

核心依据是目标URL返回的资源类型:

  • 当URL返回网页文档(Content-Type为text/html):用driver.page_source获取渲染后的HTML,适合处理需要JS渲染的页面。
  • 当URL返回非网页资源(比如图片image/jpeg、文件application/pdf等):直接通过网络请求获取原始二进制,不要用page_source,因为浏览器会自动生成展示资源的HTML页面。

可以提前请求URL的HEAD信息判断资源类型:

import requests

def should_use_page_source(url):
    try:
        resp = requests.head(url, allow_redirects=True)
        content_type = resp.headers.get('Content-Type', '')
        return content_type.startswith('text/html')
    except Exception:
        # 异常情况默认按网页处理
        return True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:18:18