前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >requests库之Cookie

requests库之Cookie

作者头像
胡齐
发布2020-01-02 15:47:51
1.9K0
发布2020-01-02 15:47:51
举报
文章被收录于专栏:运维猫运维猫

1、简介

Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库。它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。

一句话---Python实现的简单易用的HTTP库。

2、基本用法

代码语言:javascript
复制
 [root@elasticsearch-01 ~]# pip3 install requests
 #各种请求方式:常用的就是requests.get()和requests.post()
 >>> import requests
 >>> r =requests.get('https://api.github.com/events')
 >>> r =requests.post('http://httpbin.org/post', data ={'key':'value'})
 >>> r =requests.put('http://httpbin.org/put', data ={'key':'value'})
 >>> r =requests.delete('http://httpbin.org/delete')
 >>> r =requests.head('http://httpbin.org/get')
 >>> r =requests.options('http://httpbin.org/get')

3、GET 请求

首先,构建一个最简单的GET请求,请求的链接为http://httpbin.org/get,该网站会判断如果客户端发起的是GET 请求的话,他返回相应的请求信息:

代码语言:javascript
复制
 importrequests
 r= requests.get('http://httpbin.org/get')
 print(r.text)

4、带参数GET请求

我们成功发起了GET请求,返回结果中包含请求头,URL,IP等信息。那么,对于GET 请求,如果要附加额外的信息,一般怎么添加呢?在URL后面拼接,用一个?来分割一下,参数传过来然后用&的符号来进行分割,比如现在想添加两个参数,其中name是germery,age是22.哟构造这个请求链接,是不是可以直接写成:

代码语言:javascript
复制
 r= requests.get('http://httpbin.org/get?name=germery&age=22')

这样也可以,但是一般情况下,这种信息数据会用字典来存储。那么怎么构造这个链接呢?---->利用params这个参数就好了,示例如下:

代码语言:javascript
复制
 importrequests
 data= {
    'name':'germary',
    'age':22
 }
 r= requests.get('http://httpbin.org/get',params=data)
 print(r.text)

通过运行结果可以判断,请求的链接自动被构成了:http://httpbin.org/get?name=germery&age=22

5、使用超时参数

平时在浏览器里面访问页面的时候经常会出现 “正在加载中…” 或者 一个小圆圈不停的转 这样的情况,这种情况可能是由于网络波动引起的。那么在程序里面会不会出现这种情况呢?肯定是会的。如果出现这种情况程序就会卡死在这里,直到网络稳定之后才会继续执行。那有没有什么解决方法呢?有的,就是使用timeout参数,比如:

代码语言:javascript
复制
 importrequests
 url= "http://www.baidu.com"
 response= requests.get(url,timeout=0.01)
 print(response.content.decode())

主要注意这一句:

代码语言:javascript
复制
 response= requests.get(url,timeout=0.01)

这句话的意思是:如果在0.01s之内可以得到响应就没事,如果得不到响应就报错。如下图:

另外也可以利用retry模块进行多次请求,如果全部都失败才报错。当然使用retry库之前也需要先安装。

代码语言:javascript
复制
 importrequests
 
 fromretryingimportretry
 
 # 这里的headers使用的是手机版的
 m_headers= {
    "User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
 }
 
 @retry(stop_max_attempt_number= 10)  #让被装饰的函数反复执行10次,10次全部报错才会报错, 中间有一次正常就继续往下走
 defparse_url1(url):
    response= requests.get(url, headers=m_headers, timeout=5)
    returnresponse.content.decode()
 
 # 真正的url请求函数
 defparse_url(url):
    try:
        html_str= parse_url1(url)
    except:
        html_str= None
    returnhtml_str
 
 if__name__== '__main__': 
    url= "http://www.baidu.com"
    print(parse_url(url))

6、啥是cookie

当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie,它是Internet站点创建的,为了辨别用户身份而储存在用户本地终端上的数据,cookie大部分都是加密的,cookie存在于缓存中或者硬盘中,在硬盘中的是一些文本文件,当你访问该网站时,就会读取对应的网站的cookie信息,cookie有效地提升了用户体验,一般来说,一旦将cookie保存在计算机上,则只有创建该cookie的网站才能读取它。

简单说cookie就是客户端向服务器端保持状态的,它可以辨别用户的身份,大部分是加密的。我们可以用的就是模拟登陆,在需要输入登陆账号和密码的网站就可以利用Cookie来获取数据,比如csdn

7、三种Cookie请求方式

1.第一种:cookie放在headers中

这里以请求我自己的运维猫文章为例:

首先找到登陆之后的Cookie和User-Agent,然后将User-Agent和Cookie复制到程序里面,如下:

代码语言:javascript
复制
 importrequests
 importio
 importsys
 reload(sys)
 sys.setdefaultencoding('utf8')
 
 url= "https://mp.weixin.qq.com/s?__biz=Mzg4OTIzNjM1Mw==&mid=2247485333&idx=1&sn=9ad3596e2dc36d7e4c87abd4c4124319&chksm=cfefb97bf898306df970d97e378d780c5d8e61bebf8bf3fba071b30ab91473864302c6e8ca98&token=955768272&lang=zh_CN#rd"
 
 headers= {"User_Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
    "Cookie": "这个还是算了吧,用你们自己的文章试 ^-^ "
 }
 response= requests.get(url, headers= headers)
 withio.open("ywm.html", "w",encoding="utf-8") asf:
    f.write(response.content.decode())

