实战:Python爬虫如何模拟登录与维持会话状态

简介: 实战:Python爬虫如何模拟登录与维持会话状态

一、核心原理:Cookie、Session与会话保持
在开始写代码之前,我们必须先理解背后的原理。HTTP协议本身是无状态的,这意味着服务器不会记得上一次请求是谁发来的。为了解决这个问题,Cookie和Session机制应运而生。

  1. Cookie:是由服务器发送到用户浏览器并保存在本地的一小块数据。浏览器会将该数据在后续的请求中一并发送给服务器。它就像是服务器给你的一张“会员卡”,上面记录着你的身份标识(Session ID)。
  2. Session:是服务器为每个用户创建的一个存储空间,用于保存用户的状态信息(如登录状态、购物车内容等)。这个空间通过一个唯一的Session ID来标识。
  3. 会话保持:整个登录流程可以概括为:
    ○ 登录:客户端(浏览器/爬虫)向服务器提交认证信息(如用户名、密码)。
    ○ 验证:服务器验证通过后,在服务器端创建一个Session,并生成一个唯一的Session ID。
    ○ 下发凭证:服务器在HTTP响应头中,通过Set-Cookie字段,将这个Session ID发送给客户端,客户端将其保存为Cookie。
    ○ 维持状态:此后,客户端在向该服务器发起的每一次请求中,都会自动通过HTTP请求头的Cookie字段携带这个Session ID。
    ○ 识别身份:服务器接收到请求后,通过解析Cookie中的Session ID,就能找到对应的Session,从而识别出当前请求的用户身份。
    因此,我们爬虫的任务就是:模拟登录请求以获取有效的Cookie,并在后续的请求中持续地、正确地携带这个Cookie。
    在Python中,requests.Session()对象完美地为我们封装了这一过程。它会自动管理和维护Cookie,就像一个小型的浏览器。
    二、实战准备:目标分析与库导入
    目标网站:为了方便演示和实验,我们选择一个优秀的练习网站——https://scrapingclub.com/exercise/basic_login/。这个网站专门为爬虫登录练习而设计,有一个简单的登录表单。
    技术工具:
    ● Python
    ● requests:用于发起HTTP请求。
    ● BeautifulSoup(可选):用于解析HTML,提取登录所需的信息(如CSRF Token)。
    首先,导入必要的库。
    import requests
    from bs4 import BeautifulSoup

我们将使用这个URL作为示例

login_url = "https://scrapingclub.com/exercise/basic_login/"
protected_url = "https://scrapingclub.com/exercise/basic_login/" # 登录成功后跳转的页面,这里相同

你的登录凭证(请在网站上注册或使用提供的测试账号,这里用假名替代)

username = "your_username"
password = "your_password"
三、实战演练:一步步实现模拟登录
步骤一:分析登录请求
这是最关键的一步。打开目标网站的登录页面,按F12打开开发者工具,切换到Network(网络)选项卡。然后输入错误的用户名密码尝试登录。
你会看到一个POST请求被发出。我们需要关注它的:
● 请求URL:数据被发送到哪里。
● 请求头:特别是Content-Type。
● 请求体:包含了哪些字段。
通过分析scrapingclub的登录请求,我们发现它非常简单:
● 请求URL: POST https://scrapingclub.com/exercise/basic_login/
● 请求体: name=username&password=password (表单格式)
有些复杂的网站(如使用Django、Flask等框架的)可能会有csrfmiddlewaretoken等隐藏字段,这些字段需要先从登录页面HTML中提取,再随用户名密码一同提交。本例中我们很幸运,没有这些障碍。
步骤二:使用Session对象发起登录请求
现在,我们开始编写代码。

代理配置

proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

