BeautifulSoup配合Selenium爬取condos.ca时无法提取全部页面列表数据
问题排查与修复方案
1. 基础语法错误
- 函数缩进错误:
get_page函数内的return soup行多了前置空格,缩进不匹配会导致函数返回异常。 - 循环逻辑缩进错误:地址抓取的
for循环写在分页循环外部,仅能获取到最后一页的地址数据,价格虽然在分页循环内,但也会因为其他问题拿不到全量数据。 - URL格式错误:查询参数前缺少
?分隔符,导致提交的分页、筛选参数全部不生效,每次请求实际返回的都是默认的第一页内容。
2. 爬虫逻辑错误
- 页码起始值错误:目标站分页参数
page是从1开始计数,你用range(5)生成的是0-4的数值,page=0的请求会默认返回第一页,相当于重复抓取了多次第一页。 - 未等待页面加载完成:Selenium打开页面后直接抓取源码,前端异步渲染的房源数据还没有加载完成,会丢失部分条目。
- 依赖动态类名定位元素:你用到的
styles___AskingPrice-sc-54qk44-4这类带sc-后缀的类名是前端框架自动生成的动态类,站点版本更新或者缓存变更就会失效,稳定性极低。
修复后参考代码
from bs4 import BeautifulSoup import pandas as pd import numpy as np import time 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 webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install()) # 提前登录操作可以放在这里,登录完成后再执行爬取 driver.get('https://condos.ca') def get_page(page): # 修复URL的?分隔符问题 url= f'https://condos.ca/toronto/condos-for-sale?size_range=300%2C999999999&property_type=Condo%20Apt%2CComm%20Element%20Condo%2CLeasehold%20Condo&mode=Sold&end_date_unix=exact%2C2011&sublocality_id=22&page={page}' driver.get(url) # 等待房源列表加载完成,最多等待10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'div[data-testid="listing-card"]')) ) # 额外加1秒缓冲避免漏抓 time.sleep(1) page_source = driver.page_source soup = BeautifulSoup(page_source, 'lxml') return soup prices=[] location=[] # 页码从1到5,覆盖前5页 for page in range(1,6): soup = get_page(page) # 换成属性选择器定位,不依赖动态类名 for tag in soup.select('div[data-testid="listing-card"] div[class*="AskingPrice"], div[data-testid="listing-card"] div[class*="ClosePrice"]'): prices.append(tag.get_text()) for tag in soup.select('div[data-testid="listing-card"] address'): location.append(tag.get_text()) # 可以打印校验数量 print(f"抓取到价格条数:{len(prices)},地址条数:{len(location)}")
额外注意事项
- 提前在打开的浏览器窗口完成账号登录,否则价格字段会被隐藏抓不到。
- 如果分页数量超过5页,可以调整
range的终止值到对应总页数即可。 - 可以适当拉长请求间隔,避免触发站点反爬策略导致IP被限制。
内容的提问来源于stack exchange,提问作者Pho6
相关产品推荐
相关产品推荐

