数据采集(爬虫)
http是无状态的,即HTTP协议对事物处理是没有记忆能力的,服务器不知道客户端是什么状态
如果后续需要处理前面的信息,则必须重新传入
说的更直白一点,就是服务器不会记录客户端之前发送的请求,每次请求都是独立的。服务器处理完一个请求并返回响应后,连接就会关闭,不会保留与该请求相关的任何状态信息
两个保持HTTP联系状态的技术:session和cookies
session在服务端,用于保存用户的cookies信息
cookies在客户端(浏览器端),浏览器在下次访问网页时会自动附带上cookies值,将它发送给服务器,服务器通过识别cookies判断是哪个用户,判断用户是否是登入状态进而返回对应的响应
那么什么是cookies?
cookies是网站记录用户状态信息而存储在浏览器中的小段文本数据
cookies包含的信息十分广泛,具体如下:
- 核心技术信息(由服务器和浏览器自动处理):这是每个cookie的最基本的部分,用于确保cookie能够被正确发送和处理
- 网站功能信息(用于提升用户体验):这些是网站为了正常运作或记住用户的偏好而储存的信息
- 跟踪与分析信息:这些是第三发(如广告商、数据分析公司)设置的cookie,用于跨网站跟踪用户的行为,从而构建用户的兴趣画像
Cookie 名称常见模式 | 很可能的作用 | 举例说明 |
---|---|---|
包含 session , sess , sessid , JSESSIONID | 会话标识符:这是最重要的Cookie,用于保持你的登录状态。 | sessionid=abc123def456... |
包含 token , access_token , refresh_token | 认证令牌:现代Web应用(如单页应用)常用它来管理登录状态。 | access_token=eyJhbGciOiJ... (很长的一串JWT令牌) |
包含 csrf , xsrf-token | 安全令牌:用于防止跨站请求伪造攻击,通常在表单提交时使用。 | csrftoken=8dfh3k9j... |
包含 _ga , _gid , _gat | Google Analytics:用于网站流量统计分析。 | _ga=GA1.2.123456789.1234567890 |
包含 _fbp , fr | Facebook Pixel:用于Facebook广告追踪和转化跟踪。 | _fbp=fb.1.123456789.1234567890 |
包含 consent , opt_in , privacy | 用户同意管理:记录你是否同意了Cookie使用政策。 | cookie_consent=true |
包含 cart , basket | 购物车信息:在电商网站存储你临时加入购物车的商品。 | cart_id=item1:2,item2:1 |
名称很乱,如 uid , id | 用户标识符:可能是网站或广告平台给你分配的唯一ID,用于追踪。 | uid=12345 |
cookie的作用:
- 会话管理:保持用户的登入状态。用户登入一次,网站通过cookie就知道后续的用户都是你,无需每换一次页面就要输入一次密码
- 个性化设置:记住用户的偏好,比如语言,主题(深色或浅色)、字体大小
- 购物车:在电商网站,即使没有登入,也能把商品加入购物车。这背后就是cookie在临时保存信息
- 跟踪与分析:记录用户的浏览行为。比如广告商通过Cookie知道你对登山杖感兴趣,然后在不同网站上向你展示登山用品。
什么是session?
我们可以用一个非常贴切的比喻来理解:
核心比喻:酒店入住
Cookie= 你的房卡
Session = 酒店前台的“入住登记簿
现在,我们来分解这个过程:一场完整的“Web访问”如何工作
第1步:你第一次访问网站(走进酒店)
你访问 `www.example.com`。
你的浏览器(你)是陌生人,没有Cookie(房卡)。 服务器(酒店前台)看到你不认识,于是:
创建一个新的Session:在它的数据库或内存中开辟一个新的“房间”,并生成一个**唯一的Session ID(房间号)。这个Session里暂时是空的。
通过Cookie把这个Session ID发给你**:它在HTTP响应头中说:“嘿,浏览器,请把这个Session ID存为Cookie,下次来的时候带上”。就像前台给你一张写了房间号的房卡。
这个Cookie通常叫做 `sessionid`、`JSESSIONID` 等。
第2步:你登录网站(办理入住登记)
你输入用户名和密码点击登录。
你的浏览器发送登录请求,并**自动带上第一步中获得的那个包含Session ID的Cookie**(你刷房卡进入房间)。
服务器(前台)收到请求,**通过Cookie里的Session ID找到对应的Session记录**(根据房卡上的号码查到你开的房间)。
服务器验证你的账号密码正确后,**就把你的用户信息(如user_id, username)写进这个Session记录里**(在前台登记簿上这个房间号后面写上你的名字和身份证号)。
现在,这个Session就标志着你“已登录”了。
**第3步:你在网站内浏览(在酒店内活动)**
* 你点击“我的账户”、“购物车”等链接。
* 每个请求,浏览器都会**自动带上那个Session ID Cookie**(你每次去酒店的健身房、餐厅,都要刷房卡)。
* 服务器**每次都用这个Session ID去查它的“登记簿”**(前台每次刷房卡都核对一下信息)。
* 一旦它发现这个Session ID对应的Session里存在登录信息,它就认为你是合法用户,并返回相应的页面数据(允许你使用设施)。
**第4步:你退出登录(办理退房)**
* 你点击“退出”。
* 服务器收到请求,**直接销毁它那边的Session记录**(前台把登记簿上你的那条记录划掉,房间收回)。
* 同时,它可能会告诉浏览器清除这个Session Cookie(让你的房卡失效)。
* 此后,即使你的浏览器还保存着那个Session ID(你捡到了旧房卡),但服务器那边已经找不到对应的Session了(前台发现这个房间号已经无效了),所以你会被当作未登录用户。
**第5步:Session过期(酒店自动清理)**
* 如果你长时间不活动(比如30分钟没有发送请求),服务器为了节省资源,会**自动销毁过期的Session**(酒店规定,房间闲置超过24小时自动清空)。
* 这时,你的登录状态也就失效了。
---
### 为什么需要Session和Cookie这样配合?
这主要是由于 **HTTP协议本身是“无状态”的**。这意味着服务器处理每个请求时,都把它当作一个全新的、独立的请求,它不会记住你上一次是谁。
Session和Cookie的机制就是为了在无状态的HTTP之上**创建一种“状态”或“记忆”**。
* **Cookie** 负责在**客户端(浏览器)** 存储一个“钥匙”(Session ID)。
* **Session** 负责在**服务器端** 存储真正的用户数据(锁着的信息宝箱)。
这种设计非常巧妙:
1. **安全**:敏感的用户数据(如登录状态、用户ID)存储在服务器端,相对安全。客户端只存储一个无意义的ID字符串。
2. **高效**:服务器不需要在每次响应中都传递大量用户数据,只需传递一个小的ID即可。
总结:Cookie 和 Session 的关系
特性 | Cookie | Session |
---|---|---|
存储位置 | 客户端(浏览器) | 服务器端(内存、数据库、文件) |
存储内容 | 一个标识符(Session ID) | 详细的用户状态(登录信息、购物车等) |
安全性 | 相对较低,用户可查看、禁用、篡改 | 相对较高,数据在服务器上 |
生命周期 | 可以设置长期有效(持久Cookie) | 通常较短,与浏览器会话同步或自定义超时 |
多路加速:了解多线程的基本原理:
进程可以理解为一个独立运行的程序单位
进程是线程的集合,是由一个或多个线程构成的
线程是操作系统进行运算调度的最小单位,是进程中的一个最小运行单元
并发和并行