如何通过Selenium获取kw.com站点全部代理元素?
解决KW代理列表爬取不全的问题
问题核心原因
你的代码存在两个关键缺陷:
- 固定滚动到
200000像素位置,无法适配页面加载新内容后的高度变化,导致部分内容未触发加载 - 固定循环50次,要么次数不足漏加载,要么次数过多做无用功
优化后的代码方案
import time from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from webdriver_manager.chrome import ChromeDriverManager if __name__ == '__main__': print("Checking Browser driver...") options = Options() # options.add_argument('--headless') options.add_argument("start-maximized") options.add_experimental_option("prefs", {"profile.default_content_setting_values.notifications": 1}) options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('excludeSwitches', ['enable-logging']) options.add_experimental_option('useAutomationExtension', False) options.add_argument('--disable-blink-features=AutomationControlled') srv = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=srv, options=options) waitWD = WebDriverWait(driver, 10) link = "https://www.kw.com/agent/search/CA/San%20Diego" driver.get(link) last_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动到当前页面最底部,触发新内容加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") # 等待内容加载,可根据实际速度调整时长 time.sleep(2) # 获取更新后的页面高度 new_height = driver.execute_script("return document.body.scrollHeight") # 高度不再变化时,说明已加载全部内容 if new_height == last_height: break last_height = new_height print(f"Loaded more content, current page height: {new_height}") soup = BeautifulSoup(driver.page_source, 'html.parser') tmpDIV = soup.find_all("div", {"class": "FindAgentRoute__row"}) print(f"{len(tmpDIV)} elements found") input("Press!") driver.quit()
关键优化说明
- 动态滚动到底部:用
document.body.scrollHeight获取实时页面高度,确保每次滚动都触达当前页面底部,触发新内容加载 - 自动终止循环:通过对比滚动前后的页面高度,自动判断是否还有新内容,无需固定循环次数
- 精简等待逻辑:缩短基础等待时间,避免无效等待,提升爬取效率
额外优化建议
- 若网站反爬严格,可替换固定
sleep为随机等待:import random time.sleep(random.uniform(1.5, 3)) - 用显式等待替代固定sleep,进一步提升可靠性:
from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC # 替换原sleep代码块 try: waitWD.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.FindAgentRoute__row:last-child"))) except: pass
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

