zoukankan      html  css  js  c++  java
  • jupyterLab学习第三天-request的session、cookies初学习和练习

    一、简介:

    session是一种管理用户状态和信息的机制,与cookie的不同的是,session的数据是保存在服务器端。说的明白点就是session相当于一个虚拟的浏览器,在这个浏览器上处于一种保持登录的状态。

    cookie是用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),比如cookie会存储一些用户的用户名和密码,当用户登录后就会在客户端产生一个cookie来存储相关信息,这样浏览器通过读取cookie的信息去服务器上验证并通过后会判定你是合法用户,从而允许查看相应网页。当然cookie里面的数据不仅仅是上述范围,还有很多信息可以存储是cookie里面,比如sessionid等。

    二、特点:

    1、requests库的session对象能够帮我们跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookies

    2、requests库的session对象还能为我们提供请求方法的缺省数据,通过设置session对象的属性来实现

    # 创建一个session对象  

    s = requests.Session()  

    # 两种发送请求的方法

    s.get():请求指定的页面信息,并返回实体主体。

    s.post():向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。

    以及方法里的几种参数

    post(url, headers=headers, data=data, cookies=cookie, timeout=3)分别是地址、相应头、提交的表达数据、cookies、响应超时时间

    #几种参数的意义和获取方法(这里以爬取拉钩网实例,借鉴大佬原文:https://www.cnblogs.com/sui776265233/p/11146969.html#_label0

    进入拉勾网官网

     输入你想搜索的工作岗位 我这里是输入的是:python工程师 。然后右键点击检查或者F12,,使用检查功能查看网页源代码,当我们点击下一页观察浏览器的搜索栏的url并没有改变,这是因为拉勾网做了反爬虫机制, 职位信息并不在源代码里,而是保存在JSON的文件里,因此我们直接下载JSON,并使用字典方法直接读取数据.即可拿到我们想要的python职位相关的信息,

    待爬取的python工程师职位信息如下:

    为了能爬到我们想要的数据,我们要用程序来模拟浏览器来查看网页,所以我们在爬取的过程中会加上头信息,头信息也是我们通过分析网页获取到的,通过网页分析我们知道该请求的头信息,以及请求的信息和请求的方式是POST请求,这样我们就可以该url请求拿到我们想的数据做进一步处理

     

    #url(你想爬取数据的地址):https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false

    #Request Headers

    (请求头信息,我们爬取访问网站时候,需要带着请求访问,那又一部分的请求是放在请求头的,如UA ,cookies ,token 等等很多属性会放在里面进行访问!如果这里没有构造好的话,容易被网站识别为爬虫,被拒绝访问。)

    headers = {
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
    'Host': 'www.lagou.com',
    'Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=',
    'X-Anit-Forge-Code': '0',
    'X-Anit-Forge-Token': 'None',
    'X-Requested-With': 'XMLHttpRequest'
    }

    Authority:表示服务器的域名以及服务器所监听的端口号。如果所请求的端口是对应的服务的标准端口(80),则端口号可以省略。

    Cookie:也作复数Cookies。它的主要功能是维持当前访问会话。当我们输入用户名和密码成功登录某个网站后,服务器会用会话保存登录状态信息,后面我们每次刷新或请求该站点的其他页面时,会发现都是登录状态,这就是 Cookies 的功劳。

    Referer:此内容用来标识这个请求是从哪个页面发过来的,通常在访问链接时,都要带上Referer字段,服务器会进行来源验证,后台通常会用此字段作为防盗链的依据。

    User-Agent:后台通常会通过此字段判断用户设备类型、系统以及浏览器的型号版本。如果不加此字段,很可能会被识别出为爬虫。

    注:headers各属性作用https://blog.csdn.net/philos3/article/details/76946029

    #data(常见的form表单可以直接使用data参数进行报文提交,模拟用户操作提交的数据):

    如果像是在网站搜索时

    data = {
    'first': 'true',
    'pn': num,
    'kd': 'python工程师'}

    pn是拉勾网搜索后显示数据栏的下标页数

     kd则是我们搜索框输入的想查询的岗位

    也可能是登录时

    formdata = {
    
    'email':'admin@wuaics.cn',
    
    'password':'你的密码',
    
    '_xsrf':_xsrf
    
    }

    包括需要输入的用户名、密码以及像_xsrf这种参数的页面校检码(如何获取这种参数下面两篇文章有讲解)

    这里有两篇模拟登录的例子https://blog.csdn.net/xiaozhanger/article/details/78034015和https://www.jianshu.com/p/3c00d57d0244

     #cookie(开头简介有介绍是干嘛的)

    模拟登录时

    也可以是不用data用设置cookies

    例子:https://www.cnblogs.com/qican/p/11153824.html

     我运行后的测试:

    # coding:utf-8
    import requests
    # 保持登录状态
    s = requests.session()
    url = 'https://www.baidu.com/'
    # 请求头
    headers = {
         "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63"
    }
    r = s.post(url,headers=headers)
    # 查看的cookies值
    cooks = {
        "BDUSS":"",
        "BAIDUID":""
    }
    # 添加登录所携带的cookies
    c = requests.cookies.RequestsCookieJar()
    c.set("BDUSS",cooks["BDUSS"])
    c.set("BAIDUID",cooks["BAIDUID"])
    s.cookies.update(c)
    # 判断是否登录成功
    r2 = s.get(url,headers=headers)
    if '' in r2.text:
        print('登录成功')
    else:
        print("登录失败")

     爬取拉勾网时

    除了data提交的表单数据外 我们可能还需要一些其他的数据用户名、密码隐藏参数

    这时候我们就需要去到我要爬取的的网页获取此时的cookies

    1、可以手动赋值粘贴下来

     2、也可以

    url1 = 'https://www.lagou.com/jobs/list_python%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88?labelWords=&fromSearch=true&suginput='
    s.get(url=url1, headers=headers, timeout=3)
    cookie = s.cookies
    

     url1就是上面图里的

    #响应状态码判断

     r.raise_for_status()

    理解Response类非常重要,Response这样的一个对象返回了所有的网页内容,那么它也提供了一个方法,叫raise_for_status(),这个方法是专门与异常打交道的方法,该方法有这样一个有趣的功能,它能够判断返回的Response类型状态是不是200。如果是200,他将表示返回的内容是正确的,如果不是200,他就会产生一个HttpError的异常。

    #响应编码设置

     res.encoding = 'utf-8' 

    请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用r.encoding 属性来改变它:

     #JSON 响应内容

     Requests 中也有一个内置的 JSON 解码器,助你处理 JSON 数据,可以通过下列代码获取

    r.json()

    如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 401 (Unauthorized),尝试访问 r.json() 将会抛出 ValueError: No JSON object could be decoded 异常。

    需要注意的是,成功调用 r.json() 并**不**意味着响应的成功。有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节)。这种 JSON 会被解码返回。要检查请求是否成功,请使用 r.raise_for_status() 或者检查 r.status_code 是否和你的期望相同。

     代码示例:

    import requests
    
    url = ' https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
    
    
    def get_json(url, num):
        """
        从指定的url中通过requests请求携带请求头和请求体获取网页中的信息,
        :return:
        """
        url1 = 'https://www.lagou.com/jobs/list_python%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88?labelWords=&fromSearch=true&suginput='
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
            'Host': 'www.lagou.com',
            'Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=',
            'X-Anit-Forge-Code': '0',
            'X-Anit-Forge-Token': 'None',
            'X-Requested-With': 'XMLHttpRequest'
        }
        data = {
            'first': 'true',
            'pn': num,
            'kd': 'python工程师'}
        s = requests.Session()
        print('建立session:', s, '
    
    ')
        s.get(url=url1, headers=headers, timeout=3)
        cookie = s.cookies
        print('获取cookie:', cookie, '
    
    ')
        res = requests.post(url, headers=headers, data=data, cookies=cookie, timeout=3)
        res.raise_for_status()
        res.encoding = 'utf-8'
        page_data = res.json()
        print('请求响应结果:', page_data, '
    
    ')
        return page_data
    
    
    print(get_json(url, 1))

      

     

  • 相关阅读:
    线程同步的几种实现方案
    关于java中三种初始化块的执行顺序
    java数组
    Codeblocks 17汉化
    聚焦天狗
    linux下搭建svn添加多个仓库(项目)
    使用Python在windows环境下获取Linux服务器的磁盘、内存等信息
    python smtplib使用163发送邮件 报错 554 DT:SPM
    防抖与节流
    js
  • 原文地址:https://www.cnblogs.com/chenaiiu/p/13946383.html
Copyright © 2011-2022 走看看