一、豆瓣電影 肖申克的救贖 短評url=https://movie.douban.com/subject/1292052/comments
?
?
二、基本知識點講解
1. Selenium 的基本使用
Selenium 是一個用于自動化瀏覽器操作的庫,常用于網頁測試和爬蟲。代碼中使用了以下 Selenium 的核心功能:
-
webdriver.Chrome
: 啟動 Chrome 瀏覽器實例。 -
driver.get(url)
: 打開指定的網頁。 -
driver.find_elements
: 查找頁面中符合條件的所有元素。 -
driver.execute_script
: 執行 JavaScript 代碼(例如點擊按鈕)。 -
driver.quit()
: 關閉瀏覽器并結束 WebDriver 會話。
2. ChromeDriver 的配置
-
Service
: 用于指定 ChromeDriver 的路徑。 -
executable_path
: ChromeDriver 可執行文件的路徑(需與 Chrome 瀏覽器版本匹配)。
3. 頁面元素的定位
Selenium 提供了多種定位頁面元素的方式,代碼中使用了以下方法:
-
By.XPATH
: 使用 XPath 表達式定位元素。-
例如:
//div[@class="comment-item"]
?表示查找所有 class 為?comment-item
?的?div
?元素。
-
-
By.CLASS_NAME
: 通過 class 名稱定位元素(代碼中未直接使用,但 XPath 中包含了類似功能)。
4. 顯式等待與隱式等待
-
顯式等待 (
WebDriverWait
):-
使用?
WebDriverWait
?和?expected_conditions
?來等待特定條件滿足后再執行操作。 -
例如:
EC.presence_of_element_located
?等待某個元素出現在頁面中。 -
優點:更靈活,可以針對特定條件設置超時時間。
-
-
隱式等待 (
time.sleep
):-
使用?
time.sleep
?強制等待一段時間。 -
例如:
time.sleep(3)
?等待 3 秒。 -
缺點:不夠靈活,可能會導致不必要的等待。
-
5. 爬取短評的邏輯
-
初始化變量:
-
comments = []
: 用于存儲爬取到的短評內容。
-
-
爬取短評:
-
使用?
find_elements
?查找所有短評元素。 -
使用?
find_element
?提取每個短評的具體內容(span
?標簽中的文本)。 -
將提取的內容添加到?
comments
?列表中。
-
-
異常處理:
-
使用?
try-except
?捕獲可能的異常(例如元素未找到或提取失敗),避免程序崩潰。
-
6. 翻頁功能
-
查找下一頁按鈕:
-
使用 XPath 定位下一頁按鈕(
//a[@class='next']
)。
-
-
檢查按鈕狀態:
-
通過?
get_attribute("class")
?檢查按鈕是否包含?disabled
?類(表示不可點擊)。
-
-
點擊下一頁:
-
使用?
driver.execute_script("arguments[0].click();", next_btn)
?通過 JavaScript 點擊按鈕(避免某些頁面中按鈕無法直接點擊的問題)。
-
-
等待新頁面加載:
-
使用?
WebDriverWait
?等待新頁面的短評加載完成。
-
7. 輸出結果
-
使用?
print
?輸出爬取到的短評數量和具體內容。 -
例如:
短評 1: 這是一條評論內容
。
8. 關閉瀏覽器
-
使用?
driver.quit()
?關閉瀏覽器并釋放資源。
三、具體代碼以及詳解的展示?
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time# 配置 ChromeDriver
# 使用 Service 類指定 ChromeDriver 的路徑
service = Service(executable_path=r"D:\chromdriver\chromedriver-win64\chromedriver.exe")
# 啟動 Chrome 瀏覽器
driver = webdriver.Chrome(service=service)# 初始化變量,用于存儲爬取到的短評
comments = []# 打開豆瓣電影短評頁面
driver.get("https://movie.douban.com/subject/1292052/comments")
# 等待頁面加載,避免頁面未完全加載導致元素找不到
time.sleep(3)# 爬取短評
while True:try:# 使用顯式等待,等待頁面中的短評元素加載完成WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@class="comment-item"]')))# 查找當前頁面中所有的短評元素comment_elements = driver.find_elements(By.XPATH, '//div[@class="comment-item"]')# 遍歷每個短評元素,提取內容for comment in comment_elements:try:# 提取短評的具體內容(位于 span 標簽中,class 為 "short")content = comment.find_element(By.XPATH, './/span[@class="short"]').text# 將提取的內容添加到 comments 列表中comments.append(content)except Exception as e:# 如果某個短評提取失敗,跳過并繼續處理下一個短評continueexcept Exception as e:# 如果頁面加載失敗或短評元素未找到,退出循環break# 嘗試翻頁try:# 查找下一頁按鈕next_btn = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//a[@class='next']")))# 檢查下一頁按鈕是否可點擊(是否包含 "disabled" 類)if "disabled" in next_btn.get_attribute("class"):# 如果按鈕不可點擊,說明已經是最后一頁,退出循環breakelse:# 使用 JavaScript 點擊下一頁按鈕(避免某些頁面中按鈕無法直接點擊的問題)driver.execute_script("arguments[0].click();", next_btn)# 等待新頁面的短評元素加載完成WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@class="comment-item"]')))# 等待頁面完全加載time.sleep(2)except Exception as e:# 如果找不到下一頁按鈕或翻頁失敗,退出循環break# 輸出結果
print(f"共爬取到 {len(comments)} 條短評:")
# 遍歷 comments 列表,打印每條短評
for i, comment in enumerate(comments, 1):print(f"短評 {i}: {comment}")# 關閉瀏覽器
driver.quit()