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

如何用Python点击网页下一页按钮以实现多页数据爬取?

问题分析与解决方案

你的代码存在几个关键问题导致无法正常翻页爬取数据,下面逐一说明并给出修正后的完整代码:

核心问题点

  • 代码逻辑脱节:先用requests爬了第一页,但后续用Selenium打开浏览器后,没有把Selenium加载的页面数据解析写入CSV,等于翻页操作完全没用到。
  • 元素定位错误:By.CLASS_NAME不支持同时传入多个类名(button.js-change-page是两个类:button和js-change-page),这样定位不到按钮。
  • 未实现翻页循环:只点击了一次下一页,没有处理40多页的循环爬取,也没判断是否还有下一页。
  • 浏览器初始化重复:连续两次初始化ChromeDriver,第一次的实例被覆盖,属于无效代码。
  • 固定休眠不稳定:用time.sleep(15)太死板,应该用显式等待确保元素加载完成后再操作。

修正后的完整代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
from csv import writer
from webdriver_manager.chrome import ChromeDriverManager

# 初始化浏览器
browser = webdriver.Chrome(ChromeDriverManager().install())
url = "https://www.vivareal.com.br/venda/sp/sao-bernardo-do-campo/condominio_residencial/"
browser.get(url)

# 初始化CSV文件,写入表头
with open('na ponta da chave.csv', 'w', encoding='utf8', newline='') as f:
    thewriter = writer(f)
    header = ['Title', 'Location', 'Price', 'Area']
    thewriter.writerow(header)

    # 循环爬取所有页面
    while True:
        # 等待页面元素加载完成
        WebDriverWait(browser, 10).until(
            EC.presence_of_all_elements_located((By.CLASS_NAME, "property-card__container"))
        )
        # 解析当前页面
        soup = BeautifulSoup(browser.page_source, 'html.parser')
        lists = soup.find_all('article', class_="property-card__container js-property-card")
        
        # 提取数据写入CSV
        for item in lists:
            title = item.find('span', class_="js-card-title").text.strip()
            location = item.find('span', class_="property-card__address").text.strip()
            price = item.find('div', class_="js-property-card__price-small").text.strip()
            area = item.find('span', class_="js-property-card-detail-area").text.strip()
            
            info = [title, location, price, area]
            thewriter.writerow(info)
        
        # 尝试点击下一页
        try:
            next_button = WebDriverWait(browser, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, "button.button.js-change-page[title='Próxima página']"))
            )
            # 判断是否是最后一页(最后一页按钮会有disabled属性)
            if 'disabled' in next_button.get_attribute('class'):
                break
            next_button.click()
        except:
            # 没有下一页按钮时退出循环
            break

# 关闭浏览器
browser.close()

关键改进说明

  • 统一用Selenium处理页面:因为网站可能有JS渲染,用Selenium能确保获取到完整的页面数据,避免requests无法渲染动态内容的问题。
  • 正确定位下一页按钮:用CSS_SELECTOR定位同时包含button、js-change-page类且title为"Próxima página"的按钮,更精准。
  • 显式等待替代固定sleep:用WebDriverWait等待元素加载,既稳定又节省时间。
  • 循环翻页逻辑:通过判断按钮是否有disabled属性来确定是否到达最后一页,自动停止爬取。
  • 优化数据提取:用strip()替代replace('\n', ''),能更干净地去除多余的换行和空格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:35:28