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
相关产品推荐
相关产品推荐

