Python 如何模拟登录知乎并处理倒立文字验证码
好久前写过用 Python 模拟登陆知乎的脚本,但是最近发现知乎加了倒立文字的验证码
目前有什么好思路 可以解决这个倒立文字的验证码问题么?
Python 如何模拟登录知乎并处理倒立文字验证码
要模拟登录知乎并处理倒立文字验证码,可以结合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()
关键点说明:
- Selenium自动化:使用Selenium控制浏览器进行登录操作
- 验证码检测:通过检查页面元素判断是否需要验证码
- 图片获取:从验证码元素中提取图片URL并下载
- 文字识别:需要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
没想到还有这招 多谢提供思路


