场地列表脚本问题求助:滚动仅获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
相关产品推荐
相关产品推荐

