一、知乎登陆界面url=https://www.zhihu.com/signin
二、具体知识点解释
这段代码使用 Selenium 自动化工具来模拟用户登录知乎并爬取某个问题下的评论。
1. Selenium 的基本使用
Selenium 是一个用于自动化浏览器操作的工具,常用于网页测试和爬虫。
代码中使用了 Selenium 的以下功能:
打开浏览器并加载网页。
定位页面元素(如输入框、按钮等)。
模拟用户操作(如输入文本、点击按钮、滚动页面等)。
2. Chrome 浏览器配置
Options
:用于配置 Chrome 浏览器的选项。--disable-blink-features=AutomationControlled
:禁用 Chrome 的自动化控制提示。excludeSwitches
:排除 Chrome 的自动化开关。useAutomationExtension=False
:禁用自动化扩展。
Service
:用于指定 ChromeDriver 的路径。
3. 页面加载与元素定位
driver.get(url)
:打开指定的 URL。WebDriverWait
:等待页面元素加载完成。EC.presence_of_element_located
:等待某个元素出现在页面中。EC.element_to_be_clickable
:等待某个元素可点击。
find_element
和find_elements
:定位页面元素。By.CSS_SELECTOR
:通过 CSS 选择器定位元素。By.XPATH
:通过 XPath 定位元素。
4. 模拟用户操作
send_keys(text)
:在输入框中输入文本。click()
:点击按钮或链接。execute_script(script)
:执行 JavaScript 代码(如滚动页面)。
5. 异常处理
try-except
:捕获并处理异常,确保程序在出错时不会崩溃。例如,如果找不到某个元素,程序会打印错误信息并退出。
6. 登录功能
打开知乎登录页面。
输入手机号和验证码。
点击登录按钮。
检查登录是否成功(通过 URL 判断)。
7. 爬取评论
打开目标问题页面。
点击评论按钮,加载评论。
滚动页面,加载更多评论。
提取评论内容并存储到集合中(去重)。
8. 随机延时
time.sleep(seconds)
:暂停程序执行,模拟人类操作。random.uniform(a, b)
:生成随机延时,避免被反爬虫机制检测到。
9. 关闭浏览器
driver.quit()
:关闭浏览器并结束 WebDriver 会话。
代码功能总结
登录知乎:
打开知乎登录页面。
输入手机号和验证码。
点击登录按钮,检查登录是否成功。
爬取评论:
打开目标问题页面。
点击评论按钮,加载评论。
滚动页面,加载更多评论。
提取评论内容并打印。
异常处理:
捕获并处理可能出现的异常(如元素未找到、页面加载失败等)。
关闭浏览器:
完成任务后关闭浏览器。
三、具体代码展示含详解
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
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
import random
# 配置 Chrome 选项
chrome_options = Options()
# 禁用 Chrome 的自动化控制提示
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
# 排除 Chrome 的自动化开关
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
# 禁用自动化扩展
chrome_options.add_experimental_option("useAutomationExtension", False)
# 启动 Chrome 浏览器
try:
# 使用 ChromeDriver 启动 Chrome 浏览器
driver = webdriver.Chrome(service=Service(r"D:\chromdriver\chromedriver-win64\chromedriver.exe"), options=chrome_options)
except Exception as e:
# 如果启动失败,打印错误信息并退出程序
print("无法启动 ChromeDriver,请检查路径是否正确:", e)
exit(1)
# 打开知乎登录页面
driver.get("https://www.zhihu.com/signin")
# 等待手机号输入框出现并输入手机号
try:
# 使用 WebDriverWait 等待手机号输入框加载完成
phone_input = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'input[name="username"]')) # 根据页面结构调整选择器
)
# 输入手机号
phone_input.send_keys("********") # 替换为你的手机号
except Exception as e:
# 如果找不到手机号输入框,打印错误信息并退出程序
print("无法找到手机号输入框:", e)
driver.quit()
exit(1)
# 等待验证码输入框出现
try:
# 使用 WebDriverWait 等待验证码输入框加载完成
code_input = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'input[name="digits"]')) # 根据页面结构调整选择器
)
except Exception as e:
# 如果找不到验证码输入框,打印错误信息并退出程序
print("无法找到验证码输入框:", e)
driver.quit()
exit(1)
# 手动输入验证码
input("请在页面中输入验证码后按回车继续...")
# 增加等待时间,确保验证码处理完成
time.sleep(5)
# 点击登录按钮
try:
# 使用 WebDriverWait 等待登录按钮可点击
login_button = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, '//button[contains(@class, "SignFlow-submitButton")]'))
)
# 点击登录按钮
login_button.click()
time.sleep(5) # 等待登录完成
except Exception as e:
# 如果无法点击登录按钮,打印错误信息并退出程序
print("无法点击登录按钮:", e)
driver.quit()
exit(1)
# 检查登录是否成功
print("当前页面 URL:", driver.current_url)
if "signin" in driver.current_url:
# 如果 URL 中仍包含 "signin",说明登录失败
print("登录失败,请检查验证码或网络连接")
driver.quit()
exit(1)
else:
# 否则,登录成功
print("登录成功,正在跳转到目标页面...")
# 打开目标知乎页面
driver.get("https://www.zhihu.com/question/38181067/answer/2844310022")
time.sleep(10) # 增加等待时间,确保页面加载完成
# 点击评论按钮
try:
# 查找评论按钮并点击
comment_button = driver.find_element(By.XPATH, '//div[@class="QuestionHeader-Comment"]')
comment_button.click()
time.sleep(2) # 等待评论加载
except Exception as e:
# 如果找不到评论按钮,打印错误信息
print("无法找到评论按钮:", e)
# 初始化变量
comments = set() # 使用集合存储评论,自动去重
# 滚动加载评论
try:
while True:
# 查找所有评论
comment_elements = driver.find_elements(By.XPATH, '//div[@class="CommentContent css-1jpzztt"]')
# 将新评论添加到集合中
for comment in comment_elements:
comments.add(comment.text)
# 向下滚动页面
driver.execute_script("window.scrollBy(0, 1000);")
time.sleep(random.uniform(1, 2)) # 随机延时,模拟人类操作
# 检查是否加载了新评论
new_comment_elements = driver.find_elements(By.XPATH, '//div[@class="CommentContent css-1jpzztt"]')
if len(new_comment_elements) == len(comment_elements):
break # 如果没有新评论加载,退出循环
except Exception as e:
# 如果爬取评论时出错,打印错误信息
print("爬取评论时出错:", e)
# 打印所有评论
for comment in comments:
print(comment)
# 关闭浏览器
driver.quit()
四、运行结果展示
跳到这一页的登陆按钮点击之后 会跳转到首页 而不是目标的url评论数据的爬取
之后就会显示登陆按钮有错误
可是检查了好多遍也没有错误啊 球大佬指点 嘤嘤嘤