什么是cookie:
在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie 数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。
cookie的格式:
Set-Cookie: NAME=VALUE;Expires/Max-age=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
参数意义:
- NAME:cookie的名字。
- VALUE:cookie的值。
- Expires:cookie的过期时间。
- Path:cookie作用的路径。该 Cookie 是在当前的哪个路径下生成的,如 path=/wp-admin/。
- Domain:cookie作用的域名。
- SECURE:是否只在https协议下起作用。如果设置了这个属性,那么只会在 SSH 连接时才会回传该 Cookie
cookie机制
当用户第一次访问并登陆一个网站的时候,cookie的设置以及发送会经历以下4个步骤:
客户端发送一个请求到服务器 --》 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 --》 客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部 --》服务器返回响应数据
1.如果不使用cookie直接来访问请求:
在 网页直接访问女神主页直接会弹到登录页面。
女神主页URL:http://www.renren.com/256450404/profile
代码示例:
#encoding:utf-8
#代码女神赵洁琼主页:http://www.renren.com/256450404/profile
#人人网登录URL:http://www.renren.com/Plogin.do
from urllib import request
#1.不使用cookie访问女神主页
nvshen_url="http://www.renren.com/256450404/profile"
headers={
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36"
}
req=request.Request(url=nvshen_url,headers=headers)
resp=request.urlopen(req)
#print(resp.read())
#将读取的内容写入html文件中
with open('renren.html','w') as fp:
#write函数必须写入一个str的数据类型
#resp.read()读出来的是一个bytes数据类型
#bytes ->decode -> str
#str ->encode ->bytes
fp.write(resp.read().decode('utf-8'))
获得的结果html文件打开如下图,虽然有点乱码, 但是还是能看出来 是登录页面,说明要想进入女神主页,还是需要登录的cookie进行请求访问才能实现。
复制浏览器中的cookie
#encoding:utf-8
#代码女神赵洁琼主页:http://www.renren.com/256450404/profile
#人人网登录URL:http://www.renren.com/Plogin.do
from urllib import request
#2.使用cookie访问女神主页
nvshen_url="http://www.renren.com/256450404/profile"
headers={
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36",
'Cookie':'anonymid=k8cdsuqh-srt2i0; depovince=GW; _r01_=1; taihe_bi_sdk_uid=bfe301037dffbe108487b72db5bf7e6b; jebe_key=6e985591-b125-4e8c-a086-6ffa0d70d0c2%7C50f2c4113393fea64a81ef35b552f056%7C1585446344625%7C1%7C1585446346127; jebe_key=6e985591-b125-4e8c-a086-6ffa0d70d0c2%7C50f2c4113393fea64a81ef35b552f056%7C1585446344625%7C1%7C1585446346129; JSESSIONID=abcB_WFVogSDj9AkbRLex; ick_login=b047f395-23df-4b1c-bc91-912f67b0f2fa; taihe_bi_sdk_session=d4e78eb86e06c00aa0c3e1487f6275a8; t=ce3517a93cf84e7d1e51f9b959106a9c6; societyguester=ce3517a93cf84e7d1e51f9b959106a9c6; id=974111896; xnsid=da5394c8; jebecookies=ab44e1ca-1fb8-4a83-8c39-9bd813f4d802|||||; ver=7.0; loginfrom=null; wp_fold=0'
}
req=request.Request(url=nvshen_url,headers=headers)
resp=request.urlopen(req)
#print(resp.read())
with open('renren2.html','w',encoding='utf-8') as fp:
#write函数必须写入一个str的数据类型
#resp.read()读出来的是一个bytes数据类型
#bytes ->decode -> str
#str ->encode ->bytes
fp.write(resp.read().decode('UTF-8'))
但是每次在访问需要cookie的页面都要从浏览器中复制cookie比较麻烦。在Python处理Cookie,一般是通过http.cookiejar模块和urllib模块的HTTPRCookieProcessor处理器类一起使用。http.cookiejar模块主要作用是提供用于存储cookie的对象。而HTTPCookicProcessor处理器主要作用是处理这些cookie对象,并构建handler对象。
http.cookiejar模块:
该模块主要的类有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。这四个类的作用分别如下:
1.CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookle都存储在内存中,对CookieJar实例进行垃圾回牧后cookie也将丢失。
2.FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
3.MozillaCookieJar (filename,delayload=None,policy-None):从FileCookieJar派生而来,创建与Mo zilla刘览器cookies.txt兼容的FileCookieJar实例。
4.LWPCookieJar (flename,delayload=None,policy=None): 从FileCookieJar派生而来,创建与libwww-perl标准的Set-Cookle3文件格式兼容的FileCookieJar实例。
利用http.cookiejar和request.HTTPCookieProcessor登录人人网。相关示例代码如下:
from urllib import request
from http.cookiejar import CookieJar
from urllib import parse
#1.登录去获取cookie
#1.创建一个CookieJar的对象来保存cookie
cookiejar=CookieJar()
#2.使用cookiejar创建一个HttpCOOKIEProcesser对象
handler=request.HTTPCookieProcessor(cookiejar)
#3.使用上一步生成的handler生成一个opener
opener=request.build_opener(handler)
#4.使用opener发送登录的请求
headers={
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36",
}
data={
'email':"970138074@qq.com",
'password':"pythonspider"
}
#登录页面
login_url='http://www.renren.com/SysHome.do'
req=request.Request(url=login_url,data=parse.urlencode(data).encode('utf-8'),headers=headers)
opener.open(req)
#2.进入女神主页
nvshen_url="http://www.renren.com/256450404/profile"
#获取个人主页的时候,不需要新建opener
#应该使用之前的那个opener,因为之前的已经包含需要的cookie
req2=request.Request(nvshen_url,headers=headers)
resp=opener.open(req2)
from urllib import request
from http.cookiejar import CookieJar
from urllib import parse
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36",
}
def get_opener():
# 1.登录去获取cookie
# 1.创建一个CookieJar的对象来保存cookie
cookiejar = CookieJar()
# 2.使用cookiejar创建一个HttpCOOKIEProcesser对象
handler = request.HTTPCookieProcessor(cookiejar)
# 3.使用上一步生成的handler生成一个opener
opener = request.build_opener(handler)
# 4.使用opener发送登录的请求
return opener
def log_renren(opener):
data = {
'email': "970138074@qq.com",
'password': "pythonspider"
}
# 登录页面
login_url = 'http://www.renren.com/SysHome.do'
req = request.Request(url=login_url, data=parse.urlencode(data).encode('utf-8'), headers=headers)
opener.open(req)
def visit_profile(opener):
# 2.进入女神主页
nvshen_url = "http://www.renren.com/256450404/profile"
# 获取个人主页的时候,不需要新建opener
# 应该使用之前的那个opener,因为之前的已经包含需要的cookie
req2 = request.Request(nvshen_url, headers=headers)
resp = opener.open(req2)
if __name__ == '__main__':
opener=get_opener()
log_renren(opener)
visit_profile(opener)
保存cookie到本地:
保存cookie
到本地,可以使用cookiejar
的save
方法,并且需要指定一个文件名:
from urllib import request,parse
from http.cookiejar import MozillaCookieJar
#保存cookie到本地文件
cookiejar=MozillaCookieJar('cookie.txt')
handler=request.HTTPCookieProcessor(cookiejar)
opener=request.build_opener(handler)
resp=opener.open('http://httpbin.org/cookies/set?freeform=course%3Daaa')
#resp=opener.open('http://www.baidu.com/')
#cookiejar.save()
cookiejar.save(ignore_discard=True)
#即将过期的cookie信息也会保存起来
'''
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file! Do not edit.
.baidu.com TRUE / FALSE 1644745918 BAIDUID 91DC90905091E99B1D1B062FE3CF3549:FG=1
.baidu.com TRUE / FALSE 3760693565 BIDUPSID 91DC90905091E99B75D901DB55EEB2B9
.baidu.com TRUE / FALSE H_PS_PSSID 33423_33401_33344_33585_26350
.baidu.com TRUE / FALSE 3760693565 PSTM 1613209918
www.baidu.com FALSE / FALSE BDSVRTM 0
www.baidu.com FALSE / FALSE BD_HOME 1
从本地加载cookie:
从本地加载cookie
,需要使用cookiejar
的load
方法,并且也需要指定方法:
from urllib import request,parse
from http.cookiejar import MozillaCookieJar
#加载本地cookie
#保存cookie到本地文件
cookiejar1=MozillaCookieJar('cookie.txt')
cookiejar1.load(ignore_discard=True)
handler=request.HTTPCookieProcessor(cookiejar)
opener=request.build_opener(handler)
resp=opener.open('http://httpbin.org/cookies')
for cookie in cookiejar1: #将cookie打印到控制台
print(cookie)