You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Selenium滚动加载全部结果失败求助(附相关代码)

解决Selenium滚动无法加载TUI网站更多结果的问题

我来帮你排查这个问题——你遇到的情况很常见,很多动态加载的网站不会因为一次滚动到底就触发新内容加载,咱们一步步调整代码来解决:

问题诊断

你的代码现在是一次性滚动到页面最底部,但很多现代网站的滚动加载逻辑是需要逐步滚动或者等待特定元素加载完成才会触发新内容请求,而且固定的time.sleep也不够可靠,另外Selenium的一些参数写法也需要更新。

具体修复步骤

1. 更新Selenium参数写法

新版本Selenium已经弃用了chrome_options参数,改用options,同时确保ChromeDriver和浏览器版本匹配(如果是较新的Chrome,甚至可以不用指定executable_path,Selenium会自动管理)。

2. 改成逐步滚动触发加载

不要一次性滚到底,每次滚动一小段距离(比如每次滚动1000像素),模拟用户浏览的行为,这样更容易触发网站的加载逻辑。

3. 用显式等待替代固定sleep

等待页面高度变化或者新的价格元素出现,比固定时间等待更可靠,避免因为网络慢导致加载不完整。

4. 处理可能的加载更多按钮(可选)

有些网站滚动到底后会出现"加载更多"按钮,需要点击才能继续加载,咱们可以加个检查逻辑。

修改后的完整代码

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time

page_link = 'https://www.tui.co.uk/destinations/packages?airports%5B%5D=&units%5B%5D=BGR%3ACOUNTRY&when=06-09-2019&until=&flexibility=true&flexibleDays=3&noOfAdults=2&noOfChildren=0&childrenAge=&duration=7114&searchRequestType=ins&searchType=search&sp=true&multiSelect=true&room=&isVilla=false'

options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument('disable-infobars')
# 禁用图片加载(可选,加快加载速度)
options.add_argument('--blink-settings=imagesEnabled=false')

# 新版本Selenium用options参数,不用chrome_options
browser = webdriver.Chrome(options=options)
browser.get(page_link)

# 先等待页面初始内容加载完成
WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, 'price-value'))
)

last_height = browser.execute_script("return document.body.scrollHeight")
scroll_pause_time = 1  # 可以根据网络情况调整
max_attempts = 10  # 防止无限循环,设置最大尝试次数
attempts = 0

while attempts < max_attempts:
    # 逐步滚动,每次滚动1000像素
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight - 1000);")
    time.sleep(scroll_pause_time)
    
    # 检查是否有加载更多按钮,如果有就点击
    try:
        load_more_btn = WebDriverWait(browser, 3).until(
            EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Load more')]"))
        )
        load_more_btn.click()
        time.sleep(scroll_pause_time)
    except:
        # 没有加载更多按钮,继续滚动
        pass
    
    # 获取新的页面高度
    new_height = browser.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        attempts += 1
    else:
        attempts = 0  # 高度变化了,重置尝试次数
        last_height = new_height

# 现在解析页面
soup = BeautifulSoup(browser.page_source, 'html.parser')
price_values = soup.findAll(class_='price-value')
print(f"共找到{len(price_values)}个价格元素")

browser.quit()

额外说明

  • 我加了max_attempts来防止无限循环,如果页面高度不再变化超过指定次数,就停止滚动。
  • 可选禁用图片加载来加快页面加载速度,如果你需要图片可以去掉那行参数。
  • 显式等待初始的price-value元素出现,确保页面已经加载了基础内容再开始滚动。

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

火山引擎 最新活动