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()