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()
问题分析
- 懒加载机制:网站产品图片采用懒加载策略,只有当元素滚动到浏览器视口范围内时,才会加载真实的图片链接,初始页面源码中仅包含占位图或空链接。
- 自动化特征识别:Selenium默认的ChromeDriver会暴露自动化标识,网站可能通过检测这些标识返回差异化内容。
- 等待逻辑不合理:固定时长的延时无法适配网络波动或异步加载的差异,可能在图片未完全加载时就获取了页面源码。
- 图片提取逻辑缺陷:原代码中遍历产品内所有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
相关产品推荐
相关产品推荐

