用selenium+ChromeDriver爬取知乎评论区(但要求登录以及反爬机制爬不到数据)

发布于:2025-03-24 ⋅ 阅读:(36) ⋅ 点赞:(0)

一、知乎登陆界面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 会话。

代码功能总结

  1. 登录知乎

    • 打开知乎登录页面。

    • 输入手机号和验证码。

    • 点击登录按钮,检查登录是否成功。

  2. 爬取评论

    • 打开目标问题页面。

    • 点击评论按钮,加载评论。

    • 滚动页面,加载更多评论。

    • 提取评论内容并打印。

  3. 异常处理

    • 捕获并处理可能出现的异常(如元素未找到、页面加载失败等)。

  4. 关闭浏览器

    • 完成任务后关闭浏览器。

三、具体代码展示含详解

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评论数据的爬取

之后就会显示登陆按钮有错误

可是检查了好多遍也没有错误啊 球大佬指点 嘤嘤嘤


网站公告

今日签到

点亮在社区的每一天
去签到