pytest--python的一种测试框架--request请求加入headers

本文探讨了Cookie和Session在保持客户端与服务器状态中的作用、区别,以及如何在requests库的get请求中通过设置User-Agent等headers来解决JSONDecodeError,特别是在处理DoubanAPI请求时遇到的反爬问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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())

在这里插入图片描述

可以看到接口返回正确,接口请求成功

我们知道,在做接口请求的时候如果发生异常状态码返回那么就需要去关注其失败的原因应该如何解决。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淅淅同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值