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

如何爬取需滚动加载内容的网站?现有代码无法获取数据求助

解决滚动加载网站的爬虫问题

你的代码存在多个关键问题,导致无法获取数据,以下是具体分析和修复方案:

核心问题与修复步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:54:22