Selenium无法定位子元素 如何获取foodpanda页无限滚动的餐厅列表
解决方案
你原有代码的核心问题出在XPath选择逻辑和无限滚动的终止判断上,按下面的方案调整即可实现全量餐厅数据提取:
优化XPath选择器
不需要通过序号递增逐个匹配li元素,直接匹配ul.vendor-list下所有li子元素即可,和li元素的类名是否统一无关,正确写法是://ul[@class="vendor-list"]/li优化无限滚动逻辑
不需要设置全局变量计数序号,只要每次滚动后对比当前加载的餐厅元素总数,总数不再变化就说明已经到达页面底部,即可终止滚动。
修正后可直接运行的代码:
import time def get_all_restaurants(): # 记录上一次加载完成的餐厅数量,用于判断是否停止滚动 last_restaurant_count = 0 while True: # 滚动到当前页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待新的餐厅数据加载完成,网速慢可以把3改成4或5 time.sleep(3) # 抓取当前所有餐厅元素 restaurant_list = driver.find_elements_by_xpath('//ul[@class="vendor-list"]/li') current_count = len(restaurant_list) # 两次加载的数量一致,说明已经没有更多数据 if current_count == last_restaurant_count: break last_restaurant_count = current_count return restaurant_list
额外注意事项:
- 如果页面有反爬机制触发了人机验证,需要额外加验证处理逻辑
- 拿到所有li元素后,再逐个提取每个餐厅的名称、评分、配送费等信息即可
内容的提问来源于stack exchange,提问作者Abhishek Rai
相关产品推荐
相关产品推荐

