爬取論壇、課程評論等「左右結構、內容動態局部更新」頁面時,driver.page_source 返回**整頁 HTML**,體積巨大、解析慢、佔內存。若需爬取全站數萬頁,全量提取屬於嚴重無用功。
Selenium WebElement 原生支持獲取元素屬性,**innerHTML 返回元素內部 HTML 片段,outerHTML 含元素標籤本身**。配合定位器精準鎖定目標容器,實現「按需提取」。
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup # 配合解析
driver = webdriver.Chrome()
driver.get("https://example.com/forum-page")
# 1. 定位包含目標內容的容器元素 (如評論列表區塊)
# 建議使用穩健選擇器:id > class + 屬性 > xpath
comment_container = driver.find_element(By.CSS_SELECTOR, "div.comment-list-container")
# 或 XPath: //div[@id='comment-list'] 或 //section[contains(@class,'comments')]
# 2. 精準提取局部 HTML
inner_html = comment_container.get_attribute("innerHTML")
# outer_html = comment_container.get_attribute("outerHTML") # 含容器標籤
# 3. 傳給解析器 (BeautifulSoup / lxml / 正則) 處理
soup = BeautifulSoup(inner_html, "html.parser")
comments = soup.select("div.comment-item") # 針對局部結構解析
for c in comments:
author = c.select_one(".author").get_text(strip=True)
content = c.select_one(".content").get_text(strip=True)
print(f"{author}: {content}")
driver.quit()
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
comment_container = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.comment-list")))
# 或等待至少 N 條評論
wait.until(lambda d: len(d.find_elements(By.CSS_SELECTOR, "div.comment-item")) >= 20)
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
# 最後再提取 innerHTML
shadow_root = driver.execute_script("return arguments[0].shadowRoot", host_element),再在 shadow_root 中 find_element。page_source **1.2 MB**,局部 innerHTML 僅 **45 KB**,解析耗時從 **800ms 降至 60ms**,內存佔用降低 **95%+**。switch_to.frame 再提取)page_source掌握 getAttribute("innerHTML"),讓 Selenium 爬蟲告別全量解析,實現**精準、高效、低資源**的局部數據提取!