什么是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的头部 --》服务器返回响应数据

python 爬虫 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到本地,可以使用cookiejarsave方法,并且需要指定一个文件名:

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,需要使用cookiejarload方法,并且也需要指定方法:

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)