51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1830|回复: 0
打印 上一主题 下一主题

学Python的那些事——初学python之requests(2)

[复制链接]
  • TA的每日心情
    开心
    2016-7-25 00:04
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2016-7-4 10:41:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    上面一节,我们讲到了异常的处理,那么就这一节,我们将完成cookies的学习内容,你们准备好了吗?

    4.5 Cookies
              4.5.1 获取cookies

    cookie,是指某些网站为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据(通常经过加密)。
                 比如说有些网站需要登录之后才能访问某些页面,,在登录之前你想爬取某些页面,是不被允许的。这个时候,我们就可以利用cookie,进行爬取就可以啦。
               import  requests
                request_req = 'https://www.baidu.com/'
                response = requests.get(request_req)
                print(response.text)
                print(response.cookies) # 打印获取到的内容中的cookies


           运行上述代码我们可以获得从百度爬取到的代码和cookies,我这里仅仅只是打印了爬取到的所有的cookies。
              当然我们也可以在cookies后面输入我们需要的key来打印我们需要的cookie,那么这个key要怎么打印呢,我举个例子,把上面的 print(response.cookies)换成 print(response.cookies['PSTM']) 就可以打印出key为['PSTM']的cookies了。
              再来说说key的作用。我们可以通过打印key的cookies获取到我们想要value,是不是很方便呢?
             
              我们也可以自己去定义请求的cookies。那么自己定义cookies的作用又是什么呢?
              我们通过自己定义cookies,把cookies写死,其实就是为了伪造请求,然后实现自动登录。
              好吧,这里又讲到了自动登录,那么通过cookies实现的自动登录与上面我们传参的自动登录有什么不同呢?从功能上来讲,是没有区别的。但是注意,请注意,cookies是有时效性的。一旦当cookies超时之后,就无法继续自动登录了。而我们传参进行的自动登录,是可以保证每一次都会成功的。

              4.5.2 通过cookies自动登录
              下面给大家做一个通过获取cookies,并保存到本地,再通过cookies进行模拟登录的示范。
              import requests
              import unittest
              import json


              class Login():
              #定义一个方法,对请求方法进行封装
                   def login(self,method,url,getparams,postparams):
              #创建ssesion
                        ssesion = requests.session()
                        result=''
              #对请求方法进行判断,进而选择使用的请求方法,并且打印错误信息
                   if method=='GET':
                        if getparams!='':
                             try:
                                       result=ssesion.get(url,getparams)
                             except:
                                       print(result.status_code,result.reason)
                        else:
                             result=ssesion.get(url)
                             print(result)
                   if method=='POST':
                        if postparams!='':
                             try:
                                       result=ssesion.post(url,postparams)
                             except:
                                       print(result.status_code,result.reason)
              #将返回值进行json格式解码
                      jsdata=json.loads(result.text)
                    return jsdata
              #定义一个类,对上面的方法,类进行调用
              class APIGetAdList(unittest.TestCase):


                   def test_call(self):
                        api=Login()
                        getparams=''
                        postparams=''
                        api.login('GET','url', getparams, postparams)


              if __name__ == "__main__":
                   unittest.main()
         上面这段代码,是通过ssesion方法,获取cookies,从而实现了一个初级的模拟登陆的功能。我们来讲一下上面这段代码的逻辑。
         1、我们定义一个Login的类,里面用来定义login的方法
         2、定义一个login的方法,里面包含method,url,getparams,postparams四项参数
         3、创建一个ssesion,
         4、通过if对method参数进行判断,进而对请求方法进行选择
         5、尝试去请求目标url,如果出错就打印http状态码和错误信息
         6、对返回的内容进行json格式的解码并返回解码后的内容
         7、定义一个APIGetAdList类,用来定义一个传参的函数
         8、通过定义一个test_call(self)函数,对Login类的login方法中的各项参数进行传参
         9、调用主方法,运行脚本

         注:
              get和post的选择
           如果是爬虫,那么抓包就能看到请求方法,如果有接口文档,就可以根据接口文档去选择请求方法。


         看起来,并不是很难不是吗?用到的都是我们目前已经掌握的东西。requests,ssesion,httperror,json.

                好吧,这里又讲到了自动登录,那么通过cookies实现的自动登录与上面我们传参的自动登录有什么不同呢?从功能上来讲,是没有区别的。但是注意,请注意,cookies是有时效性的。一旦当cookies超时之后,就无法继续自动登录了。而我们传参进行的自动登录,是可以保证每一次都会成功的。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-19 23:55 , Processed in 0.064568 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表