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

无法用Beautiful Soup/Selenium爬取Dermnet动态加载图片,求解决方案

解决DermNet NZ图片爬取问题

核心原因

该网站的图片资源完全依赖JavaScript动态渲染,部分图片还会通过滚动触发的异步请求加载。普通Beautiful Soup只能抓取静态HTML源码,而如果Selenium使用时未处理等待加载、滚动触发等逻辑,也会无法获取到目标元素。

有效解决方案

方案1:优化Selenium使用逻辑

  1. 显式等待目标容器加载:用WebDriverWait替代固定休眠,确保图片容器完全渲染后再操作
  2. 模拟滚动加载:针对滚动触发的图片加载,循环滚动页面直到所有内容加载完成
  3. 检查iframe嵌套:部分网站会把图片放在iframe里,需先切换到对应iframe再抓取

示例代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

driver = webdriver.Chrome()
driver.get("https://dermnetnz.org/search.html?q=basal+cell+carcinoma+dermoscopy")

# 等待图片网格容器加载
wait = WebDriverWait(driver, 20)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "search-results__grid")))

# 滚动加载所有图片
last_scroll_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)
    new_scroll_height = driver.execute_script("return document.body.scrollHeight")
    if new_scroll_height == last_scroll_height:
        break
    last_scroll_height = new_scroll_height

# 提取图片链接
image_elements = driver.find_elements(By.TAG_NAME, "img")
for img in image_elements:
    src = img.get_attribute("src")
    if src and "basal-cell-carcinoma" in src:
        print(src)

driver.quit()

方案2:直接抓取异步接口数据

打开浏览器开发者工具(F12),切换到Network标签,筛选XHR请求,能找到网站获取图片列表的接口,直接请求该接口获取JSON数据,无需渲染页面:

  1. 定位返回图片数据的XHR接口(通常路径包含/api/search)
  2. 复制请求头和参数,用requests库发送请求
  3. 解析JSON响应,提取图片URL字段

示例代码:

import requests

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",
    "Accept": "application/json, text/plain, */*"
}

params = {
    "q": "basal cell carcinoma dermoscopy",
    "limit": "30"  # 可调整返回数量
}

response = requests.get("https://dermnetnz.org/api/search", headers=headers, params=params)
data = response.json()

for result in data["results"]:
    if "imageUrl" in result:
        print(result["imageUrl"])

注意事项

  • 控制请求频率,添加随机间隔,避免触发网站反爬机制
  • 遵守网站robots.txt规则,确保爬取行为合法合规

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:33:22