Python随记(22)cookie模拟登录,保存,加载

cookie 模拟登录

某些网站为了辨别用户的身份,进行session跟踪而储存在用户本地终端上的数据。cookie储存的数据有限,不同浏览器有不同的储存大小,一般不超过4kb,因此只能储存一些小量数据。就好比,你去逛商场的积分卡,消费一次,记点积分。用户第一次请求,服务器发现没有这个id 分配一个,等下次请求cookie就会带着分配的id,服务器看到id,取出对应id的数据。

cookie格式: Set-Cookie: NAME=VALUE; Expires/Max-age=DATE; Path=PATH; Domain=DOMAIN_NAME; SECURE

NAME: cookie的名字 VALUE:cookie的值 Expires :过期时间 Path: 作用路径 Domain :作用的域名 SECURE :是否只在https协议下起作用。

在请求头的cookie,表示通知服务端当前生效的cookie 。相应头的set-cookie,指通知客户端需要保存的数据。

第一种方法:通过浏览器去访问网站,通过抓包工具复制cookie,增加到headers里就行。。(不过人家知乎已经拒绝访问了。。)

from urllib import request
url = 'https://www.zhihu.com/hot'
header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 'cookie' : '_zap=16b6a6cd-89d0-4c74-8c2b-d2d0ac6b8da1; _xsrf=0niPKZPE4sv6eK4N9xMMWcsIJeKdIfxs; d_c0="AIBk_tH2kxCPTu6AZ5hk0CJ5MRIziEiCyM4=|1577587612"; tst=h; ISSW=1; tshl=; _ga=GA1.2.1177618282.1582805229; _gid=GA1.2.281601361.1585058286; capsion_ticket="2|1:0|10:1585106875|14:capsion_ticket|44:OTc0MjViMDdlZTIwNDI0YzgxYjliY2U4Y2E4NGMxZmU=|360a10dc3b7b8c57361a7377fd1382a5913278b43d00804645bb9debafd5a0a5"; z_c0="2|1:0|10:1585106912|4:z_c0|92:Mi4xMFRFb0ZBQUFBQUFBZ0dULTBmYVRFQ1lBQUFCZ0FsVk4zeDFvWHdCYUFCOUJzMjJWUDlsRGU0cEprUllHREc3MEJ3|2c347191cba866f88c8be291a52d31f00dcfbebc329533b1fa52af896d3d60a3"; q_c1=a31f2cd3dcb9498d98f4db6137909f60|1585185125000|1578028688000; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1585106866,1585179203,1585185124,1585224305; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1585224305; _gat_gtag_UA_149949619_1=1; SESSIONID=vXdR7SaCyeq3CPYjBGDKUs1QPwa7Q0UhOdnAJCV3VM2; zst_81=SBYy1L6zEH1IxqsURh37bT5OVoaJ4HE-MXND5_3jSRc6jE6KvrMQfS8AzACLMFCZUwnX_pg0F3Lhb-DB; zst_822=1219260507540279296; JOID=W18SAElwIATmjYsmS3r1kyJwL8hVCHhktbHWRwwCS3XRz9BxIQy-fbKIhSJOFzb6MrgIZq9hOu_IrgYkStdZ0vI=; osd=U1kUCkx4JgLsiIMgTXDwmyR2Jc1dDn5usLnQQQYHQ3PXxdV5Jwq0eLqOgyhLHzD8OL0AYKlrP-fOqAwhQtFf2Pc=; KLBRSID=e42bab774ac0012482937540873c03cf|1585224314|1585224303'}
rq = request.Request(url,headers=header)   
resp = request.urlopen(rq)
print(resp.read().decode('utf-8'))

第二种方法:http.cookiejar模块用于提供一个存储cookie的对象
该模块主要的类有Cookiejar,FileCookiejar,MozillaCookiejar,LWPCookjar.

  1. CookieJar :管理HTTP cookie值,储存HTTP请求生成的cookie,向传出的HTTP请求添加cookie的对象,整个cookie都储存在内存中,对Cookjar实例进行垃圾回收后cookie也将丢失
  2. FileCookieJar(filename,delayload=None,policy=None): 从cookiejar派生的,用来创建FileCookjar实例,检索cookie信息并将cookie储存到文件 中,filename是储存cookie的文件名,delayloa为True时只有在需要时才读取文件或在文件中储存数据。
  3. MozillaCookieJar(filename,delayload=None,policy=None),从FileCookieJar派生来的,创建于Mozilla(火狐)浏览器 cookies.txt兼容的FileCookieJar 实例。
  4. LWPCookieJar(filename,delayload=None,policy=None);从filecookiejar派生来,创建与libwww-perl标准的Set-Cookie3文件格式兼容的FileCookieJar实例
from urllib import request
from urllib import parse
from http.cookiejar import CookieJar

#1 登录,登陆以后才能访问个人网页嘛
#1.1 创建cookiejar对象  储存cookie数据
cookiejar = CookieJar()

#1.2 使用cookiejar创建一个HTTPCookieProcess对象 (处理器)
handler = request.HTTPCookieProcessor(cookiejar)

#1.3 使用上一步的创建的handler创建一个opener
opener = request.build_opener(handler)

#1.4 使用opener发送登录请求(带账号密码的)
post_url = 'https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F' #登录界面的url

post_data = parse.urlencode({'username':'[email protected]','password':'wq15290884759.'}) 
#通过登录在抓包工具的Network找到login这个文件,里面有请求的url,UA,form date(filename,password),当然只能是小网站。。。。

req = request.Request(post_url,data=post_data.encode('utf-8'))      
#这里的post_date是一个字符串,用encode转换成字节形式。

opener.open(req)   #运行后这个opener就储存一个登录需要的cookie,这是服务器确认密码后返回的cookie

#2.访问个人网页
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
url = 'https://i.meishi.cc/cook.php?id=13686422'
rq = request.Request(url,headers=headers)
resp = opener.open(rq)  #使用包含cookie的opener
print(resp.read().decode('utf-8'))

根据上面的模式就可以写上你的账号,密码去登录网站了。。。。

保存cookie到文件

FileCookieJar这个对象,建立LWPCookieJar实例,可以存Set-Cookie3类型的文件。而MozillaCookieJar类是存为’.txt’格式的文件.在这里我们使用它的子类MozillaCookieJar来实现Cookie的保存

from urllib import request
from http.cookiejar import MozillaCookieJar

# 保存
cookiejar = MozillaCookieJar('cookie.txt')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.baidu.com/')

cookiejar.save(ignore_discard=True,ignore_expires=True)

在查看网站信息可以看见,cookie是有到期时间的,比如:浏览会话结束时就没了。所有通过设置参数保存别舍弃的cookie。
ignore_discard=True 即使cookies即将被丢弃也要保存下来
ignore_expires=True 如果cookies已经过期也将它保存并且文件已存在时将覆盖

从本地加载cookie信息

cookiejar = MozillaCookieJar('cookie.txt')
cookiejar.load()   #加载,也是有 ignore_discard  ignore_expires两个参数的
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.httpbin.org/cookies/set/course/abc')

for cookie in cookiejar:
    print(cookie)
发布了25 篇原创文章 · 获赞 0 · 访问量 291

猜你喜欢

转载自blog.csdn.net/weixin_46192930/article/details/105135087