如何爬取需滚动加载内容的网站?现有代码无法获取数据求助
解决滚动加载网站的爬虫问题
你的代码存在多个关键问题,导致无法获取数据,以下是具体分析和修复方案:
核心问题与修复步骤
1. 未处理滚动加载逻辑
目标网站需要滚动页面才会加载更多内容,原代码完全没有这部分处理,导致只能获取初始加载的少量(甚至没有)内容。必须实现循环滚动逻辑,直到页面不再加载新内容。
2. 元素定位错误
原代码中定位的icon-close是弹窗关闭按钮,而非触发联系信息的按钮,完全搞反了操作对象,需要修正XPath定位正确的触发按钮。
3. 缺少元素等待机制
直接调用find_element会因为元素未加载完成导致查找失败,必须使用显式等待确保元素加载完毕后再操作。
4. 语法错误
代码中Tel=未赋值,属于语法错误,会直接导致程序运行报错。
5. Selenium版本兼容问题
新版本Selenium不再支持直接传入ChromeDriver路径,需要使用Service类进行配置。
修复后的完整代码
# -*- coding: UTF-8 -*- import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC records = [] # 配置ChromeDriver路径 service = Service('/Users/stevenqi/Downloads/chromedriver') driver = webdriver.Chrome(service=service) driver.get('https://www.yaskawa.eu.com/services/robotics-support') driver.maximize_window() # 处理滚动加载,直到页面不再新增内容 last_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待内容加载 time.sleep(3) # 获取新的滚动高度 new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 定位所有联系按钮(修正XPath) contact_buttons = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.XPATH, '//button[contains(@class, "contact-button")]')) ) for button in contact_buttons: try: # 点击按钮触发弹窗(用execute_script避免元素遮挡问题) driver.execute_script("arguments[0].click();", button) # 等待弹窗加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//div[contains(@class, "modal-content")]')) ) # 提取邮箱(去除mailto:前缀) email_element = WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.XPATH, '//a[contains(@href, "mailto:")]')) ) email = email_element.get_attribute("href").replace("mailto:", "") # 提取官网链接(排除mailto链接) website_element = WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.XPATH, '//a[contains(@href, "http") and not(contains(@href, "mailto:"))]')) ) website = website_element.get_attribute("href") # 提取电话 tel_element = WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.XPATH, '//span[contains(@class, "phone")]')) ) tel = tel_element.text records.append((website, email, tel)) # 关闭弹窗 close_button = WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.XPATH, '//button[@class="icon-close"]')) ) close_button.click() time.sleep(1) except Exception as e: print(f"处理元素时出错: {e}") # 尝试关闭弹窗,避免影响后续操作 try: close_button = driver.find_element(By.XPATH, '//button[@class="icon-close"]') close_button.click() except: pass continue # 输出爬取结果 for record in records: print(record) driver.quit()
关键说明
- 滚动加载处理:通过循环滚动页面并比较滚动高度,确保所有内容都被加载完成。
- 显式等待:使用
WebDriverWait替代直接查找元素,彻底解决元素未加载导致的查找失败问题。 - 元素定位修正:重新定位联系按钮和信息元素,确保操作对象正确。
- 异常处理:添加异常捕获,避免单个元素处理失败导致整个程序终止。
内容的提问来源于stack exchange,提问作者Yan Zhang
相关产品推荐
相关产品推荐

