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

