可能大家对session已经比较熟悉了,也大概了解了session的机制和原理,但是我们在做爬虫时如何会运用到session呢,就是接下来要讲到的会话保持。

首先说一下,为什么要进行会话保持的操作?

session定义

requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象请求该网站的其他网页都会默认使用该session之前使用的cookie等参数。

尤其是在保持登陆状态时运用的最多,在某些网站抓取,或者app抓取时,有时强制登陆,有的是不登陆返回的数据就是假的或者说是不完整的数据,那我们不可能去做到每一次请求都要去登陆一下怎么办,就需要用到保持会话的功能了,我们可以只登陆一次,然后保持这种状态去做其他的或者更多的请求。

其次,我们该如何使用会话保持?举一个事例来说明一下:

session使用实例

http协议本身是无状态的,为了让请求之间保持状态,有了session和cookie机制。requests也提供了相应的方法去操纵它们。

requests中的session对象能够让我们跨http请求保持某些参数,即让同一个session对象发送的请求头携带某个指定的参数。当然,最常见的应用是它可以让cookie保持在后续的一串请求中。

下面,通过官方文档中的示例来了解如何使用它。

import requests
s = requests.session()
# 第一步:发送一个请求,用于设置请求中的cookies
r1 = s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
print(r1.text)
# 第二步:再发送一个请求,用于查看当前请求中的cookies
r2 = s.get("http://httpbin.org/cookies")
print(r2.text)

运行结果

{"cookies": {"sessioncookie": "123456789"}
}{"cookies": {"sessioncookie": "123456789"}
}

从结果中我们可以看出,第二次请求已经携带上了第一次请求所设置的cookie,即通过session达到了保持cookie的目的。示例中创建了一个requests.Session()对象,通过该对象来进行http请求操作,该操作基本类似于requests.request()

由于session让请求之间具有了连贯性,那么,就有了跨请求参数和非跨请求参数的区别。即有时我想让所有请求均带有某个参数,而有时我只是想让单独的一条请求带上临时的参数。通过下面的例子来了解如何使用。

import requests
s = requests.Session()
s.headers.update({'x-test': 'true'})
# both 'x-test' and 'x-test2' are sent
r1 = s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
print(r1.text)
# 'x-test' is sent
r2 = s.get('http://httpbin.org/headers')
print(r2.text)

运行结果

# r1.text
{"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.22.0", "X-Amzn-Trace-Id": "Root=1-5e91656f-b99f14a4d6f47f9e55a90bb4", "X-Test": "true", "X-Test2": "true"}
}
# r2.text
{"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.22.0", "X-Amzn-Trace-Id": "Root=1-5e91656f-e9741db4c2ca2fd6e0628396", "X-Test": "true"}
}

从结果中我们可以得出两条结论:

session可以为请求方法提供缺省数据,比如第一次请求中的{‘x-test’: ‘true’}就是缺省数据,此时的缺省数据就是跨请求参数。
方法级别的参数不会被跨请求保持,比如第二次请求时,没有携带headers={‘x-test2’: ‘true’},返回的结果中也没有{‘x-test2’: ‘true’},说明该参数没有在第一次请求后被保持住。

另外说一点单独处理cookie字段,处理为字典格式

# 处理cookie内容为字典
cookie = "SINAGLOBAL=821034395211.0111.1522571861723; wb_cmtLike_1850586643=1; un=tyz950829@sina.com; wb_timefeed_1850586643=1; UOR=,,login.sina.com.cn; wvr=6; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWsNeq71O_sXkkXNnXFHgOW5JpX5KMhUgL.Fo2RSK5f1hqcShe2dJLoI0qLxK-L12qLB-zLxKqL1hnL1K2LxK-LBo5L12qLxKqL1hML1KzLxKnL1K.LB-zLxK-L1K-LBKqt; YF-V5-G0=c99031715427fe982b79bf287ae448f6; ALF=1556795806; SSOLoginState=1525259808; SCF=AqTMLFzIuDI5ZEtJyAEXb31pv1hhUdGUCp2GoKYvOW0LQTInAItM-ENbxHRAnnRUIq_MR9afV8hMc7c-yVn2jI0.; SUB=_2A2537e5wDeRhGedG7lIU-CjKzz-IHXVUm1i4rDV8PUNbmtBeLVrskW9NUT1fPIUQGDKLrepaNzTEZxZHOstjoLOu; SUHB=0IIUWsCH8go6vb; _s_tentry=-; Apache=921830614666.5322.1525261512883; ULV=1525261512916:139:10:27:921830614666.5322.1525261512883:1525239937212; YF-Page-G0=b5853766541bcc934acef7f6116c26d1"
cookie_dict = {i.split("=")[0]: i.split("=")[1] for i in cookie.split("; ")}

