zoukankan      html  css  js  c++  java
  • Python cookielib 模块

    什么是 cookie :

    指某些网站为了辨别用户身份,进行 session 跟踪而储存在用户本地终端上的数据,通常以 txt 文件形式存储。比如你登录了淘宝,浏览器就会
    保存 cookie 信息,这样我们浏览淘宝的其他商家页面就不需要再重新登录了;如果没有保存 cookie 信息,你每切换到另一个页面都要登录一次。

    cookielib 一般用于客户端处理 HTTP cookie 信息,通过它可以从服务器端获取 cookie 信息,反过来又可以通过它将获取到的 cookie 发送给服务器

    如何获取 cookie :

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import urllib2
    import cookielib
    
    url = 'http://www.baidu.com/'
    cookies = cookielib.CookieJar()                   # CookieJar()方法用于收集cookie信息,只有当我们访问一个URL的时候才会有cookie信息,目前只是创建一个cookie对象,里面是没有值的
    handler = urllib2.HTTPCookieProcessor(cookies)    # 使用 urllib2 的 HTTPCookieProcessor() 方法,创建一个 cookie 处理器,对收集到的 cookie 进行处理
    opener = urllib2.build_opener(handler)            # 使用 urllib2 的 build_opener() 方法,创建一个 opener 实例,该实例用于处理给定的URL链接
    response = opener.open(url)                       # opener.open(url) 相当于 urllib2.urlopen(url),打开链接之后,上面定义的 cookies 就有值了
    
    for cookie in cookies:
        print "%s: %s" % (cookie.name, cookie.value)
    [root@localhost ~]$ python 1.py 
    BAIDUID: 006F1423AFEFD18A005B7C77DF41CF12:FG=1
    BIDUPSID: 006F1423AFEFD18A005B7C77DF41CF12
    H_PS_PSSID: 1431_21104_18560_26350_22157
    PSTM: 1550233508
    delPer: 0
    BDSVRTM: 0
    BD_HOME: 0


    爬虫中的用法:

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import re
    import sys
    import urllib
    import urllib2
    import cookielib
    
    class AdminSite(object):
    
        def __init__(self):
            self.login_url = 'http://www.xxxx.com:8899/accounts/login/'    # 登录页面的URL
            self.request_url = 'http://www.xxxx.com:8899/yunwei/index/'    # 要爬取的页面的URL
            self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36'}
            
        def getPage(self):
            cookie = cookielib.CookieJar()
            handler = urllib2.HTTPCookieProcessor(cookie)
            self.opener = urllib2.build_opener(handler)
    
            try:
                request = urllib2.Request(url=self.request_url, headers=self.headers)
                response = self.opener.open(request)
                return response.read()
            except urllib2.URLError, e:
                if hasattr(e, 'code'):
                    print '连接服务器失败,错误代码:%s' % e.code
                if hasattr(e, 'reason'):
                    print '连接服务器失败,失败原因:%s' % e.reason
                else:
                    print '连接服务器失败,失败原因:%s' % e
                sys.exit(1)
              
        def getToken(self):
            page = self.getPage()
            regular = re.compile(r"<form.*?<input.*?value='(.*?)'.*?>", re.S)
            token = regular.search(page)
            if token:
                return token.group(1)
            else:
                return None
    
        def login(self):
            form_data = {'csrfmiddlewaretoken': self.getToken(),
                         'username': 'xxxxxx',
                         'password': 'xxxxxx',
                         'next': '/yunwei/index/'}
            self.post_data = urllib.urlencode(form_data) 
            try:
                request = urllib2.Request(url=self.login_url, data=self.post_data, headers=self.headers)
                response = self.opener.open(request)
                print response.read()
                return response.read()
            except urllib2.URLError, e:
                if hasattr(e, 'code'):
                    print '连接服务器失败,错误代码:%s' % e.code
                if hasattr(e, 'reason'):
                    print '连接服务器失败,失败原因:%s' % e.reason
                else:
                    print '连接服务器失败,失败原因:%s' % e
                sys.exit(1)
    
    if __name__ == '__main__':
        obj = AdminSite()
        obj.login()

        

  • 相关阅读:
    vue组件系列-数字滚动组件
    重新振兴自己
    EL表达式
    org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type sette
    Struts2常用标签总结
    mybatis+strut2+spring整合总结
    hibernate的详细注解以及例子
    Struts2基于注解的Action配置
    【干货】如何通过OPC自定义接口来实现客户端数据的读取?
    即将离职,共享下我的知识库
  • 原文地址:https://www.cnblogs.com/pzk7788/p/10385883.html
Copyright © 2011-2022 走看看