HOOOS

Python Requests库:验证码登录与持久会话实战

0 53 代码搬运工小李 Pythonrequests验证码登录
Apple

当你需要用Python自动登录一个网站,并且这个网站还“贴心”地加上了验证码的时候,是不是感觉头大?别慌,requests库就是你的秘密武器。它不仅能帮你轻松发送HTTP请求,还能处理验证码,保持登录状态,让你的爬虫或者自动化脚本畅通无阻。今天,我就手把手教你如何用requests库模拟登录一个需要验证码的网站,并保持登录状态进行后续操作。

1. 准备工作

首先,确保你已经安装了requests库。如果没有,用pip安装一下:

pip install requests

其次,你需要了解目标网站的登录流程。打开浏览器的开发者工具(F12),切换到“Network”选项卡,然后手动登录网站。观察登录过程中发送的HTTP请求,特别是POST请求,找到包含用户名、密码、验证码等信息的请求。记下以下信息:

  • 登录URL: 提交登录请求的URL。
  • 请求方法: 一般是POST。
  • 请求头: 常见的如Content-TypeUser-Agent等。
  • 请求体(Form Data): 包含用户名、密码、验证码等参数。
  • Cookie: 登录成功后服务器返回的Cookie,用于保持登录状态。

2. 获取验证码

验证码是登录的拦路虎,我们需要先解决它。通常,验证码是一个图片,我们需要先下载这个图片,然后让程序或者人工识别。以下是获取验证码的步骤:

  1. 找到验证码图片的URL。 同样在开发者工具中观察,找到加载验证码图片的URL。
  2. 发送GET请求下载验证码图片。
  3. 识别验证码。 可以使用OCR技术(如Tesseract),或者手动输入。

下面是一个简单的示例代码:

import requests
from PIL import Image  # 记得安装 Pillow 库: pip install Pillow
import io

# 验证码图片URL (请替换成你实际的URL)
captcha_url = 'https://example.com/captcha.png'

# 下载验证码图片
response = requests.get(captcha_url, stream=True)
response.raise_for_status()  # 检查请求是否成功

# 将图片内容读取到内存
image = Image.open(io.BytesIO(response.content))

# 显示验证码图片 (可选)
image.show()

# 手动输入验证码
captcha = input('请输入验证码:')

print(f'你输入的验证码是:{captcha}')

代码解释:

  • requests.get(captcha_url, stream=True):发送GET请求下载验证码图片,stream=True表示以流的方式下载,避免一次性加载到内存。
  • response.raise_for_status():检查HTTP请求是否成功,如果状态码不是200,会抛出异常。
  • Image.open(io.BytesIO(response.content)):使用Pillow库打开图片,io.BytesIO可以将内存中的数据转换为文件对象。
  • image.show():显示验证码图片,方便人工识别。
  • input('请输入验证码:'):提示用户输入验证码。

OCR识别验证码:

如果想让程序自动识别验证码,可以使用OCR技术。Tesseract是一个流行的OCR引擎,可以识别多种语言的文字。使用Tesseract识别验证码的步骤如下:

  1. 安装Tesseract。 根据你的操作系统,下载并安装Tesseract OCR引擎。

  2. 安装pytesseract。 pytesseract是Tesseract的Python封装库,可以通过pip安装:

    pip install pytesseract
    
  3. 配置Tesseract。 需要告诉pytesseract Tesseract的安装路径。 这通常可以通过设置环境变量 TESSDATA_PREFIX 或在代码中指定路径来完成。

  4. 使用pytesseract识别验证码。

import pytesseract
from PIL import Image
import io
import requests

# 验证码图片URL (请替换成你实际的URL)
captcha_url = 'https://example.com/captcha.png'

# 下载验证码图片
response = requests.get(captcha_url, stream=True)
response.raise_for_status()

# 将图片内容读取到内存
image = Image.open(io.BytesIO(response.content))

# 配置Tesseract (请替换成你实际的路径)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' #Windows示例

# 识别验证码
captcha = pytesseract.image_to_string(image)

# 清理识别结果 (去除空格和换行符)
captcha = captcha.strip().replace(' ', '').replace('\n','')

print(f'OCR识别的验证码是:{captcha}')

