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

如何用Python爬取Uber Eats餐厅菜单图片?

解决Uber Eats菜单图片懒加载爬取问题

我用Python爬取Uber Eats某餐厅菜单时,能正常获取菜品名称、描述等信息,但提取图片src属性时遇到问题——当前代码仅能输出2个图片链接。打印页面中的lazyload-wrapper元素后发现,这些容器里只有占位div,并没有预期的<picture>或<img>标签,推测问题出在页面懒加载机制上:图片仅当元素进入浏览器视口时才会加载,未滚动到的区域不会触发图片加载。

用户原代码

def scrape_menu():
    url = 'https://www.ubereats.com/store/great-wall-restaurant/rgur-R7rST6iIkyYyfCkog?diningMode=DELIVERY'
    
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    driver = webdriver.Chrome(ChromeDriverManager().install(),options=options)
    driver.maximize_window()
    driver.get(url)

    
    lazyloads = driver.find_elements(By.CLASS_NAME, 'lazyload-wrapper')
    imgs = [x.get_attribute('src') for x in driver.find_elements(By.XPATH, '//picture/img')]

    for img in imgs:
        print(img)

    driver.close()

懒加载处理方案

要获取所有图片,需要模拟浏览器滚动触发懒加载,并等待图片元素完全加载,具体步骤如下:

1. 模拟页面滚动触发懒加载

循环滚动页面到底部,直到页面高度不再变化——这能确保所有菜品区域都进入视口,触发图片加载逻辑。同时在无头模式下需设置合理的窗口大小,避免因视口过小导致部分元素不加载。

2. 显式等待图片元素加载完成

使用WebDriverWait等待所有<picture/img>元素加载完成,避免过早提取导致获取不到有效src。

修改后的完整代码

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
from webdriver_manager.chrome import ChromeDriverManager
import time

def scrape_menu():
    url = 'https://www.ubereats.com/store/great-wall-restaurant/rgur-R7rST6iIkyYyfCkog?diningMode=DELIVERY'
    
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    # 无头模式下设置窗口大小,确保视口足够加载内容
    options.add_argument('--window-size=1920,1080')
    driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
    driver.get(url)

    # 循环滚动页面触发懒加载
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        # 滚动至当前页面底部
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        # 等待2秒让内容加载
        time.sleep(2)
        # 获取新的页面高度,判断是否已滚动到底部
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height

    # 等待所有图片元素加载完成
    try:
        WebDriverWait(driver, 10).until(
            EC.presence_of_all_elements_located((By.XPATH, '//picture/img'))
        )
    except Exception as e:
        print("等待图片加载超时:", e)

    # 提取所有图片的src属性
    imgs = [x.get_attribute('src') for x in driver.find_elements(By.XPATH, '//picture/img')]
    for idx, img in enumerate(imgs):
        print(f"图片 {idx+1}: {img}")

    # 彻底关闭浏览器进程
    driver.quit()

if __name__ == "__main__":
    scrape_menu()

关键说明

  • 无头窗口大小设置:默认无头模式的浏览器窗口很小,部分元素无法进入视口,设置--window-size=1920,1080可避免这个问题。
  • 循环滚动:通过对比滚动前后的页面高度,确保所有懒加载内容都被触发。
  • 显式等待:替代固定sleep,更高效地等待元素加载完成,提升代码稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:00:20