cookie & session
-
由于http协议的无状态性,人们为了弥补这个,所采用的一个补充协议
-
cookie是发放给用户(即http浏览器)的一段信息,session是保存在服务器上对应的另一半信息,用来记录用户信息
-
cookie和session的区别
- 存放位置不同
- cookie不安全
- session保存在服务器上,会过期
- 单个cookie保存数据不超过4k,很多浏览器限制一个站点最多保存20个
-
session的存放位置
- 存在服务器端
- 一般情况下,session是放在内存中或服务器中
- 没有cookie登陆,网页显示未登录状态
from urllib import request
if __name__ == '__main__':
url = 'http://www.renren.com/965187997/profile'
rsp = request.urlopen(url)
html = rsp.read().decode()
with open("rsp.html", 'w') as f:
f.write(html)
# 此时rsp.html 可以看见是一大堆代码,使用pycharm浏览器运行,会出现人人网登陆界面
# 说:您的用户名和密码不匹配
- cookie登陆
- 可以直接把cookie复制下来,然后手动放入请求头
from urllib import request
if __name__ == '__main__':
url = "http://www.renren.com/965187997/profile"
headers = {
"Cookie": "anonymid=jfosp2p2-48i1hh; depovince=BJ; _r01_=1; jebe_key=f2e12094-303b-4171-900f-ed304e5a5ba1%7C7629e5c8e0f7f334244eb5436ef05a2c%7C1523070488659%7C1%7C1523070515670; wp_fold=0; jebecookies=a201c15f-9745-40fc-9d32-7112f8cf849f|||||; ick_login=cbfe66e0-743c-46a4-a956-7d692056361d; _de=420A8DC764CD1624FC7C8526DA9A3A25; p=db36f5ff987e7e58c901f6194a22b7007; first_login_flag=1; ln_uact=13119144223; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; t=1b2976196819d4a57127f5b87ac495f77; societyguester=1b2976196819d4a57127f5b87ac495f77; id=965187997; xnsid=61e9001d; __utma=151146938.742687335.1523070758.1523070758.1523070758.1; __utmc=151146938; __utmz=151146938.1523070758.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=151146938.1.10.1523070758; ver=7.0; loginfrom=null; JSESSIONID=abcIxsy_d_tR06bwXfEkw; _urm_965187997=21"
}
req = request.Request(url, headers=headers)
rsp = request.urlopen(req)
html = rsp.read().decode()
with open("rsp.html", "w") as f:
f.write(html)
- http模块中包含一些关于cookie的模块,通过他们可以直接使用cookie
- CookieJar
- 管理存储cookie,向传出的http请求添加cookie
- cookie存储在内存中,CookieJar实例回收后cookie将消失
- FileCookieJar
- 使用文件管理cookie
- filename是管理cookie的文件
- MozillaCookieJar
- 创建与Mozilla浏览器cookie.txt兼容的FileCookieJar实例
- LwpCookieJar
- 创建与libwww-perl标准兼容的Set-Cookie3格式的FileCookieJar实例
- 他们的关系是:CookieJar->FileCookieJar->MozillaCookieJar & LwpCookieJar
- CookieJar
- 利用cookieJar访问
from urllib import request, parse
from http import cookiejar
# 创建cookiejar的实例
cookie = cookiejar.CookieJar()
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def login():
'''
负责初次登录
需要输入用户名密码,用来获取登录cookie凭证
:return:
'''
# 此url需要从登录form的action属性中提取
url = "http://www.renren.com/PLogin.do"
# 此键值需要从登录form的两个对应input中提取name属性
data = {
"email": "13119144223",
"password": "123456"
}
# 把数据进行编码
data = parse.urlencode(data)
# 创建一个请求对象
req = request.Request(url, data=data.encode())
# 使用opener发起请求
rsp = opener.open(req)
def getHomePage():
url = "http://www.renren.com/965187997/profile"
# 如果已经执行了login函数,则opener自动已经包含相应的cookie值
rsp = opener.open(url)
html = rsp.read().decode()
with open("rsp.html", "w", encoding="utf-8") as f:
f.write(html)
if __name__ == '__main__':
login()
getHomePage()
-
自动使用cookie登录,大致流程是
- 打开登录页面后自动通过用户名密码登录
- 自动提取反馈回来的cookie
- 利用提取的cookie登录隐私页面
-
handler是Handler的实例,常用参看案例代码
-
用来处理复杂请求
# 生成 cookie的管理器 cookie_handler = request.HTTPCookieProcessor(cookie) # 创建http请求管理器 http_handler = request.HTTPHandler() # 生成https管理器 https_handler = request.HTTPSHandler()
-
-
创立handler后,使用opener打开,打开后相应的业务由相应的hanlder处理
-
cookie作为一个变量打印出来
from urllib import request, parse
from http import cookiejar
# 创建cookiejar的实例
cookie = cookiejar.CookieJar()
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def login():
'''
负责初次登录
需要输入用户名密码,用来获取登录cookie凭证
:return:
'''
# 此url需要从登录form的action属性中提取
url = "http://www.renren.com/PLogin.do"
# 此键值需要从登录form的两个对应input中提取name属性
data = {
"email": "13119144223",
"password": "123456"
}
# 把数据进行编码
data = parse.urlencode(data)
# 创建一个请求对象
req = request.Request(url, data=data.encode())
# 使用opener发起请求
rsp = opener.open(req)
if __name__ == '__main__':
'''
执行完login之后,会得到授权之后的cookie
我们尝试把cookie打印出来
'''
login()
print(cookie)
for item in cookie:
print(type(item))
print(item)
for i in dir(item):
print(i)
- cookie的属性
- name: 名称
- value: 值
- domain:可以访问此cookie的域名
- path: 可以发昂文此cookie的页面路径
- expires:过期时间
- size: 大小
- Http字段
- cookie的保存-FileCookieJar
from urllib import request, parse
from http import cookiejar
# 创建filecookiejar的实例
filename = "cookie.txt"
cookie = cookiejar.MozillaCookieJar(filename)
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def login():
'''
负责初次登录
需要输入用户名密码,用来获取登录cookie凭证
:return:
'''
# 此url需要从登录form的action属性中提取
url = "http://www.renren.com/PLogin.do"
# 此键值需要从登录form的两个对应input中提取name属性
data = {
"email": "13119144223",
"password": "123456"
}
# 把数据进行编码
data = parse.urlencode(data)
# 创建一个请求对象
req = request.Request(url, data=data.encode())
# 使用opener发起请求
rsp = opener.open(req)
# 保存cookie到文件
# ignore_discard表示及时cookie将要被丢弃也要保存下来
# ignore_expire表示如果该文件中cookie即使已经过期,保存
cookie.save(ignore_discard=True, ignore_expires=True)
if __name__ == '__main__':
login()
cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file! Do not edit.
.renren.com TRUE / FALSE 1596953254 _de 420A8DC764CD1624FC7C8526DA9A3A25
.renren.com TRUE / FALSE 1723529254 anonymid jzca7tdg-xms625
.renren.com TRUE / FALSE first_login_flag 1
.renren.com TRUE / FALSE id 965187997
.renren.com TRUE / FALSE 1568441254 ln_hurl http://head.xiaonei.com/photos/0/0/men_main.gif
.renren.com TRUE / FALSE 1568441254 ln_uact 13119144223
.renren.com TRUE / FALSE loginfrom null
.renren.com TRUE / FALSE p f1b69469c35a07f7192a7849920697647
.renren.com TRUE / FALSE societyguester 839062696cf90047e26724167f08c6f67
.renren.com TRUE / FALSE t 839062696cf90047e26724167f08c6f67
.renren.com TRUE / FALSE ver 7.0
.renren.com TRUE / FALSE xnsid 6c1c8566
.renren.com TRUE /xtalk/ FALSE t 3525c7fd556f545d1044f72b049494f5
www.renren.com FALSE / FALSE JSESSIONID abcDGW184RB1xeWR34tYw
- cookie的读取
from urllib import request, parse
from http import cookiejar
# 创建cookiejar的实例
cookie = cookiejar.MozillaCookieJar()
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def getHomePage():
url = "http://www.renren.com/965187997/profile"
# 如果已经执行了login函数,则opener自动已经包含相应的cookie值
rsp = opener.open(url)
html = rsp.read().decode()
with open("rsp.html", "w",encoding="utf-8") as f:
f.write(html)
if __name__ == '__main__':
getHomePage()