如何用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
相关产品推荐
相关产品推荐

