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

场地列表脚本问题求助:滚动仅获15条+无法点击Next按钮

Cvent阿布扎比场地爬虫问题修复方案

问题1:滚动仅捕获前15条数据的修复

原代码仅执行一次滚动,无法触发全部内容加载,且标题与链接的索引匹配逻辑存在隐患。修复要点:

  • 循环滚动直到页面高度不再变化,确保当前页所有内容加载完成
  • 直接配对存储标题与链接,避免索引匹配错误

问题2:无法点击“Next”翻页按钮的修复

原代码未等待按钮加载完成,且未处理按钮不可见/不存在的情况。修复要点:

  • 使用显式等待替代固定休眠,确保按钮可见且可点击
  • 检查按钮是否存在,不存在则退出循环(到达最后一页)
  • 滚动到按钮位置后再点击,避免被页面元素遮挡

修改后的完整代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import csv

place='Abu Dhabi'
url="https://www-eur.cvent.com/venues/"
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()

# 搜索阿布扎比场地
search_box = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, 'input#searchString'))
)
search_box.send_keys(place)
search_box.send_keys(Keys.RETURN)
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "li.w-full"))
)

visited_links = {}
pages = []

while True:
    # 循环滚动直到页面高度不再变化,加载所有内容
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2)  # 等待内容加载
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height

    # 配对获取标题和链接
    venue_items = driver.find_elements(By.CSS_SELECTOR, "li.w-full")
    for item in venue_items:
        title = item.find_element(By.TAG_NAME, "h3").text
        link = item.find_element(By.TAG_NAME, "a").get_attribute("href")
        if title not in visited_links:
            visited_links[title] = link
            # 写入CSV
            with open('CventLinks.csv', 'a', newline='', encoding='utf-8') as csvfile:
                writer = csv.writer(csvfile)
                writer.writerow([title, link])

    # 处理翻页
    try:
        # 等待Next按钮可见且可点击
        next_button = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, 'a[aria-label*="Next page"]'))
        )
        # 滚动到按钮位置
        driver.execute_script("arguments[0].scrollIntoView();", next_button)
        next_button.click()
        WebDriverWait(driver, 10).until(
            EC.staleness_of(venue_items[0])  # 等待页面刷新
        )
        # 检查是否重复页面
        if driver.current_url in pages:
            break
        pages.append(driver.current_url)
    except:
        # 没有Next按钮,退出循环
        break

driver.quit()

关键优化点说明

  • 用显式等待替代固定time.sleep,提升爬虫稳定性
  • 循环滚动逻辑确保当前页所有动态加载的场地内容被捕获
  • 直接从单个场地元素中提取标题和链接,彻底避免索引匹配错误
  • 增加异常处理,自动识别最后一页并终止循环
  • 写入CSV时指定UTF-8编码,避免中文乱码问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:42:02