用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_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. 关闭浏览器:

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

三、具体代码展示含详解

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

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

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

相关推荐
啃火龙果的兔子3 小时前
Google Chrome(谷歌浏览器)常用快捷键
前端·chrome
老王生涯5 小时前
针对cloudflare防护的爬虫策略——CDP
爬虫·cloudflare·cdp·反爬
禹凕7 小时前
机器学习之数据清洗(Machine Learning about Data Cleaning)
人工智能·爬虫·python·机器学习·数据挖掘
Frag0ut8 小时前
Chrome打开某网站突然卡顿,是中了“挖矿病毒”吗?
chrome·网络安全·浏览器·chromium·挖矿病毒·技术科普
数据狐(Datafox)9 小时前
淘宝商品详情API实战:多语言代购商城自动同步数据完整方案
开发语言·前端·数据库·爬虫·json
水水不水啊21 小时前
告别杂乱的调试窗口:我用 Python + WebView 写了一个现代化串口助手
python·测试工具·嵌入式·嵌入式开发·串口调试·串口助手
hunteritself1 天前
夯爆了!Qoder 狂肝 2 小时,293 个测试全绿,Credits 一分没扣
前端·人工智能·chrome·深度学习·机器学习
Frag0ut1 天前
Google Chrome 谷歌浏览器 下载安装全攻略
chrome·性能优化·谷歌浏览器·隐私安全·浏览器设置·浏览器下载·新手指南
Frag0ut1 天前
深度解析:Chrome 自启动与后台常驻服务的作用、关闭方法及利弊权衡
前端·chrome
梅孔立7 天前
Fiddler 工具安装抓包 教程 https
爬虫