HOOOS

Python Requests模拟登录与Session保持:手把手教你搞定

0 12 爬虫小王子 Python Requests模拟登录Session保持
Apple

很多时候,我们需要用 Python 脚本来模拟用户登录网站,抓取一些登录后才能访问的数据。这其中,requests 库绝对是利器。但是,光会发 GETPOST 请求还不够,还得搞清楚登录状态是怎么保持的,也就是 cookiessession 的那些事儿。

1. 登录的本质:Cookies和Session

当你登录一个网站时,服务器会做两件事:

  • 验证你的身份:通常是通过你提交的用户名和密码,与服务器数据库中的信息进行比对。
  • 创建一个“通行证”:这个通行证就是 cookie,服务器会把 cookie 发送给你的浏览器,浏览器保存下来。以后你每次访问这个网站,都会带上这个 cookie,服务器就知道你是已经登录过的用户了。

Session 可以简单理解为服务器端保存的用户信息。当你登录成功后,服务器会创建一个 session,并把你的登录状态信息保存在里面。Session ID 则相当于 session 的身份证,这个 ID 会被保存在 cookie 中,下次你再访问,服务器就能通过 cookie 中的 Session ID 找到你的 session,从而知道你的登录状态。

2. requests库如何处理Cookies和Session

requests 库提供了非常方便的方式来处理 cookiessession

  • Cookies的处理:

    • requests.get()requests.post() 方法的 cookies 参数:可以用来发送 cookies
    • Response 对象的 cookies 属性:可以用来获取服务器返回的 cookies
  • Session的处理:

    • 使用 requests.Session() 创建一个 session 对象:这个对象会自动处理 cookies,在同一个 session 中发送的请求都会自动携带 cookies,从而保持登录状态。

3. 模拟登录的完整步骤

一般来说,模拟登录需要以下几个步骤:

  1. 分析登录页面:找到登录表单的 URL、需要提交的参数(用户名、密码等),以及可能存在的 CSRF token
  2. 发送登录请求:使用 requests.post() 方法提交登录表单,并获取服务器返回的 cookies
  3. 保持登录状态:使用 requests.Session() 创建一个 session 对象,后续的请求都使用这个 session 对象发送,这样就能自动携带 cookies,保持登录状态。
  4. 访问需要登录的页面:使用 session 对象发送请求,获取需要的数据。

4. 实战代码:模拟登录并访问个人主页

假设我们要登录一个名为 example.com 的网站,并访问个人主页 example.com/profile。以下是一个简单的示例代码:

import requests

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

# 2. 构造登录数据
login_data = {
    'username': 'your_username',
    'password': 'your_password'
}

# 3. 登录URL(需要替换成真实的登录URL)
login_url = 'https://example.com/login'

# 4. 发送登录请求
response = session.post(login_url, data=login_data)

# 5. 检查登录是否成功
if response.status_code == 200:
    print('登录成功!')
else:
    print('登录失败,状态码:', response.status_code)
    exit()

# 6. 个人主页URL(需要替换成真实的个人主页URL)
profile_url = 'https://example.com/profile'

# 7. 访问个人主页
profile_response = session.get(profile_url)

# 8. 检查是否成功访问个人主页
if profile_response.status_code == 200:
    print('成功访问个人主页!')
    # 9. 打印个人主页内容
    print(profile_response.text)
else:
    print('访问个人主页失败,状态码:', profile_response.status_code)

代码解释:

  • 首先,我们创建了一个 session 对象,用于保持登录状态。
  • 然后,我们构造了登录数据,包括用户名和密码。注意:你需要替换成你自己的用户名和密码。
  • 接着,我们指定了登录 URL注意:你需要替换成真实的登录 URL。 很多网站的登录 URL 都是 POST 请求,你需要通过浏览器的开发者工具(F12)来查看。
  • 使用 session.post() 方法发送登录请求。注意,这里使用的是 session 对象发送的请求,而不是 requests.post()。这样,session 对象会自动处理 cookies,保持登录状态。
  • 检查登录是否成功,可以通过 response.status_code 来判断。如果状态码是 200,说明登录成功。
  • 指定个人主页 URL注意:你需要替换成真实的个人主页 URL。
  • 使用 session.get() 方法访问个人主页。同样,这里使用的是 session 对象发送的请求,这样就能自动携带 cookies,保持登录状态。
  • 检查是否成功访问个人主页,并打印个人主页内容。

5. 进阶技巧:处理CSRF Token

很多网站为了防止跨站请求伪造(CSRF),会在登录页面中添加一个 CSRF token。这个 token 是一个随机字符串,每次登录都会生成一个新的 token。如果你要模拟登录这种网站,就必须先获取 CSRF token,然后在登录请求中一起提交。

获取 CSRF token 的方法一般有两种:

  • 从登录页面的 HTML 中提取:有些网站会把 CSRF token 放在一个隐藏的 input 标签中,你可以用 BeautifulSouplxml 等库来解析 HTML,提取 token。
  • 从 cookies 中获取:有些网站会把 CSRF token 放在 cookies 中,你可以从 response.cookies 中获取 token。

以下是一个示例代码,演示如何从登录页面的 HTML 中提取 CSRF token

import requests
from bs4 import BeautifulSoup

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

# 2. 登录页面URL(需要替换成真实的登录页面URL)
login_page_url = 'https://example.com/login'

# 3. 获取登录页面内容
login_page_response = session.get(login_page_url)

# 4. 使用BeautifulSoup解析HTML
soup = BeautifulSoup(login_page_response.text, 'html.parser')

# 5. 找到CSRF token的input标签
csrf_token_input = soup.find('input', {'name': 'csrf_token'})

# 6. 获取CSRF token的值
csrf_token = csrf_token_input['value']

# 7. 构造登录数据,包含CSRF token
login_data = {
    'username': 'your_username',
    'password': 'your_password',
    'csrf_token': csrf_token
}

# 8. 登录URL(需要替换成真实的登录URL)
login_url = 'https://example.com/login'

# 9. 发送登录请求
response = session.post(login_url, data=login_data)

# 10. 检查登录是否成功
if response.status_code == 200:
    print('登录成功!')
else:
    print('登录失败,状态码:', response.status_code)
    exit()

# 后续步骤与前面相同,省略...

代码解释:

  • 首先,我们获取了登录页面的 HTML 内容。
  • 然后,我们使用 BeautifulSoup 解析 HTML,找到 CSRF token 的 input 标签。注意:你需要根据实际情况修改 soup.find() 方法的参数,找到正确的 input 标签。
  • 获取 CSRF token 的值,并将其添加到登录数据中。
  • 后续的登录步骤与前面相同。

6. 总结

使用 requests 库模拟登录网站,并保持登录状态,需要理解 cookiessession 的概念,并学会使用 requests.Session() 对象来处理 cookies。如果网站使用了 CSRF token,还需要先获取 token,然后在登录请求中一起提交。

掌握了这些技巧,你就可以用 Python 脚本来自动化各种需要登录才能访问的任务了!是不是感觉打开了新世界的大门?快去试试吧! 记得把代码中的 URL用户名密码 替换成你自己的哦!

点评评价

captcha
健康