注意事项:

  • Tesseract的识别精度取决于验证码的清晰度、字体、背景等因素。对于复杂的验证码,可能需要进行图像预处理,例如二值化、降噪等,以提高识别精度。
  • 有些网站会使用更复杂的验证码,例如滑动验证码、点选验证码等。对于这些验证码,需要使用更高级的技术,例如Selenium、Playwright等,模拟用户的行为。

3. 模拟登录

有了验证码,就可以模拟登录了。以下是模拟登录的步骤:

  1. 构造POST请求的数据。 将用户名、密码、验证码等参数放入一个字典中。
  2. 发送POST请求。 使用requests.post()方法发送POST请求,并将数据作为data参数传递。
  3. 检查登录结果。 根据服务器返回的响应,判断登录是否成功。常见的判断方法是检查响应状态码、响应内容、Cookie等。

下面是一个简单的示例代码:

import requests

# 登录URL (请替换成你实际的URL)
login_url = 'https://example.com/login'

# 用户名、密码、验证码 (请替换成你实际的值)
username = 'your_username'
password = 'your_password'
captcha = 'the_captcha_you_got'

# 构造POST请求的数据
data = {
    'username': username,
    'password': password,
    'captcha': captcha
}

# 发送POST请求
response = requests.post(login_url, data=data)

# 检查登录结果
if response.status_code == 200 and '登录成功' in response.text:
    print('登录成功!')
else:
    print('登录失败!')
    print(f'状态码:{response.status_code}')
    print(f'响应内容:{response.text}')

代码解释:

  • requests.post(login_url, data=data):发送POST请求,data参数用于传递请求数据。
  • response.status_code:获取HTTP响应状态码。
  • response.text:获取HTTP响应内容。

4. 保持登录状态

登录成功后,我们需要保持登录状态,才能进行后续操作。requests库提供了Session对象,可以自动管理Cookie,实现持久会话。以下是使用Session对象保持登录状态的步骤:

  1. 创建Session对象。
  2. 使用Session对象发送登录请求。
  3. 使用Session对象发送后续请求。

下面是一个完整的示例代码:

import requests

# 创建Session对象
session = requests.Session()

# 登录URL (请替换成你实际的URL)
login_url = 'https://example.com/login'

# 用户名、密码、验证码 (请替换成你实际的值)
username = 'your_username'
password = 'your_password'
captcha = 'the_captcha_you_got'

# 构造POST请求的数据
data = {
    'username': username,
    'password': password,
    'captcha': captcha
}

# 使用Session对象发送登录请求
response = session.post(login_url, data=data)

# 检查登录结果
if response.status_code == 200 and '登录成功' in response.text:
    print('登录成功!')

    # 后续操作的URL (请替换成你实际的URL)
    profile_url = 'https://example.com/profile'

    # 使用Session对象发送后续请求
    profile_response = session.get(profile_url)

    # 检查后续请求的结果
    if profile_response.status_code == 200:
        print(f'个人资料页面内容:{profile_response.text}')
    else:
        print('获取个人资料失败!')
        print(f'状态码:{profile_response.status_code}')
        print(f'响应内容:{profile_response.text}')

else:
    print('登录失败!')
    print(f'状态码:{response.status_code}')
    print(f'响应内容:{response.text}')

代码解释:

  • session = requests.Session():创建一个Session对象。
  • session.post(login_url, data=data):使用Session对象发送登录请求。 Session对象会自动保存Cookie。
  • session.get(profile_url):使用Session对象发送后续请求。 Session对象会自动携带Cookie,保持登录状态。

5. 总结

使用requests库模拟登录需要验证码的网站,并保持登录状态,主要分为以下几个步骤:

  1. 准备工作: 安装requests库,了解目标网站的登录流程。
  2. 获取验证码: 下载验证码图片,使用OCR技术或者手动输入识别验证码。
  3. 模拟登录: 构造POST请求的数据,发送POST请求,检查登录结果。
  4. 保持登录状态: 创建Session对象,使用Session对象发送登录请求和后续请求。

掌握了这些技巧,你就可以用Python自动登录各种网站,解放你的双手,让你的爬虫或者自动化脚本更加强大! 记得替换示例代码中的URL、用户名、密码、验证码等信息,才能真正运行起来哦! 祝你学习愉快!

点评评价

captcha
健康