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

一、知乎登陆界面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_elementfind_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. 关闭浏览器

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

三、具体代码展示含详解

python 复制代码
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评论数据的爬取

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

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

相关推荐
深蓝电商API21 小时前
住宅代理与数据中心代理在爬虫中的选择
爬虫·python
csdn_aspnet1 天前
Libvio.link爬虫技术深度解析:反爬机制破解与高效数据抓取
爬虫·反爬·libvio
0思必得01 天前
[Web自动化] Selenium处理滚动条
前端·爬虫·python·selenium·自动化
csdn_life181 天前
openclaw mcporter 操作 chome 在 window10/linux chrome-devtools-mcp
chrome·mcp·openclaw
vx_biyesheji00011 天前
豆瓣电影推荐系统 | Python Django 协同过滤 Echarts可视化 深度学习 大数据 毕业设计源码
大数据·爬虫·python·深度学习·django·毕业设计·echarts
深蓝电商API1 天前
爬虫IP封禁后的自动切换与检测机制
爬虫·python
喵手1 天前
Python爬虫实战:公共自行车站点智能采集系统 - 从零构建生产级爬虫的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集公共自行车站点·公共自行车站点智能采集系统·采集公共自行车站点导出csv
喵手1 天前
Python爬虫实战:地图 POI + 行政区反查实战 - 商圈热力数据准备完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·地区poi·行政区反查·商圈热力数据采集
芷栀夏1 天前
从 CANN 开源项目看现代爬虫架构的演进:轻量、智能与统一
人工智能·爬虫·架构·开源·cann
辣香牛肉面1 天前
Wireshark v4.6.2 开源免费网络嗅探抓包工具中文便携版
网络·测试工具·wireshark