当前位置: 首页 > web >正文

【Python爬虫基础篇】--3.cookie和session

目录

1.cookie

1.1.定义

1.2.参数

1.3.分类

2.session

3.使用cookie登录微博

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.参数

参数

字段作用
NameCookie的名称,创建后不可更改。
ValueCookie的值。Unicode字符需编码,二进制数据需BASE64编码。
Domain可访问该Cookie的域名(如 .zhihu.com 允许所有子域名访问)。若未指定,默认为当前域名。
MaxAge失效时间(秒)。正数表示存活时间;负数表示浏览器关闭后失效;0表示立即删除。与Expires配合使用(优先级高于Expires)。
Path限制Cookie的路径访问。例如 /path/ 仅允许该路径下的页面访问;/ 表示全站可访问。
SizeCookie的大小(字节)。
HTTP若为true,则仅通过HTTP头传输,禁止JavaScript(如document.cookie )访问,增强安全性(防XSS攻击)。
Secure若为true,仅通过HTTPS/SSL等安全协议传输,防止明文泄露。默认为false

1.3.分类

  1. 会话cookie
  2. 持久cookie
  • 会话cookie指存在浏览器内存的cookie,当浏览器关闭,会话cookie会失效。
  • 持久cookie是保存在硬盘上的cookie
  • 这两种cookie的分配标准主要是通过maxAge或者expires这个cookie字段

2.session

(议会等的)会议,会期;

Session(会话)是服务端用来跟踪用户状态的机制。核心原理是:

  • 服务器为每个用户创建唯一的Session ID(通常通过Cookie传递),并将用户数据(如登录信息、购物车)存储在服务端(内存、数据库或缓存中)。
  • 客户端仅持有Session ID,实际数据不暴露,安全性更高。
维度CookieSession
存储位置客户端服务端
安全性较低(需额外防护)较高(依赖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('登录失败!')

http://www.xdnf.cn/news/1117.html

相关文章:

  • Office文档图片批量提取工具
  • 异构网络环境下的切换策略研究
  • 边缘计算全透视:架构、应用与未来图景
  • 基于Java+MySQL实现(Web)企业仓库存储管理系统
  • 金融数据分析(Python)个人学习笔记(12):网络爬虫
  • 【产品经理从0到1】用户研究和需求分析
  • 从项目真实场景中理解二分算法的细节(附图解和模板)
  • nodejs使用require导入npm包,开发依赖和生产依赖 ,全局安装
  • 【HTML】【Web开发】滑动条挑战
  • 使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解,包含代码示例和注释,最后以表格总结关键配置
  • Embedding与向量数据库__0422
  • 实验一-密码学数学基础
  • ​SYSTEM WAKE-UP(系统唤醒)​和外部中断唤醒(EXTI唤醒)
  • 建筑末端配电回路用电安全解决方案
  • 【数据结构 · 初阶】- 堆的实现
  • 抱佛脚之学SSM四
  • Redis—为何持久化使用子进程
  • 【Hive入门】Hive架构与组件深度解析:从核心组件到生态协同
  • Go语言中 defer 使用场景及深度注意事项指南
  • JavaFX实战:从零打造一个功能丰富的“猜数字”游戏
  • 23种设计模式-结构型模式之桥接模式(Java版本)
  • 单个或批量实现-提取PDF文档中的合同号和姓名并按“合同号_姓名”格式重命名文件。
  • SpringClound 微服务分布式Nacos学习笔记
  • 最新整理AI开源大模型介绍
  • vue3:十一、主页面布局(修改左侧导航条的样式)
  • C++继承(最详细)
  • SAP获利分析KEA0-值字段无法被分配,原因既然是。。
  • Linux常用命令
  • [创业之路-381]:企业法务 - 企业经营者,有哪些生产安全风险,哪些人承担责任?承担哪些责任?如何防范?
  • Java从入门到“放弃”(精通)之旅——抽象类和接口⑨