一、request headers中的cookie和session机制的作用与区别
Cookie 和 Session 是两种在客户端和服务器之间保持状态的技术。HTTP 协议本身是无状态的,这意味着服务器无法从上一次的请求中保留任何信息到下一次请求。Cookie 和 Session 机制就是为了解决这个问题。
Cookie:
1、Cookie 是服务器发送到用户浏览器并保存在浏览器上的一块信息,后续请求浏览器会自动带上这个 Cookie 信息,通过这种方式可以实现保持用户的状态。
2、Cookie 数据始终在同源的 http 请求中携带(即使不需要),即使保存在浏览器也会过期,不过过期时间可以自定义。
3、Cookie 数据还有路径(path)的概念,可以限制 Cookie 只属于某个路径下。
4、Cookie 的大小有限制,一般不超过 4KB。
Session:
1、Session 是另一种记录客户状态的机制,不同的是 Session 是保存在服务器端的。用户浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录在服务器上。这就可以提供跨请求的状态维护。
当浏览器请求服务器,如果需要记录业务信息(比如用户的登录状态),服务器会在响应头中写入一个 Session ID,浏览器在下次请求时会带上这个 Session ID,服务器通过这个 Session ID 就能找到这个用户的会话信息。
2、Session 的存储方式可以有多种,常见的有:内存、数据库、Redis 等。
3、Session 的存储容量基本上是没有限制的,取决于你的存储方式。
区别:
1、Cookie 数据存放在客户的浏览器上,Session 数据放在服务器上。
2、Cookie 不是很安全,别人可以分析存放在本地的 Cookie 并进行 Cookie 欺骗,考虑到安全应当使用 Session。
3、Session 会在一定时间内保存在服务器上。当访问增多,会比较占用服务器性能,考虑到减轻服务器性能方面,应当使用 Cookie。
4、单个 Cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 Cookie。
5、可以考虑将登陆信息等重要信息存放为 Session,其他信息如果需要保持可以放在 Cookie 中。
6、Session 的实现依赖于 Cookie 机制,因为 Session ID 是保存在 Cookie 中的。如果浏览器禁用了 Cookie,那么 Session 也会失效(除非你将 Session ID 通过 URL 参数传递)。
二、request请求加入headers
import requests
url='https://movie.douban.com/j/search_subjects'
params={"type":"movie","tag":"热门",#%E7%83%AD%E9%97%A8"page_limit":50,"page_start":0
}
r=requests.get(url=url,params=params)
print(r.status_code)
print(r.json())
这个时候发现报错:418,requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
这是因为:
这个接口并没有返回数据,由于json返回内容为空,故而报错。**418其实是对一个反爬程序的状态码的返回值。**也就是说在我们进行基础调用的时候,由于豆瓣无法识别我们的身份故而被反扒了。
怎么去解决呢?
解决方法是在请求中加入请求头。
三、在请求中加入请求头
import requests
url='https://movie.douban.com/j/search_subjects'
params={"type":"movie","tag":"热门",#%E7%83%AD%E9%97%A8"page_limit":50,"page_start":0
}
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"
}
r=requests.get(url=url,params=params,headers=headers)
print(r.status_code)
print(r.json())
可以看到接口返回正确,接口请求成功
我们知道,在做接口请求的时候如果发生异常状态码返回那么就需要去关注其失败的原因应该如何解决。