requests中的会话

611 阅读4分钟

之前的例子中,我们都是单独调用接口或解析响应,但在实际应用场景中,我们往往会需要连续调用一些接口。 比如:

  1. 先登录
  2. 再做一些操作
  3. 最后登出 就像我们在浏览器中对网页做操作一样,requests也可以模拟这些操作的步骤。

在开始之前,我们简单了解下浏览器是怎样做到这些事情的,为什么我们在浏览器里登录了某个网站之后,这个网站就知道我们后续的操作都是在这个刚刚登录的账号里做的呢?

Cookies和Session

这里有两个概念,一个是cookies,一个是session。

Cookie 或者Cookies是Web服务器保存在用户浏览器上的小文本文件。它可以包含有关用户的信息,比如用户名、甚至加密后的密码之类的信息。这样,当我们再次使用这个浏览器访问这个服务器时,服务器可以直接读取这些信息,而无需用户再次输入。

Session,称为会话,用户通常会在服务器提供的网页之间进行跳转来访问不同的页面,服务器对一个用户创建一个Session对象,存放在服务器端,这样服务器就知道这个用户是谁了。session里也可以存放用户名等信息。

Session一般是会过期自动终止的,毕竞服务器端资源有限,一段时间不操作,很多网站就会自动删除你的session,这时你再做操作,网站会提示你重新登录。而有些网站在提示你重新登录时,页面上还会显示“欢迎,某某某”这样的字样,因为这后面的用户名它很可能是存在了你的浏览器cookies里,所以你重新操作时,网页还是知道你的用户名,毕竟cookies是不会自动被删除的,顺带一提,cookies 是保存在客户端,所以我们是可以设置要不要保存 cookies的,很多网站都设置了如果不保存 cookies 将提示你无法使用该网站。

requests中的cookies

在requests中,响应和请求里都有 cookies功能。 如果某个响应中包含一些cookie,你可以快速访问它们(以下例子可以在交互模式中运行):

import requests url='www.baidu.com' r=requests.get(url) vars(r.cookies)

这样就可以看到该网站返回的cookie,而 vars(r.cookies)会把这个cookie转换成dict数据类型。 要想发送你的cookies到服务器,可以使用 cookies参数(以下网站的服务端会读取用户请求发过去的cookie,并返回在响应体的文本中。):

url='httpbin.org/cookies' cookies=dict(cookies are='working) r=requests.get(url,cookies=cookies) r.text '{"cookies":{"cookies are:"working"}} Cookie的返回对象为

RequestsCookieJar,它的行为和字典类似,但接口更为完整,适合跨域名跨路径使用。你还可以把Cookie Jar 传到Requests中:

jar=requests.cookies.RequestsCookieJar) jar.set(tasty cookie','yum',domain='httpbin.org',path='/cookies') jar.set(gross cookie','blech',domain='httpbin.org',path='/elsewhere") url='httpbin.org/cookies' r=requests.get(url,cookies=jar) r.text {"cookies":{"tasty cookie":"yum}}'

注意这里打出来的cookie只有第一次set进去的。因为这次访问的url和第一次set进去的path匹配。这个例子说明同一个RequestsCookieJar里可以同时存放跨域名跨路径的cookie,服务端可以取出来判断哪个cookie值生效。

requests中的会话

在requests中,也有会话的概念,这里只是借用了session这个名词,但其实,和服务器端的session并不同。reqeusts是横拟客户端的工具,显然不可能用它来横拟服务端的会话。但是,我们也不想像上面的 cookies例子一样,去手动在一系列请求和响应之间传递 cookies。 requests的 session 就帮助我们把这变成了自动的。 例1.requests中会话的例子

import requests s=requests.Session0
s.get("http://httpbin.org/cookies/set/sessioncookie/123456789)
r=s.get("http:/httpbin.org/cookies")
print(r.text)

这个例子中:

第二行创建了一个reqeusts会话,第三行使用get访问了一个网址,这个get 请求使服务端创建了一个服务端的session对象,并且这个网址的作用是把服务端的 session内容返回哈用户。(见任务1的第一小题)第四行用户get了另一个网址,服务器返回了一个"sessioncookie”:“123456789”的json数据。这个数据恰恰是第三行的返回值,这说明服务端正确地记住了我们。

任务1.我们来做一个小练习加深一下印象。

  1. 打断点观察例1中的第三行给出的响应内容。(你可以在第三行前加一个r=然后断点观察r的值)
  2. 去掉例1中的第三行,观察运行例1的结果变化。
  3. 利用这个会话功能,我们可以做很多事情。比如,用requests登录一个网站,在网站上做一些操作,抓取一些数据,然后登出。可以说我们以前用selenium之类图形化自动化库做的事情,大多数都可以通过接口来做啦。