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

WebScraping无法获取图片但浏览器显示正常,求解决方案

爬虫无法获取Extra网站产品图片的解决方案

问题背景

爬取Extra网站第6页(目标链接:https://www.extra.com.br/c?filtro=D53885&utm_source=b2b_livelo&utm_medium=livelo&utm_campaign=livelo_acumulo&page=6)时,使用Selenium+BeautifulSoup编写的爬虫无法获取全部产品图片,返回的图片显示不可用,但浏览器直接访问该页面能正常显示所有图片。已尝试添加time.sleep(25)固定延时,问题仍未解决。

原爬虫代码

from selenium import webdriver
from bs4 import BeautifulSoup


dic_produtos = {'marca':[], 'preco':[], 'loja':[], 'categ':[], 'link':[], 'foto':[], 'id_cat':[], 'id_loj':[]}

   
url_pag='https://www.extra.com.br/c?filtro=D53885&utm_source=b2b_livelo&utm_medium=livelo&utm_campaign=livelo_acumulo&page=6'
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"}
executable_path = r'C:\Users\vinig\Downloads\chromedriver_win32\chromedriver.exe'
browser = webdriver.Chrome(executable_path=executable_path)
browser.get(url_pag)
html = browser.page_source
soup = BeautifulSoup(html, 'lxml')
produtos = soup.find_all('div', class_="sc-5fec12f4-0 cxOoNz sc-f86ccf37-1 esRPia")
    
for produto in produtos:
    marca = produto.find('h3', attrs={'class':"sc-2b5b888e-2 KTGxe"}).text
    if (produto.find('span', attrs={'data-testid':'price-value'})) is not None:
        preco = produto.find('span', attrs={'data-testid':"price-value"}).text
        index_inic = preco.find('R$')
        index_final = preco.find(',')
        preco_liq = preco[index_inic:index_final+3]   
    else: 
        preco = 0.00
    for item in produto.find_all('img'):
        foto = item['src']
    itens = produto.select('a')
    link = [item['href'] for item in itens]
    #link = str('clube.magazineluiza.com.br')+str(link[0])
    link = str(link[0])
    
    if produto.find('span', attrs={'class':"sc-c0914aad-11 bVfueT"})is not None:
        preco_liq = 0.00
    dic_produtos['marca'].append(marca)
    dic_produtos['preco'].append(preco_liq)
    dic_produtos['loja'].append('extra')
    dic_produtos['categ'].append('eletroport')
    dic_produtos['foto'].append(foto)
    dic_produtos['link'].append(link)
    dic_produtos['id_cat'].append('2')
    dic_produtos['id_loj'].append('3')
           

browser.quit()

问题分析

  1. 懒加载机制:网站产品图片采用懒加载策略,只有当元素滚动到浏览器视口范围内时,才会加载真实的图片链接,初始页面源码中仅包含占位图或空链接。
  2. 自动化特征识别:Selenium默认的ChromeDriver会暴露自动化标识,网站可能通过检测这些标识返回差异化内容。
  3. 等待逻辑不合理:固定时长的延时无法适配网络波动或异步加载的差异,可能在图片未完全加载时就获取了页面源码。
  4. 图片提取逻辑缺陷:原代码中遍历产品内所有img元素并覆盖foto变量,可能误取到非主图的占位元素链接。

解决方法

1. 模拟滚动触发懒加载

遍历所有产品元素,将每个元素滚动到视口内,触发图片加载:

from selenium.webdriver.common.action_chains import ActionChains
import time

# 在browser.get(url_pag)之后添加以下代码
produtos_elements = browser.find_elements(By.CSS_SELECTOR, "div.sc-5fec12f4-0.cxOoNz.sc-f86ccf37-1.esRPia")
for elem in produtos_elements:
    # 滚动到元素位置
    ActionChains(browser).move_to_element(elem).perform()
    # 给图片加载留短暂时间
    time.sleep(0.5)

2. 隐藏Selenium自动化特征

通过ChromeOptions配置,隐藏自动化标识,避免被网站检测:

from selenium.webdriver.chrome.options import Options

options = Options()
# 禁用自动化控制特征
options.add_argument("--disable-blink-features=AutomationControlled")
# 排除自动化开关
options.add_experimental_option("excludeSwitches", ["enable-automation"])
# 禁用自动化扩展
options.add_experimental_option('useAutomationExtension', False)
# 设置自定义User-Agent
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36")

# 初始化浏览器时传入配置
browser = webdriver.Chrome(executable_path=executable_path, options=options)

3. 使用显式等待替代固定延时

等待所有图片元素加载完成后再获取页面源码,确保图片链接已更新:

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

# 在browser.get(url_pag)之后添加
# 等待所有产品图片元素出现
WebDriverWait(browser, 30).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.sc-5fec12f4-0.cxOoNz.sc-f86ccf37-1.esRPia img"))
)
# 额外等待2秒确保图片链接加载完成
time.sleep(2)
# 再获取页面源码
html = browser.page_source

4. 修正图片提取逻辑

针对产品主图提取,避免遍历所有img元素覆盖结果:

# 替换原代码中图片提取的循环部分
foto_elem = produto.find('img', attrs={'data-testid': 'product-image'})  # 根据页面实际属性调整
if foto_elem:
    foto = foto_elem['src']
else:
    foto = ""  # 处理无图片的异常情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:20:32