爬虫 Cookie 会话:登录小说网站实战
2026/6/7 17:06:42 网站建设 项目流程

一、博客标题

1. 爬虫入门实战|使用 Requests.Session 实现 Cookie 会话登录,抓取小说网站书架数据
2. 一文搞懂 HTTP 会话保持:Python 模拟登录+Cookie 自动管理完整案例
3. 从零实战:requests 表单登录+会话维持,爬取登录授权页面(小说网站场景)
4. 解决登录态丢失问题!Requests Session 自动携带 Cookie 跨页面请求详解

二、博客正文

前言

在爬虫开发中,登录授权页面爬取是最常见的场景。由于 HTTP 协议是无状态协议,单次 requests.get/post 请求无法保存登录凭证,访问登录后页面会直接被判定为未登录 。

本文以某小说网站为例,基于 Python requests 库的 Session 会话对象,实现表单账号密码登录、自动保存 Cookie、跨页面维持登录态、抓取书架数据全流程实战。同时讲解核心原理、请求头配置、常见报错排查,代码可直接运行,适合爬虫初学者入门学习。

一、技术前置知识

1.1 为什么要用 Session 会话?

原生 requests 每次请求都是独立连接,不会自动保存 Cookie,登录后再次请求其他页面会丢失身份。
requests.Session() 会创建一个持久化会话,自动管理 Cookie、请求头、连接池,一次登录后,同一会话下所有请求自动携带登录凭证,完美模拟浏览器连续操作行为。

1.2 登录核心流程

1. 初始化 Session 会话对象(必须在登录前创建)。
2. 配置请求头( User-Agent 、 Referer 等,绕过基础反爬)。
3. 发送 POST 表单请求,提交账号密码完成登录。
4. 从会话中提取登录成功后的 Cookie 。
5. 使用同一会话发送 GET 请求,访问登录专属页面(书架)。

二、环境准备

1. 依赖库安装

pip install requests

2. 运行环境:Python 3.7+、PyCharm/VS Code 均可。
3. 目标站点:小说测试站点(文中链接仅作学习演示,请勿用于非法爬取)。

三、完整实战代码

3.1 完整可运行代码

import requests session = requests.Session() # -------------------------- # 2. 配置请求头 # -------------------------- headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36", "Referer": "https://lnzycm.com/user/login.html", "Origin": "https://lnzycm.com", "Content-Type": "application/x-www-form-urlencoded", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" } login_url = "https://lnzycm.com/user/login.html" login_data = { "username": "auto", "password": "admin123" } print("正在登录...") login_resp = session.post(login_url, data=login_data, headers=headers, allow_redirects=True) print("登录状态码:", login_resp.status_code) print("登录Cookie:", session.cookies.get_dict()) print("\n" + "="*50) print("正在获取书架数据...") bookcase_url = "https://lnzycm.com/user/bookcase.html" resp = session.get(bookcase_url, headers=headers) print("书架页面状态码:", resp.status_code) print("\n===== 书架页面完整内容 =====\n") print(resp.text)

3.2 代码逐行详解

1. session = requests.Session()
核心对象,整个流程只创建一次。所有登录、后续访问请求都必须使用该对象,否则登录态失效。
2. 请求头 headers 作用- User-Agent :伪装成浏览器,拒绝纯爬虫请求。
- Referer/Origin :标识请求来源页面,部分网站会校验该字段,缺失会登录失败。
- Content-Type :声明请求体为表单格式,适配账号密码提交。
3. session.post() 登录请求
账号密码以 data 表单形式提交, allow_redirects=True 开启跳转跟随,适配登录后自动跳转场景。
4. session.cookies.get_dict()
从会话中提取服务器返回的登录 Cookie,包含 userid 、 username 、身份密钥等身份凭证。
5. session.get() 访问书架
复用同一个 session 对象,自动携带登录 Cookie,成功访问需要登录权限的书架页面。

四、运行结果说明

4.1 正常运行输出