这样就将这个页面的数据返回到了csdn.html这个文件里面,打开看一下,如下图:

和我自己的博客主页是一样的,而且超链接都保留了。

2.第二种:cookie字典传给cookies参数

这里以请求人人网为例:

找到对应的cookie和User-Agent,如下:

代码语言:javascript
复制
 importrequests
 importio
 importsys
 reload(sys)
 sys.setdefaultencoding('utf8')
 
 url= "https://mp.weixin.qq.com/s?__biz=Mzg4OTIzNjM1Mw==&mid=2247485333&idx=1&sn=9ad3596e2dc36d7e4c87abd4c4124319&chksm=cfefb97bf898306df970d97e378d780c5d8e61bebf8bf3fba071b30ab91473864302c6e8ca98&token=955768272&lang=zh_CN#rd"
 headers= {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
 }
 
 # 不带上Cookie就访问不了这个页面
 cookie= "anonymid=jk63khrk-y97r4p; _r01_=1; ln_uact=mr_mao_hacker@163.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn421/20180720/1740/main_JAWQ_0aa000000ceb195a.jpg; _ga=GA1.2.273332130.1532825428; depovince=HUN; JSESSIONID=abcE5k0CiAJDc9ESVEcuw; ick_login=026ba348-e4e9-4871-9ce3-5868b95cfdd3; first_login_flag=1; loginfrom=syshome; wp_fold=0; BAIDU_SSP_lcr=https://www.baidu.com/link?url=VRx_HKUd53I5rYWZHvrQ9VVLotqST6-jtaZDlscFYCO&wd=&eqid=e957aec400037928000000065b64fcab; ick=64518f30-9a22-47df-b3c3-4114f185c3c6; t=8fcf47068763c279eea2620b51b7a3311; societyguester=8fcf47068763c279eea2620b51b7a3311; id=967272361; xnsid=fd736c63; jebecookies=3f9a3853-3371-4857-8268-308d663ca146|||||; jebe_key=19041c4e-4d38-4dc1-bfb9-124b81afae61%7C33b1d8f602cf6dd5a9834fe6f2bf97f2%7C1533346094265%7C1%7C1533346099750"
 # 将上面哪个cookie转化成字典类型
 cookie_dict= {i.split("=")[0]:i.split("=")[-1] foriincookie.split("; ")}
 response= requests.get(url, headers= headers, cookies= cookie_dict)
 
 withio.open("ywm.html", "w",encoding="utf-8") asf:
    f.write(response.content.decode())
3.第三种:先发送post请求,获取cookie,带上cookie请求登陆之后的页面

这里要用到一个seesion类,seesion 实例具有的方法和requests一样,但是 seesion具有保持功能, 就类似浏览器输入一次密码之后,会自动保留cookie

seesion = requests.seesion()seesion.post(url, data, headers) # 服务器设置在本地的cookie会保存在本地seesion.get(url) # 会带上之前保存在seesion中的cookie,能够请求成功这种方法要先提交自己的账号密码,并且要找到提交的地址。那么如何找到提交地址呢?

通过找form表单的action属性 (这里以人人网为例),如下:

代码语言:javascript
复制
 import requests
 import io
 import sys
 reload(sys)
 sys.setdefaultencoding('utf8')
 
 headers ={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"}
 
 seesion =requests.session()
 
 # 因为人人网有from表单,所以可以直接找地址:http://www.renren.com/PLogin.do
 # 如果没有的就要抓包了
 
 post_url ="http://www.renren.com/PLogin.do"   # form表单里面直接找到的
 #post_url = "http://www.renren.com/ajaxLogin/login?
 # 用户名作为键, 真正的密码作为值 模拟登陆
 post_data ={"email":"xxxx", "password":"xxxx"}
 seesion.post(post_url, headers =headers, data =post_data)
 
 url ="再次请求登陆的url"
 
 response =seesion.get(url, headers =headers)
 
 with io.open("ywm.html", "w",encoding="utf-8") as f:
   f.write(response.content.decode())

8、总结

python的爬虫相关模块有很多,除了requests模块,再如urllib和pycurl以及tornado等。相比而言,我个人觉得requests模块是相对简单易上手的了。通过文本,大家可以迅速学会使用python的requests模块爬取页码内容。本人能力有限,如果文章有任何错误欢迎不吝赐教,其次如果大家有任何关于python爬虫的疑难杂问,也欢迎和大家一起交流讨论。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、简介
  • 2、基本用法
  • 3、GET 请求
  • 4、带参数GET请求
  • 5、使用超时参数
  • 6、啥是cookie
  • 7、三种Cookie请求方式
    • 1.第一种:cookie放在headers中
      • 2.第二种:cookie字典传给cookies参数
        • 3.第三种:先发送post请求,获取cookie,带上cookie请求登陆之后的页面
        • 8、总结
        相关产品与服务
        Elasticsearch Service
        腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档