一、豆瓣电影 肖申克的救赎 短评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()