杰瑞科技汇

Python requests如何实现网站登录?

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

Python requests如何实现网站登录?-图1
(图片来源网络,侵删)

核心概念

  1. 会话对象 (requests.Session): 这是 requests 库进行登录操作的最佳实践。Session 对象会自动处理 Cookies,在你发起请求时,它会带上之前保存的 Cookies,这对于需要登录后才能访问的页面至关重要。
  2. 登录请求: 登录通常是通过向服务器的一个特定 URL(/login)发送一个 POST 请求来完成的,这个请求包含了你的用户名和密码等数据。
  3. 表单数据: 登录信息通常以表单数据的形式发送。requests 库提供了 data 参数来发送这种数据。
  4. 处理验证码: 现代网站为了防止自动化登录,常常使用验证码,处理验证码是登录流程中最复杂的一步。

基本登录流程(无验证码)

这是最理想的情况,我们以一个假设的登录网站 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()

如何找到登录所需的信息?

在实际操作中,你不知道 usernamepassword 这些字段名是什么,也不知道登录 URL 是什么,你需要使用浏览器的开发者工具来分析。

  1. 打开浏览器开发者工具: 通常按 F12Ctrl+Shift+I (Windows) / Cmd+Opt+I (Mac)。
  2. 切换到 "网络" (Network) 标签页
  3. 在网页上执行登录操作:输入用户名和密码,点击登录按钮。
  4. 分析请求
    • 在网络列表中,找到一个名为 login 或类似名称的请求,其方法通常是 POST
    • 点击这个请求,查看 "标头" (Headers)"有效负载" (Payload / Form Data)
    • "有效负载""表单数据" 部分就是你需要在代码中构建的 login_data 字典,键就是 name 属性的值。
    • "标头" 中的 Request URL 就是你需要发送 POST 请求的地址。
    • "标头" 中的 User-Agent 等信息可以复制到你的 headers 字典中,以模拟真实浏览器。

处理验证码

处理验证码是自动化登录最大的挑战,常见方法有:

Python requests如何实现网站登录?-图2
(图片来源网络,侵删)

手动输入验证码(最简单)

这种方法适用于验证码图片不复杂或者刷新不频繁的情况。

  1. 使用 requests 获取包含验证码的登录页面。
  2. 从页面 HTML 中解析出验证码图片的 URL。
  3. 下载验证码图片并显示给用户。
  4. 提示用户手动输入验证码。
  5. 将用户输入的验证码加入到 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,你将图片或验证码挑战数据发送给它们,它们返回识别结果。

基本流程:

  1. 获取验证码图片/数据。
  2. 调用打码平台的 API,提交验证码。
  3. 轮询或等待平台返回识别结果。
  4. 将结果填入表单并提交。

注意:使用第三方服务通常需要付费,且涉及账号安全,请谨慎选择平台。


处理更复杂的验证(如滑动验证码)

像极验(GeeTest)、reCAPTCHA v2 这种滑动或点击验证码,无法简单地通过输入文字解决,通常需要:

  1. 逆向分析: 分析网站前端 JavaScript 代码,看它是如何生成验证码参数的,这通常非常复杂,且网站更新后可能失效。
  2. 使用现有库: 社区中有一些针对特定验证码的破解库,geetest 库,但这些库的维护性和成功率无法保证。
  3. Selenium/Playwright: 对于极度复杂的验证,使用 requests 可能会非常困难,切换到更强大的浏览器自动化工具(如 Selenium 或 Playwright)是更好的选择,它们可以模拟真实用户的行为(如拖动滑块、点击图片),成功率更高。

总结与最佳实践

  1. 首选 Session 对象: 始终使用 requests.Session() 来管理会话和 Cookies。
  2. 善用开发者工具: 仔细分析登录请求的 URLHeadersForm Data
  3. 添加 User-Agent: 在 headers 中设置一个常见的浏览器 User-Agent,可以避免被一些简单的反爬机制拦截。
  4. 处理验证码:
    • 优先尝试手动输入,简单有效。
    • 如果验证码太复杂,考虑使用 第三方打码平台
    • 如果是滑动/点击验证码,且 requests 难以处理,果断切换到 SeleniumPlaywright
  5. 遵守 robots.txt 和网站条款: 自动化工具应被负责任地使用,不要对服务器造成过大压力或用于非法目的。
分享:
扫描分享到社交APP
上一篇
下一篇