zoukankan      html  css  js  c++  java
  • Spider--补充--Requests--session&cookie

    # session 与 cookie
    
    # 可能大家对session已经比较熟悉了,也大概了解了session的机制和原理,但是我们在做爬虫时如何会运用到session呢,就是接下来要讲到的会话保持。
    # 首先说一下,为什么要进行会话保持的操作?
    # requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象求求该
    # 网站的其他网页都会默认使用该session之前使用的cookie等参数尤其是在保持登陆状态时运用的最多,在某些网站抓取,或者app抓取时,有的时强制登陆,
    # 有的是不登陆返回的数据就是假的或者说是不完整的数据,那我们不可能去做到每一次请求都要去登陆一下怎么办,就需要用到保持会话的功能了,我们可以
    # 只登陆一次,然后保持这种状态去做其他的或者更多的请求。其次,我们该如何使用会话保持?举一个事例来说明一下:
    
    #requests.session():维持会话,可以让我们在跨请求时保存某些参数
     
    import requests
     
    #实例化session
    session = requests.session()
    url = 'https://www.douban.com/accounts/login'
    form_data = {
        'source': 'index_nav',
        'form_email': 'xxx',
        'form_password': 'xxx',
        'captcha-solution': 'stamp',
        'captcha-id': 'b3dssX515MsmNaklBX8uh5Ab:en'}
    #设置请求头
    req_header = {
        'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
    }
     
    #使用session发起请求
    response = session.post(url,headers=req_header,data=form_data)
    if response.status_code == 200:
        #访问个人主页:
        url = 'https://www.douban.com/people/175417123/'
        response = session.get(url,headers = req_header)
        if response.status_code == 200:
            with open('douban3.html','w') as file:
                file.write(response.text)
    
                
    
    import requests
    import time
    mycookie = { "PHPSESSID":"56v9clgo1kdfo3q5q8ck0aaaaa" }
    x = requests.session()
    requests.utils.add_dict_to_cookiejar(x.cookies,{"PHPSESSID":"07et4ol1g7ttb0bnjmbiqjhp43"})
    x.get("http://127.0.0.1:80",cookies = mycookie)
    time.sleep(5)
    #请求以后抓包可以检验一下是不是添加成功
    x.get("http://127.0.0.1:80")
    
    # 这样,通过requests.utils.add_dict_to_cookiejar对session对象设置cookie,之后所有的请求都会自动加上我自定义的cookie内容。
    # 也可以通过requests.utils.cookiejar_from_dict 先生成一个cookiejar对象,到时候再赋值给session.cookies。
    # 貌似还可以使用session.cookies.set()或者update()。
    
    # 另外说一点单独处理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("; ")}
     
    
    # 实例:    
    import requests
    from bs4 import BeautifulSoup
    
    def getPage(url):
        """
        Utilty function used to get a Beautiful Soup object from a given URL
        """
    
        session = requests.Session()   # requests.session():维持会话,可以让我们在跨请求时保存某些参数
    
        headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
                   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}
        try:
            req = session.get(url, headers=headers)
        except requests.exceptions.RequestException:
            return None
        bs = BeautifulSoup(req.text, 'html.parser')
        return bs
    
  • 相关阅读:
    linux 下常用命令
    Mysql 数据库几种引擎的区别比较
    java 中使用ajax调用后台方法注意事项
    C# HtmlDocument和HtmlNode的使用以及节点的模糊查询
    Visio 保存卡死解决办法
    java outterLoop跳出多重循环用法以及详解
    webapi 文件下载输出接口
    获取web.config 内的值
    xml的读取(曾删改)
    from 验证
  • 原文地址:https://www.cnblogs.com/Collin-pxy/p/13207753.html
Copyright © 2011-2022 走看看