1、cookie & session简介
-由于http协议的无记忆性,人们为了弥补这个这个缺憾,所采用的一个补充协议
-cookie是发放给用户(即http浏览器)的一段信息(通常记录用户身份),session是保存在服务器上的对应的另一半信息,用来记录用户信息
(1)cookie和session的区别
-存放位置不同
-cookie不安全
-session会保存在服务器上一定时间,会过期
-单个cookie保存数据不超过4K,很多浏览器限制一个站点最多保存20个
(2)session的存放位置
-存在服务器端
-一般情况,session是放在(想要速度快的话放内存)内存中或者(默认放)数据库中
-没有cookie登录,可以看到,没有使用cookie则反馈网页为未登录状态
from urllib import request
if __name__ == '__main__':
url = "https://www.renren.com/965187997/profile"
#req = request.Request(url)
rsp = request.urlopen(url)
html = rsp.read().decode()
'''
UnicodeEncodeError: 'gbk' codec can't encode character '\ue600' in position 145620: illegal multibyte sequence
解决:改为utf-8
'''
with open("rsp.html","w") as f:
f.write(html)
2、cookie登录、访问、属性、保存
(1)直接把cookie复制下来,然后手动放入请求头(例:访问人人网)
# 爬虫使用cookie
from urllib import request
if __name__ == '__main__':
url = "http://www.renren.com/970362268"
headers = {
"cookie":"_r01_=1; ick=1a32e31e-bdfa-408b-8b87-68ac0c4ff4c7; anonymid=ju9fbgww-soghnp; depovince=GW; JSESSIONID=abcb7WJ_ynJeK_VXV2aOw; ick_login=c85d8114-439e-4d82-8e5f-10646cd37430; t=62d2b8164ae2b729d12263c9f4c482e68; societyguester=62d2b8164ae2b729d12263c9f4c482e68; id=970362268; xnsid=ff14ddfa; ver=7.0; loginfrom=null; jebe_key=16d9bc6a-222a-40ce-af09-9a18a0663e8c%7C57573f7fa1d38d00970b98271913a7f8%7C1554793573096%7C1%7C1554793573019; jebecookies=a908f08f-6694-4188-bd7c-91c1b8bd1024|||||; wp_fold=0"
}
req = request.Request(url=url,headers=headers)
rsp = request.urlopen(req)
html = rsp.read().decode()
with open("rsp.html","w",encoding="utf-8")as f:
# 将爬取的页面打印出来
print(html)
f.write(html)
(2)http模块包含一些关于cookie的模块,通过他们我们可以自动使用cookie
-CookieJar
-管理存储cookie,向传出的http请求添加cookie
-cookie存储在内存中,CookieJar实例回收后cookie将消失
-FileCookieJar
-使用文件管理cookie
-filename是保存cookie的文件
-MozillaCookieJar(filename,delayload=None,policy=None):
-创建与mocilla浏览器cookie.txt兼容的FileCookieJar实例
-LwpCookieJar(filename,delayload=None,polcy=None):
-创建与libwww-perl标准兼容的Set-Cookie3格式的FileCookieJar实例
-他们的关系是:CookieJar-->FileCookieJar-->MozillaCookieJar & LwpCookieJar
(3)利用cookiejar访问人人网
-自动使用cookie登录,大致流程是:
-打开登录页面后自动通过用户名密码登录
-自动提取反馈回来的cookie
-利用提取的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 = "http://www.renren.com/PLogin.do"
data = {
"email":"",#输入用户名
"password":""#输入密码
}
#把数据进行编码
data = parse.urlencode(data)
#创建一个请求对象
req = request.Request(url,data=data.encode())
#使用opener发起请求
rsp = opener.open(req)
def getHomePage():
url = "http://www.renren.com/970362268"
#如果已经执行了login函数,则opener自动已经包含相应的cookie值
rsp = opener.open(url)
html = rsp.read().decode()
with open("rsq.html","w") as f:
f.write(html)
if __name__ == '__main__':
login()
getHomePage()
(4)handler是Handler的实例,常用有
#生成cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
#创建http请求管理器
http_handler = request.HTTPHandler()
#生成https管理器
https_handler = request.HTTPSHandler()
-创立handler后使用opener打开,打开后相应的业务由相应的handler处理
-cookie作为一个变量打印出来
# 使用cookiejar
# 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
url = 'http://www.renren.com/PLogin.do'
id = input('请输入用户名:')
pw = input('请输入密码:')
data = {
# 参数使用正确的用户名密码
"email": id,
"password": pw
}
# 把数据进行编码
data = parse.urlencode(data)
# 创建一个请求对象
req = request.Request(url,data=data.encode('utf-8'))
# 使用opener发起请求
rsp = opener.open(req)
# 以上代码就可以进一步获取cookie了,cookie在哪呢?cookie在opener里
def getHomePage():
# 地址是用在浏览器登录后的个人信息页地址
url = "http://www.renren.com/970362268"
# 如果已经执行login函数,则opener自动已经包含cookie
rsp = opener.open(url)
html = rsp.read().decode()
with open("rsp1.html", "w", encoding="utf-8")as f:
# 将爬取的页面
print(html)
f.write(html)
if __name__ == '__main__':
login()
# 执行完login之后,会得到授权之后的cookie,下一步打印出来
print(cookie)
for item in cookie:
print(type(item))
print(item)
for i in dir(item):
print(i)
(5)cookie的属性
-name:名称
-value:值
-domain:可以访问此cookie的域名
-path:可以访问此cookie的页面路径
-expires:过期时间
-size:大小
-Http字段
(6)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 = "http://www.renren.com/PLogin.do"
id = input("请输入用户名")
pd = input("请输入密码")
data = {
"email":id,#输入用户名
"password":pd#输入密码
}
#把数据进行编码
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()
(7)cookie的读取
from urllib import request,parse
from http import cookiejar
#创建filecookiejar的实例
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/970362268"
#如果已经执行了login函数,则opener自动已经包含相应的cookie值
rsp = opener.open(url)
html = rsp.read().decode()
with open("rsq.html","w") as f:
f.write(html)
if __name__ == '__main__':
getHomePage()