构建代理URL(格式:http://用户名:密码@代理服务器:端口)

proxyUrl = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"

设置代理字典(支持HTTP和HTTPS)

proxies = {
"http": proxyUrl,
"https": proxyUrl
}

创建一个Session对象,它将为我们自动保存Cookie

session = requests.Session()

准备要提交的登录数据

login_data = {
"name": username,
"password": password
}

发起POST登录请求,添加代理配置

注意:我们使用session.post,而不是requests.post

response = session.post(login_url, data=login_data, proxies=proxies)

检查登录是否成功

通常可以通过检查响应状态码、响应URL或响应内容来判断

if response.status_code == 200:

# 检查响应内容中是否包含登录成功的提示
if "Congratulations" in response.text:
    print("登录成功!")
else:
    print("登录失败!可能是用户名或密码错误。")
    print("响应内容:", response.text[:500]) # 打印前500字符以便调试
    exit()

else:
print(f"请求失败,状态码:{response.status_code}")
exit()
代码解读:
● 我们创建了一个session对象。
● 将用户名和密码构造成一个字典login_data。
● 使用session.post()方法向登录URL发送一个POST请求,并将login_data作为data参数传入。这相当于提交了一个表单。
● 服务器处理登录逻辑后,如果成功,会在响应中设置Cookie,而我们的session对象会自动捕获并存储这些Cookie。
● 我们通过检查响应内容中是否包含“Congratulations”来判断登录是否成功。
四、维持会话:访问受保护页面
登录成功后,最关键的一步就是利用刚才建立的会话来访问需要登录才能查看的页面。

现在,使用同一个session对象去访问登录后才能访问的页面

注意:这里我们仍然使用session.get,它会自动携带登录后获得的Cookie

profile_response = session.get(protected_url)

检查访问是否成功

if profile_response.status_code == 200:

# 此时可以解析profile_response的内容,提取所需数据
print("成功访问受保护页面!")

# 使用BeautifulSoup解析页面,提取成功信息
soup = BeautifulSoup(profile_response.text, 'html.parser')
# 假设成功信息在一个特定的div或p标签里,根据实际HTML结构调整
success_message = soup.find('div', class_='success-message') # 示例选择器
if success_message:
    print("提取到的信息:", success_message.get_text(strip=True))
else:
    # 如果找不到特定元素,直接打印部分内容确认
    print("页面内容预览:", profile_response.text[:1000])

else:
print(f"访问受保护页面失败,状态码:{profile_response.status_code}")
核心要点:请注意,在访问受保护页面时,我们没有再次手动添加任何Cookie或认证信息。所有的身份验证工作,都由session对象在背后默默完成。它就像是一个已经登录了的浏览器标签页,你可以在里面随意跳转,身份状态会一直保持。
五、处理复杂情况:应对CSRF Token
在实际项目中,你会遇到更复杂的登录机制,最常见的就是CSRF(跨站请求伪造)保护。CSRF Token是一个随机的、难以猜测的字符串,由服务器在登录表单中生成,提交登录请求时必须原样带回,用于证明请求来源于真实的网站表单。
如何处理CSRF Token?

  1. 首次请求登录页面,使用session.get()获取HTML。
  2. 从HTML中解析出CSRF Token。它通常位于一个名为csrfmiddlewaretoken或类似的隐藏输入框(``)中。
  3. 将CSRF Token连同用户名、密码一起提交。
    以下是模拟这种场景的通用代码模板:

    以一个有CSRF保护的假设网站为例

1. 获取登录页面,并捕获Cookie(可能包含初始的Session)

login_page_url = "https://example.com/login"
session = requests.Session()
login_page_response = session.get(login_page_url)

2. 解析CSRF Token

soup = BeautifulSoup(login_page_response.text, 'html.parser')
csrf_token = soup.find('input', {'name': 'csrf_token'})['value'] # 根据实际HTML结构调整选择器

3. 准备登录数据,包含CSRF Token

login_data = {
"username": username,
"password": password,
"csrf_token": csrf_token # 添加CSRF Token
}

4. 发起登录请求(session会自动管理两次请求间的Cookie)

response = session.post(login_page_url, data=login_data)

... 后续判断登录成功和访问受保护页面的代码与之前相同

六、总结与最佳实践
通过本文的实战,我们掌握了模拟登录的核心流程:

  1. 理解原理:深刻理解Cookie-Session机制是成功的基础。
  2. 使用Session:始终使用requests.Session()对象来管理整个会话周期。
  3. 精细分析:熟练使用浏览器开发者工具,仔细分析登录请求的URL、头和体。
  4. 处理复杂性:能够应对CSRF Token等常见的反爬机制。
    最佳实践建议:
    ● 遵守道德与法律:只爬取被允许的公开数据或已获得授权的数据,尊重网站的robots.txt。
    设置请求头:在创建Session后,可以统一设置一个真实的User-Agent,使其更像浏览器行为。
    ● python
    session.headers.update({
    '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'
    })
    ● 添加错误处理:使用try...except包裹网络请求,处理超时、连接错误等异常情况。
    ● 控制访问频率:在访问受保护页面时,使用time.sleep()适当延时,避免对服务器造成过大压力。
相关文章
|
4月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
526 7
|
4月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
155 12
|
4月前
|
数据采集 人工智能 JSON
Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码
Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码
|
4月前
|
数据采集 存储 JSON
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
|
4月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
433 1
|
4月前
|
存储 Java 调度
Python定时任务实战:APScheduler从入门到精通
APScheduler是Python强大的定时任务框架,通过触发器、执行器、任务存储和调度器四大组件,灵活实现各类周期性任务。支持内存、数据库、Redis等持久化存储,适用于Web集成、数据抓取、邮件发送等场景,解决传统sleep循环的诸多缺陷,助力构建稳定可靠的自动化系统。(238字)
771 1
|
4月前
|
数据采集 机器学习/深度学习 人工智能
反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
本文系统阐述了反爬虫技术的演进与实践,涵盖基础IP限制、User-Agent检测,到验证码、行为分析及AI智能识别等多层防御体系,结合代码实例与架构图,全面解析爬虫攻防博弈,并展望智能化、合规化的发展趋势。
1218 0
反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
|
4月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
427 0
|
4月前
|
机器学习/深度学习 监控 数据挖掘
Python 高效清理 Excel 空白行列:从原理到实战
本文介绍如何使用Python的openpyxl库自动清理Excel中的空白行列。通过代码实现高效识别并删除无数据的行与列,解决文件臃肿、读取错误等问题,提升数据处理效率与准确性,适用于各类批量Excel清理任务。
482 0
|
4月前
|
数据采集 存储 JavaScript
解析Python爬虫中的Cookies和Session管理
Cookies与Session是Python爬虫中实现状态保持的核心。Cookies由服务器发送、客户端存储,用于标识用户;Session则通过唯一ID在服务端记录会话信息。二者协同实现登录模拟与数据持久化。

推荐镜像

更多