Cookie原理
HTTP是无状态的面向连接的协议, 为了保持连接状态, 引入了Cookie机制 Cookie是http消息头中的一种属性,包括:
Cookie名字(Name)
Cookie的值(Value)
Cookie的过期时间(Expires/Max-Age)
Cookie作用路径(Path)
Cookie所在域名(Domain),
Cookie的过期时间(Expires/Max-Age)
Cookie作用路径(Path)
Cookie所在域名(Domain),
使用Cookie进行安全连接(Secure)。
前两个参数是Cookie应用的必要条件,另外,还包括Cookie大小(Size,不同浏览器对Cookie个数及大小限制是有差异的)。
Cookie由变量名和值组成,根据 Netscape公司的规定,Cookie格式如下:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
Cookies在爬虫方面最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续。
cookielib库 和 HTTPCookieProcessor处理器在Python处理Cookie,一般是通过cookielib模块和 urllib2模块的HTTPCookieProcessor处理器类一起使用。
cookielib模块:主要作用是提供用于存储cookie的对象
HTTPCookieProcessor处理器:主要作用是处理这些cookie对象,并构建handler对象。
cookielib 库该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。
其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar() 或 LWPCookieJar()
我们来做几个案例:
1.获取Cookie,并保存到CookieJar()对象中 #
import urllib.request from http import cookiejar # 创建cookiejar对象 cookie = cookiejar.CookieJar() # 处理器 cookie_handler = urllib.request.HTTPCookieProcessor(cookie) # 打开器 opener = urllib.request.build_opener(cookie_handler) # 处理请求 response = opener.open('http://www.baidu.com') print(response.code) # print(cookie) cookies = '' for c in cookie: cookies += c.name + '=' + c.value + '\n' print(cookies)
2.访问人人网获得cookie,并把获得的cookie保存在cookie文件中 #
!C:\Python36\python.exe
import urllib from http import cookiejar from urllib import request, parse cookieFile = 'cookie.txt' cookie = cookiejar.LWPCookieJar() cookie_handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(cookie_handler) # 登陆url loginurl = "http://www.renren.com/PLogin.do" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"} data = { "email": "18588403840", "password": "Changeme_123" } data = urllib.parse.urlencode(data).encode('utf-8') req = urllib.request.Request(url=loginurl, data=data, headers=headers)import urllib from http import cookiejar from urllib import request, parse cookieFile = 'cookie.txt' cookie = cookiejar.LWPCookieJar() cookie_handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(cookie_handler) # 登陆url loginurl = "http://www.renren.com/PLogin.do" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"} data = { "email": "18588403840", "password": "Changeme_123" } data = urllib.parse.urlencode(data).encode('utf-8') req = urllib.request.Request(url=loginurl, data=data, headers=headers) response = opener.open(req) cookie.save(filename=cookieFile, ignore_discard=True, ignore_expires=True) print(response.read().decode('utf-8')) response = opener.open(req) cookie.save(filename=cookieFile, ignore_discard=True, ignore_expires=True) print(response.read().decode('utf-8'))
3.从文件中获取cookies,做为请求的一部分去访问 #
import urllib from urllib import request from http import cookiejar cookie = cookiejar.LWPCookieJar() cookiefile = './cookie.txt' # 读取保存好的cookie cookie.load(cookiefile, ignore_discard=True, ignore_expires=True) # 处理器 cookie_handler = urllib.request.HTTPCookieProcessor(cookie) # 打开器 opener = urllib.request.build_opener(cookie_handler) headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"} # 不需要数据 data = {} url = 'http://www.renren.com/965557295/profile' req = urllib.request.Request(url, headers=headers) response = opener.open(req) print(response.read().decode('utf-8'))