【Python爬虫基础篇】--3.cookie和session
目录
1.1.定义
1.2.参数
1.3.分类
2.session
4.使用session登录
1.cookie
由于http是一个无状态的协议,请求与请求之间无法相互传递或者记录一些信息,cookie和session正是为了解决这个问题而产生。
例子:当我需要爬取我的微博账号的粉丝信息的时候,如果直接使用下面的代码
import requestsbase_url = 'https://weibo.com/u/6320270401'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
}
response=requests.get(base_url,headers=headers)
是获取不到信息的,
这并不是微博的个人信息页面。这也再一次证明了如果代码中并没有携带Cookie信息,则并不会进入到个人信息页面,而是跳转到了其他页面。
1.1.定义
定义:cookie指某些网站为例辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据
1.2.参数
参数:
字段 | 作用 |
---|---|
Name | Cookie的名称,创建后不可更改。 |
Value | Cookie的值。Unicode字符需编码,二进制数据需BASE64编码。 |
Domain | 可访问该Cookie的域名(如 .zhihu.com 允许所有子域名访问)。若未指定,默认为当前域名。 |
MaxAge | 失效时间(秒)。正数表示存活时间;负数表示浏览器关闭后失效;0表示立即删除。与Expires 配合使用(优先级高于Expires )。 |
Path | 限制Cookie的路径访问。例如 /path/ 仅允许该路径下的页面访问;/ 表示全站可访问。 |
Size | Cookie的大小(字节)。 |
HTTP | 若为true ,则仅通过HTTP头传输,禁止JavaScript(如document.cookie )访问,增强安全性(防XSS攻击)。 |
Secure | 若为true ,仅通过HTTPS/SSL等安全协议传输,防止明文泄露。默认为false 。 |
1.3.分类
- 会话cookie
- 持久cookie
- 会话cookie指存在浏览器内存的cookie,当浏览器关闭,会话cookie会失效。
- 持久cookie是保存在硬盘上的cookie
- 这两种cookie的分配标准主要是通过maxAge或者expires这个cookie字段
2.session
(议会等的)会议,会期;
Session(会话)是服务端用来跟踪用户状态的机制。核心原理是:
- 服务器为每个用户创建唯一的Session ID(通常通过Cookie传递),并将用户数据(如登录信息、购物车)存储在服务端(内存、数据库或缓存中)。
- 客户端仅持有Session ID,实际数据不暴露,安全性更高。
维度 | Cookie | Session |
---|---|---|
存储位置 | 客户端 | 服务端 |
安全性 | 较低(需额外防护) | 较高(依赖Session ID安全) |
生命周期 | 可长期或会话级 | 通常会话级 |
性能影响 | 增加网络负载 | 增加服务器负载 |
典型应用 | 用户偏好、跟踪 | 登录状态、敏感操作 |
联系:当客户端发送一个cookie,服务器会从这个cookie中找到sessionID,再查找出相应的session信息返回给客户端,来进行用户页面的流转。如果通过sessionID来查找session的时候,发现没有session(一般第一次登陆或者清空了浏览器),那么就会创建一个session。
3.使用cookie登录微博
获取cookie:在控制台输入:
document.cookie
然后把获取到的cookie复制到代码中:
import urllibimport requestsurl = 'https://weibo.com/u/6320270401'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) QQBrowser/11.8.5118.400','cookie':'你的cookie'
}
# 请求对象的定制# request = requests.get(url, headers=headers)
# 请求对象的定制
request = urllib.request.Request(url=url, headers=headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 获取响应数据
content = response.read().decode("gb2312")
# 打印响应数据
print(content)
# 下载到本地
运行网页直接打开界面:
可以看到,得到的是个人信息页面,但内容并不完整,可以说是完全没有实际的内容,可能微博这几年不断更新,优化了反爬手段,只添加Cookie还不足以成功爬取个人页面的完整内容。不过,能到这一步就可以了。这里主要讲解Cookie的作用。
打开该页面,只呈现出页面框架,没有具体信息,并且显示不安全。
4.使用session登录
import requests
from urllib.parse import urljoinBASE_URL = 'https://login2.scrape.center/'
LOGIN_URL= urljoin(BASE_URL, '/login')
INDEX_URL = urljoin(BASE_URL, '/page/1')
USERNAME = 'admin'
PASSWORD = 'admin'session = requests.Session()response_login = session.post(LOGIN_URL, data={'username': USERNAME, 'password':PASSWORD})cookies = session.cookies
print('Cookies', cookies)response_index = session.get(INDEX_URL)
print('Response Status', response_index.status_code)
print('Response URL', response_index.url)
import requestsbase_url = 'http://www.renren.com/PLogin.do'
headers= {'Host': 'www.renren.com','Referer': 'http://safe.renren.com/security/account',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
}
data = {'email':邮箱,'password':密码,
}
#创建一个session对象
se = requests.session()
#用session对象来发送post请求进行登录。
se.post(base_url,headers=headers,data=data)
response = se.get('http://www.renren.com/971682585')if '死性不改' in response.text:print('登录成功!')
else:print(response.text)print('登录失败!')