1.Cookie
Cookie 是指某些网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话。
原理
HTTP是无状态的面向连接的协议, 为了保持连接状态, 引入了Cookie机制 Cookie是http消息头中的一种属性,包括:
Cookie名字(Name)
Cookie的值(Value)
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在爬虫方面最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续。
2.cookielib库 和 HTTPCookieProcessor处理器
在Python处理Cookie,一般是通过http.cookiejar模块和 urllib.request模块的HTTPCookieProcessor处理器类一起使用。
http.cookiejar模块:主要作用是提供用于存储cookie的对象
HTTPCookieProcessor处理器:主要作用是处理这些cookie对象,并构建handler对象。
http.cookiejar 库
该模块主要的对象有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()
人人网模拟登录
#保存cookie值模拟登录
import urllib.request as urllib2
import http.cookiejar as cookielib
import urllib
#通过cookieJar()类构建一个cookiejar()对象,用来保存cookie的值
cookie = cookielib.CookieJar()
#通过HTTPCookieProcessor()处理器构建一个处理器对象,用来处理cookie
#参数就是构建的CookieJar()对象
cookie_handler = urllib2.HTTPCookieProcessor(cookie)
#构建一个自定义的opener
opener = urllib2.build_opener(cookie_handler)
#自定义opener的addheaders的参数,可以赋值HTTP报头参数
opener.addheaders = [('User_Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0')]
#renren网的登录接口
url = 'http://www.renren.com/PLogin.do'
data = {'email':'账号','password':'密码'}
#通过urlencode()编码转换
data = urllib.parse.urlencode(data).encode('utf-8')
#第一次是post请求,发送登录需要的参数,过去cookie
request = urllib2.Request(url,data = data)
#发送第一次的post请求,生成登录后的cookie(如果登录成功的话)
response = opener.open(request)
#第二次可以是get请求,这个请求将保存生成cookie一并发送到web服务器,服务器会验证cookie通过
#response2 = opener.open('http://www.renren.com/971537428')
#获取登陆后才能访问的页面信息
html = response.read().decode(encoding='utf-8')
html = response.read().decode(encoding='utf-8')
print(html)
with open('renren.html','w',encoding='utf-8') as f:
f.write(html)