参考文献

  • https://cloud.tencent.com/developer/article/1739949
  • https://blog.csdn.net/weixin_42575020/article/details/95179840

requests.session()的用法相关推荐

  1. python爬虫---requests库的用法

    requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多 因为是第三方库,所以使用前需要cmd安装 pip install requests 安装完成后import一下 ...

  2. Python爬虫利器一Requests库的用法

    之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助.入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取.那么这一节来简单介 ...

  3. Python 的 requests 库的用法

    Python爬虫利器一之Requests库的用法:http://cuiqingcai.com/2556.html Python利用Requests库写爬虫(一):http://www.jianshu. ...

  4. Python爬虫之(六)requests库的用法

    介绍 对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助.入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取.那么这一节来简单介绍一下 requests 库的基本用法 安装 pip i ...

  5. Python requests模块高级用法

    2019独角兽企业重金招聘Python工程师标准>>> 快速入门的话可以参考这篇文章,但是进阶的话还是建议参考官方的文档,毕竟官方的文档更新比较及时,也有些高级用法,猛戳这里! 会话 ...

  6. Python Requests库进阶用法——timeouts, retries, hooks

    Python HTTP 请求库在所有编程语言中是比较实用的程序.它简单.直观且在 Python 社区中无处不在. 大多数与 HTTP 接口程序使用标准库中的request或 urllib3. 由于简单 ...

  7. Session,ViewState用法

    Session,ViewState用法 基本理论: session值是保存在服务器内存上,那么,可以肯定,大量的使用session将导致服务器负担加重. 而viewstate由于只是将数据存入到页面隐 ...

  8. 爬虫之利用requests.session进行状态保持

    requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的. 1.1 requests.session的作用以及应用场景 requests.s ...

  9. python中requests.session的妙用

    在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息. 1.requests库的session对象能够帮我们跨请求保持某些参数,也会在 ...

  10. python中requests库的用途-python中requests.session的妙用

    在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息. 1.requests库的session对象能够帮我们跨请求保持某些参数,也会在 ...

最新文章

  1. Boost filesystem学习笔记
  2. python中的1怎么用的_python中的[:-1]和[::-1]的具体使用
  3. python【数据结构与算法】倍增思想
  4. echarts词云图形状_用Wordcloud生成指定形状的词云图
  5. NokiaJ2ME开发者套件4.0 J2ME 开发
  6. 谷歌guava_Google Guava –期货
  7. JSON为什么那样红(另有洞天)
  8. 敲了几年代码,是时候考虑以后的发展了
  9. 外星人做系统logo_深圳福田外星人笔记本电脑维修服网点
  10. 分层贝叶斯模型——结构
  11. centOS6.6虚拟机启动后登陆界面无法显示
  12. 机器学习之监督学习(四)——贝叶斯分类器
  13. Fizz Gateway API in Java
  14. Mysql统计同一字段不同值的个数
  15. paip.提升用户体验---c++ qt 取消gcc编译的警告信息.txt
  16. 简单async数据分批处理
  17. DM manager工具使用
  18. 【C语言】二维数组指针,字符数组指针输出程序实例(注释详细)
  19. ROS2 中的 launch 文件入门的 6 个疑问
  20. Unity3d:UGUI,UI与特效粒子层级,2018.2以上版本BakeMesh,粒子在两个Image之间且在ScrollView

热门文章

  1. 修改Postman安装路径
  2. 系统集成项目管理工程师通过率高吗?
  3. Testbed软件下载安装使用试用
  4. CNN实现手写数字识别
  5. 开源规则引擎Drools、URule简介
  6. cocos之Gif图
  7. 快速从入门到精通!黑马java课程大纲
  8. MikroTik RB750r2/RB750gr3 操作记录
  9. python爬虫爬取微信公众号的阅读数、喜爱数、文章标题和链接等信息
  10. [JSMind]使用JSMind操作生成的思维导图