python requests模块session的使用建议及整个会话中的所有cookie的方法

话不多说,直接上代码

测试代码

服务端

下面是用flask做的一个服务端,用来设置cookie以及打印请求时的请求头

# -*- coding: utf-8 -*-
from flask import Flask, make_response, request

app = Flask(__name__)

@app.route('/a1')
def a1():
    print(request.headers)
    rp = make_response()
    rp.set_cookie('a1', '123')
    return rp

@app.route('/a2')
def a2():
    print(request.headers)
    rp = make_response()
    # rp.set_cookie('a2', '234')
    return rp

@app.route('/a3')
def a3():
    print(request.headers)
    rp = make_response()
    rp.set_cookie('a3', '345')
    return rp

if __name__ == '__main__':
    app.run(host='0.0.0.0')

客户端

# -*- coding: utf-8 -*-

import requests

url1 = 'http://192.168.2.159:5000/a1'
url2 = 'http://192.168.2.159:5000/a2'
url3 = 'http://192.168.2.159:5000/a3'

cookies = requests.utils.cookiejar_from_dict({'test': 'test'})
print(type(cookies), cookies)  # RequestsCookieJar 对象
s = requests.session()
s.cookies = cookies    # 这里设置的cookie test=test 是所有请求中都会附带的
s.headers = {'h1':'h1'} #  这里设置的请求头h1=h1是所有请求中都会附带的
r1 = s.get(url1, cookies={'r1': 'r1'},headers={'h2':'h2'})  # 临时加上cookie r1=r1 和 header h2=h2 下一个请求中不会有此 cookie  和header
r2 = s.get(url2)
requests.utils.add_dict_to_cookiejar(s.cookies, {'xx': 'xx'})  # 在接下来的请求中,永久添加xx cookie

r3 = s.get(url3)

# r1.cookies 是一个RequestsCookieJar对象,可以使用  requests.utils.dict_from_cookiejar(r1.cookies) 将其转换成dict
# 我发现可以直接用dict进行转换,这样写起来更方便
print(dict(r1.cookies))  # 打印r1请求的返回结果中设置的cookies
print(dict(r2.cookies))  # 打印r2请求的返回结果中设置的cookies
print(dict(r3.cookies))  # 打印r3请求的返回结果中设置的cookies

print(dict(s.cookies))  # s.cookies中包含整个会话请求中的所有cookie(临时添加的如上面的r1不包含在内)

先启动服务端,再启动客户端

运行结果

服务端打印结果

192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a1 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
H2: h2
Cookie: test=test; r1=r1

192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a2 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
Cookie: test=test; a1=123

192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a3 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
Cookie: test=test; xx=xx; a1=123

客户端打印结果

<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie test=test for />]>
{'a1': '123'}
{}
{'a3': '345'}
{'test': 'test', 'xx': 'xx', 'a1': '123', 'a3': '345'}

总结及使用建议

  • 通过服务端打印可以看出,如果我们不设置User-Agent, requests模块的请求头是python-requests/2.21.0,这不是正常浏览器的请求头,这也是为什么我们做爬虫时一定要修改请求头的一个原因
  • 使用requests.session()可以帮助我们保存这个会话过程中的所有cookie,可以省去我们自己获取上一个请求的cookie,然后更新cookie后重新设置再进行请求这类操作
  • 通过s.cookies 和s.headers设置的整个会话中都会携带的cookie和header
  • 通过s.get(url1, cookies={‘r1‘: ‘r1‘},headers={‘h2‘:‘h2‘}) 这种形式设置的cookie和header 不会覆盖s.cookies和s.headers中设置的请求头和cookie,只是在此次请求中添加此cookie和header,下个请求中不会携带这里的r1和h2
  • requests.utils.add_dict_to_cookiejar(s.cookies, {‘xx‘: ‘xx‘}) 可以给s设置固定cookie: xx ,这种设置的cookie 不是临时的,后面的请求中都会携带
  • r1.cookies 的结果是RequestsCookieJar对象,可以通过dict对其转换,得到一个dict,其内容是r1请求响应头中设置的cookie,如果当前请求没有被设置新cookie,则dict后的是一个空字典
  • s.cookies 的结果是整个会话过程(通过s发送的所有请求的过程)被设置的cookie,所有通过dict(s.cookies) 可以得到所有被设置cookie
  • 建议我们再使用的过程中,把公共部分提前设置好,比如headers,cookies,proxies

原文地址:https://www.cnblogs.com/huchong/p/11091307.html

时间: 2024-11-10 12:40:29

python requests模块session的使用建议及整个会话中的所有cookie的方法的相关文章

python requests模块详解

requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: python的标准库urllib2提供了大部分需要的HTTP功能,但是API太逆天了,一个简单的功能就需要一大堆代码. 我也看了下requests的文档,确实很简单,适合我这种懒人.下面就是一些简单指南. 插播个好消息!刚看到requests有了中文翻译版,建议英文不好的看看,内容也比我的博客好多了,具体链接是:http://cn

java实现类似python requests的session功能

怎么在java中实现类似于python的requests模块的session功能呢.java也是可以实现的,用java的okhttp包可以实现. 在pom.xml中加入相关依赖 <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>

Python requests模块学习笔记

1.Requests模块说明 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. 在Python的世界里,事情不应该这么麻烦. Requests 使用的是 urllib3,因此继承了它的所有特性.Request

Python Requests模块讲解4

高级用法 会话对象 请求与响应对象 Prepared Requests SSL证书验证 响应体内容工作流 保持活动状态(持久连接) 流式上传 块编码请求 POST Multiple Multipart-Encoded Files 事件挂钩 自定义身份验证 流式请求 代理 合规性 编码方式 HTTP动词 响应头链接字段 Transport Adapters Example: Specific SSL Version Blocking Or Non-Blocking? Timeouts CA Cer

Python requests模块学习

import requests 下面就可以使用神奇的requests模块了! 1.向网页发送数据 >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('http://httpbin.org/get', params=payload) >>> print(r.url) http://httpbin.org/get?key1=value1&a

python:requests模块

requests模块是我在学习爬虫时学到的一个模块,它的api比较简单好用,这里简介下使用方法. 其实这个很好使用,几行代码就可以获取一个网页的内容: import requests url = 'http://www.juzimi.com/ju/252304' response = requests.get(url) print (response.text) 它支持很多http请求类型:get,post,put,delete,head,options 其中获取的响应内容有2中显示方法 .co

python requests 模块初探

现在经常需要在网页中获取相关内容. 其中无非获取网页返回状态,以及查看网页获取的内容几个方面,那么在这方面来看requests可能比urllib2库更简便一些. 比如:先用方法获取网页 r = requests.get("http://www.baidu.com") #查看返回码 r.status_code #查看获取的网页内容 r.text #如果网页返回的是一个json串,也可以比较方便获取 kk = r.json() print kk #查看网页的编码格式 r.encoding

python requests 模块

requests 是第三方 python 库,用于处理 url 资源 requests 项目官网:http://www.python-requests.org/en/master/ 安装方式:pip install requests 如果遇到权限问题,使用管理员账户运行 cmd 原文地址:https://www.cnblogs.com/0820LL/p/10333797.html

python Requests模块的使用简介

Requests的安装: pip install Requests Requests的使用: import requests url = "http://www.mzitu.com" response = requests.get(url) # 获得请求 response.encoding = "utf-8" # 改变其编码 html = response.text # 获得网页内容 binary__content = response.content # 获得二进