下面我将分步详细解释,从最简单到更复杂的场景,并提供完整的代码示例。

核心概念
- 会话对象 (
requests.Session): 这是requests库进行登录操作的最佳实践。Session对象会自动处理 Cookies,在你发起请求时,它会带上之前保存的 Cookies,这对于需要登录后才能访问的页面至关重要。 - 登录请求: 登录通常是通过向服务器的一个特定 URL(
/login)发送一个POST请求来完成的,这个请求包含了你的用户名和密码等数据。 - 表单数据: 登录信息通常以表单数据的形式发送。
requests库提供了data参数来发送这种数据。 - 处理验证码: 现代网站为了防止自动化登录,常常使用验证码,处理验证码是登录流程中最复杂的一步。
基本登录流程(无验证码)
这是最理想的情况,我们以一个假设的登录网站 http://example.com/login 为例。
假设的登录信息:
- 登录 URL:
http://example.com/login - 用户名字段名:
username - 密码字段名:
password - 登录成功后需要访问的页面:
http://example.com/profile
代码实现
import requests
# 1. 创建一个 Session 对象
session = requests.Session()
# 2. 准备登录所需的数据
# 注意:这里的 'username' 和 'password' 是表单的 name 属性值,需要根据目标网站的实际HTML来确定
login_data = {
'username': 'your_username',
'password': 'your_password',
'remember_me': 'on' # 可能还有其他字段,如“记住我”
}
# 3. 发送登录请求 (POST 请求)
# headers 可以用来模拟浏览器,有些网站会检查 User-Agent
login_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
# 发送POST请求到登录页面
login_url = 'http://example.com/login'
response = session.post(login_url, data=login_data, headers=login_headers)
# 4. 检查登录是否成功
# 登录成功后会重定向到另一个页面,或者页面内容会改变。
# 我们可以通过检查响应状态码或响应内容来判断。
# 状态码 200 OK 并不一定代表登录成功,需要根据具体网站判断。
if response.status_code == 200:
# 检查响应内容中是否包含“欢迎”或“退出”等关键字
if '欢迎' in response.text or 'Logout' in response.text:
print("登录成功!")
# 5. 访问需要登录才能看到的页面
# 因为使用了 Session,所以会自动带上登录时获取的 Cookies
profile_url = 'http://example.com/profile'
profile_response = session.get(profile_url)
# 打印个人资料页面的内容
print("访问个人资料页面成功:")
print(profile_response.text)
else:
print("登录失败,请检查用户名、密码或请求是否被拦截。")
print("响应内容:", response.text)
else:
print(f"登录请求失败,状态码: {response.status_code}")
# 6. 关闭 Session (可选,但推荐)
session.close()
如何找到登录所需的信息?
在实际操作中,你不知道 username、password 这些字段名是什么,也不知道登录 URL 是什么,你需要使用浏览器的开发者工具来分析。
- 打开浏览器开发者工具: 通常按
F12或Ctrl+Shift+I(Windows) /Cmd+Opt+I(Mac)。 - 切换到 "网络" (Network) 标签页。
- 在网页上执行登录操作:输入用户名和密码,点击登录按钮。
- 分析请求:
- 在网络列表中,找到一个名为
login或类似名称的请求,其方法通常是POST。 - 点击这个请求,查看 "标头" (Headers) 和 "有效负载" (Payload / Form Data)。
- "有效负载" 或 "表单数据" 部分就是你需要在代码中构建的
login_data字典,键就是name属性的值。 - "标头" 中的
Request URL就是你需要发送POST请求的地址。 - "标头" 中的
User-Agent等信息可以复制到你的headers字典中,以模拟真实浏览器。
- 在网络列表中,找到一个名为
处理验证码
处理验证码是自动化登录最大的挑战,常见方法有:

手动输入验证码(最简单)
这种方法适用于验证码图片不复杂或者刷新不频繁的情况。
- 使用
requests获取包含验证码的登录页面。 - 从页面 HTML 中解析出验证码图片的 URL。
- 下载验证码图片并显示给用户。
- 提示用户手动输入验证码。
- 将用户输入的验证码加入到
login_data中,再发送登录请求。
import requests
from io import BytesIO
# 需要安装 Pillow 库来处理图片: pip install Pillow
from PIL import Image
session = requests.Session()
# 1. 先获取登录页面,拿到验证码
login_page_url = 'http://example.com/login'
login_page_response = session.get(login_page_url)
login_page_response.raise_for_status() # 如果请求失败则抛出异常
# 2. 假设我们从HTML中解析出了验证码图片的URL (这里需要用BeautifulSoup等库)
# captcha_img_url = 'http://example.com/captcha?token=12345'
# 为了演示,我们直接用一个假URL
captcha_img_url = 'http://example.com/captcha_image.jpg'
# 3. 下载验证码图片
captcha_response = session.get(captcha_img_url)
captcha_response.raise_for_status()
# 4. 显示图片并让用户输入
try:
# 使用Pillow库显示图片
img = Image.open(BytesIO(captcha_response.content))
img.show()
user_captcha = input("请输入图片中的验证码: ")
except Exception as e:
print(f"无法显示图片: {e}")
user_captcha = input("请手动查看图片并输入验证码: ")
# 5. 构建包含验证码的登录数据
login_data = {
'username': 'your_username',
'password': 'your_password',
'captcha': user_captcha # 将用户输入的验证码加入
}
# 6. 发送登录请求
login_url = 'http://example.com/login'
response = session.post(login_url, data=login_data)
# 7. 检查登录结果
if '登录成功' in response.text:
print("登录成功!")
else:
print("登录失败,可能验证码错误。")
session.close()
使用第三方打码平台(最强大)
对于复杂的图形验证码、滑动验证码等,可以使用第三方打码平台(如打码平台、超级鹰、2Captcha 等),它们通常提供一个 API,你将图片或验证码挑战数据发送给它们,它们返回识别结果。
基本流程:
- 获取验证码图片/数据。
- 调用打码平台的 API,提交验证码。
- 轮询或等待平台返回识别结果。
- 将结果填入表单并提交。
注意:使用第三方服务通常需要付费,且涉及账号安全,请谨慎选择平台。
处理更复杂的验证(如滑动验证码)
像极验(GeeTest)、reCAPTCHA v2 这种滑动或点击验证码,无法简单地通过输入文字解决,通常需要:
- 逆向分析: 分析网站前端 JavaScript 代码,看它是如何生成验证码参数的,这通常非常复杂,且网站更新后可能失效。
- 使用现有库: 社区中有一些针对特定验证码的破解库,
geetest库,但这些库的维护性和成功率无法保证。 - Selenium/Playwright: 对于极度复杂的验证,使用
requests可能会非常困难,切换到更强大的浏览器自动化工具(如 Selenium 或 Playwright)是更好的选择,它们可以模拟真实用户的行为(如拖动滑块、点击图片),成功率更高。
总结与最佳实践
- 首选
Session对象: 始终使用requests.Session()来管理会话和 Cookies。 - 善用开发者工具: 仔细分析登录请求的
URL、Headers和Form Data。 - 添加
User-Agent: 在headers中设置一个常见的浏览器User-Agent,可以避免被一些简单的反爬机制拦截。 - 处理验证码:
- 优先尝试手动输入,简单有效。
- 如果验证码太复杂,考虑使用 第三方打码平台。
- 如果是滑动/点击验证码,且
requests难以处理,果断切换到 Selenium 或 Playwright。
- 遵守
robots.txt和网站条款: 自动化工具应被负责任地使用,不要对服务器造成过大压力或用于非法目的。