===== 开始模拟登录 ===== 登录响应状态码:200 登录成功获取Cookie:{'userid': '51359', 'username': 'auto', 'bookkey': '2f5ca01ec893a2dae08ec1b49d8eb0b6'} ============================================================ ===== 访问登录后页面:个人书架 ===== 书架页面响应状态码:200 ===== 书架页面源码片段 ===== <br /> <b>Notice</b>: Undefined variable: pcurl in <b>D:\wwwroot\zhanqun\lnzycm.com\web\user\bookcase.php</b> on line <b>116</b><br /> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>我的书架 - 临时书架 - 浏览记录_饿虎小说网</title> ......

4.2 结果解读

1. 状态码 200 :请求正常,登录、页面访问均成功。
2. 成功获取三组 Cookie 字段: userid (用户ID)、 username (用户名)、 bookkey (身份密钥),证明登录态已保存。
3. 页面源码正常返回个人书架页面,说明会话保持生效,未被拦截为未登录用户。
4. 页面中的 Undefined variable 是网站服务端 PHP 代码报错,和爬虫代码无关,不影响数据获取。

五、常见问题 & 排错方案

问题1:登录成功,但访问书架页面跳转到登录页

原因:未复用同一个 Session 对象、请求头缺失 Referer/Origin 。
解决方案:

1. 全程只使用一个 session 实例,不要多次 requests.Session() 。
2. 补齐完整请求头,重点保留 Referer 和 User-Agent 。

问题2:登录状态码 403 / 401 拒绝访问

原因:请求头伪装不足、表单参数名错误、账号密码错误。
解决方案:

1. 浏览器 F12 抓包,核对真实登录请求的 headers 和 data 字段。
2. 确认 username/password 参数名和网站表单一致。

问题3:Cookie 获取为空,登录失效

原因:登录接口地址错误、未开启页面跳转跟随。
解决方案:

1. 抓包确认真实登录 url ,部分网站登录接口和登录页面不是同一个地址。
2. post 请求添加 allow_redirects=True 。

问题4:多次请求后登录态丢失

原因:网站 Cookie 有时效性、请求频率过高触发反爬。
解决方案:

1. 定时重新登录刷新 Cookie。
2. 添加延时 time.sleep(1~3) ,降低请求频率。

六、拓展进阶用法

6.1 全局统一设置请求头

无需每次请求都传入headers,给会话全局绑定请求头:

session = requests.Session() # 全局更新请求头,该会话下所有请求自动携带 session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/114.0.0.0" })

6.2 上下文管理器写法

使用 with 语句,代码更规范,会话自动释放资源:

with requests.Session() as session: # 登录逻辑 session.post(login_url, data=login_form_data, headers=headers) # 访问书架 res = session.get(bookcase_url, headers=headers) print(res.text)

6.3 手动携带 Cookie 访问

若已有登录 Cookie,可直接构造 Cookie 字典访问页面:

cookies = { 'userid': '51359', 'username': 'auto', 'bookkey': '2f5ca01ec893a2dae08ec1b49d8eb0b6' } res = requests.get(bookcase_url, headers=headers, cookies=cookies)

七、总结

1. 登录类爬虫首选 requests.Session() ,核心优势是自动管理 Cookie、维持会话,完美解决 HTTP 无状态问题。

2. 模拟登录三要素:正确的登录接口、表单参数、完整请求头,三者缺一极易登录失败。

3. 实战核心规则:会话对象仅初始化一次,跨页面请求必须复用同一会话。

4. 本文案例适用于绝大多数账号密码表单登录网站,可迁移至论坛、资讯站、图书站等场景。

免责声明:本文代码仅用于 Python 爬虫技术学习与研究,请遵守目标网站用户协议及国家网络安全法规,禁止恶意爬取、批量抓取商业数据。

八、文末互动

1. 你在模拟登录时遇到过哪些奇葩反爬?评论区留言交流。

2. 后续将更新:Cookie 持久化保存、验证码登录、小说正文解析等内容,欢迎点赞+收藏+关注!

三、博客标签

Python 爬虫 requests Cookie Session会话 模拟登录 爬虫实战 小说爬虫 网络请求

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询