Python 如何模拟登录知乎并处理倒立文字验证码

好久前写过用 Python 模拟登陆知乎的脚本,但是最近发现知乎加了倒立文字的验证码

目前有什么好思路 可以解决这个倒立文字的验证码问题么?
Python 如何模拟登录知乎并处理倒立文字验证码

12 回复

要模拟登录知乎并处理倒立文字验证码,可以结合Selenium进行自动化操作和PIL进行图像识别。下面是一个完整的示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from PIL import Image
import requests
import time
import re

class ZhihuLogin:
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.wait = WebDriverWait(self.driver, 10)
        
    def login(self, username, password):
        """主登录流程"""
        self.driver.get('https://www.zhihu.com/signin')
        
        # 切换到密码登录
        self.wait.until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR, 'div.SignFlow-tab')
        )).click()
        
        # 输入账号密码
        self.driver.find_element(By.NAME, 'username').send_keys(username)
        self.driver.find_element(By.NAME, 'password').send_keys(password)
        
        # 点击登录按钮
        login_btn = self.driver.find_element(
            By.CSS_SELECTOR, 'button.SignFlow-submitButton'
        )
        login_btn.click()
        
        time.sleep(2)
        
        # 检查是否需要验证码
        if self._need_captcha():
            self._handle_captcha()
            
        # 等待登录成功
        self.wait.until(
            EC.presence_of_element_located((By.CLASS_NAME, 'AppHeader-userInfo'))
        )
        print("登录成功!")
        
    def _need_captcha(self):
        """检查是否需要验证码"""
        try:
            captcha = self.driver.find_element(By.CLASS_NAME, 'Captcha-englishContainer')
            return True
        except:
            return False
            
    def _handle_captcha(self):
        """处理倒立文字验证码"""
        # 获取验证码图片
        captcha_img = self.wait.until(
            EC.presence_of_element_located((By.CLASS_NAME, 'Captcha-englishImage'))
        )
        
        # 下载验证码图片
        img_url = captcha_img.get_attribute('src')
        img_data = requests.get(img_url).content
        
        with open('captcha.png', 'wb') as f:
            f.write(img_data)
            
        # 识别倒立文字
        words = self._recognize_inverted_text('captcha.png')
        
        # 输入识别结果
        input_box = self.driver.find_element(
            By.CSS_SELECTOR, 'input.Captcha-englishInput'
        )
        input_box.send_keys(words)
        
        # 提交验证
        submit_btn = self.driver.find_element(
            By.CSS_SELECTOR, 'button.Captcha-englishButton'
        )
        submit_btn.click()
        
        time.sleep(1)
        
    def _recognize_inverted_text(self, image_path):
        """
        识别倒立文字
        实际项目中这里应该接入OCR服务,这里用简单逻辑演示
        """
        # 这里只是示例,实际需要OCR识别
        # 可以使用Tesseract、百度OCR等
        
        # 简单示例:手动输入
        print(f"请查看验证码图片: {image_path}")
        words = input("请输入验证码中的倒立文字: ")
        return words
        
    def close(self):
        self.driver.quit()

# 使用示例
if __name__ == '__main__':
    zhihu = ZhihuLogin()
    try:
        zhihu.login('your_username', 'your_password')
        time.sleep(5)  # 查看登录结果
    finally:
        zhihu.close()

关键点说明:

  1. Selenium自动化:使用Selenium控制浏览器进行登录操作
  2. 验证码检测:通过检查页面元素判断是否需要验证码
  3. 图片获取:从验证码元素中提取图片URL并下载
  4. 文字识别:需要OCR识别倒立文字,示例中留出了接口

实际使用中,_recognize_inverted_text方法需要接入真正的OCR服务。对于倒立文字,可能需要先进行图像预处理(旋转、二值化等)再识别。

简单建议:用Selenium处理登录流程,OCR识别验证码文字。

超级鹰、uu 打码、打码兔。。。各种第三方打码平台,帮你解决

用 selenium 先手工登录,然后把 cookies 传递给 requests。

原来的 4 位验证码还可以用

验证码无非就两种方案: 1. 识别(人工智能) 2.人力(人工的人工智能)

3.机械,用机械设备模拟人工。

你们这些年轻人,总想搞个大新闻

您这句话和楼主的提问有什么关系?

我用最笨的方法,直接复制 chrome 的 cookie

1.知乎的验证码出现的概率与你的异常操作成正比,一般情况不会轻易弹验证码。
2.验证码解决方案只有两种 a.自动验证(直接刚正面) b.避免(打不过躲得过)
3.爬虫本身是一场博弈,不要给别人的服务器造成过高的压力,该 sleep 就要 sleep
4.解决方案 a.Python 模拟登录库:github/fuck-login b.Python 知乎非官方 oauth:github/zhihu-oauth



没想到还有这招 多谢提供思路

回到顶部