python中Cookies使用的几点总结

最近两个晚上在写python查询考试成绩的客户端,发现太虐心了啊。本身难度其实不大,核心内容就是各种POST和GET,当然还有BeautifulSoup的各种运用。但由于学校信息门户和教务系统都是基于ASP.NET进行开发,而且各种接口不明确,所以今晚被cookies这一块卡住了一个多小时= =具体的问题等程序写好的时候再总结吧,今天主要总结cookies模块的运用。

python 3.x之后,cookies的相关类被放到了http.cookies里面,2.x具体放哪里忘记了- -

使用SimpleCookie可以创建一个http头部的cookie语句:

from http import cookies

C = cookies.SimpleCookie()
C["fig"] = "newton"
C["sugar"] = "wafer"

>>> print (C)

Set-Cookie: fig=newton
Set-Cookie: sugar=wafer

还可以给cookie指定参数,如:path、domain等:(所有参数:expires、path、comment、domain、max-age、secure、version、httponly)

from http import cookies

C = cookies.SimpleCookie()
C["test"] = "road"
C["test"]["path"] = "/"
C["test"]["domain"] = ".hack0nair.me"

>>> print (C)

Set-Cookie: test=road; path=/; domain=.hack0nair.me

 更详细的使用方法查看官方文档:http.cookies


python一般用opener(urllib.request)去模拟一个浏览器发送请求,同时python还提供了一个CookieJar的库帮助我们管理cookies。只要在build_opener的时候加上CookieJar,那之后浏览过程产生的cookies就由它进行管理了,我们根本不用关心它如何运行:

from urllib import request
from http import cookiejar

CJ = cookiejar.CookieJar() #创建cookiejar对象
OPENER = request.build_opener(request.HTTPCookieProcessor(CJ)) #创建opener对象,并把刚才创建的cookiejar放到opener里面
request.install_opener(self._OPENER) #初始化opener

想要查看cookiejar中保存了哪些cookies,直接输出即可:

from http import cookiejar

CJ = cookiejar.CookieJar()

...

>>> print (CJ)

<<class 'http.cookiejar.CookieJar'>[<Cookie iPlanetDirectoryPro=AQIC5wM2Lf89y3hr2hfDxVOrp2rg0GOpXeKJFgJjB7VrY%3D%40AAJTSQACMDI%3D%23 for .hack0nair.me/>, <Cookie ASP.NET_SessionId=sy3rdcqznb4fuio2f23rt45 for mail.hack0nair.me/>]>

下面的总结感谢此文章给的提示:为 Python 的 HTTP 客户端加入自定义的 Cookie

很多时候我们都希望在发送请求的时候加入自定义cookie值,但是不管是 HTTPCookieProcessor 还是 cookielib 里的 CookieJar 都没有提供类似的方法可以来实现。解决方法是,写一个handler,然后把想加入的cookie值强制加入到request对象的header中去。

所需要的handler如下:

from urllib import request

class SimpleCookieHandler(request.BaseHandler):
    def http_request(self, req):
        simple_cookie = 'LAST_PORTAL_PAGE=p346'   #这里填自定义cookie值
        if not req.has_header('Cookie'):
            req.add_unredirected_header('Cookie', simple_cookie)  #如果header中cookie为空,则创建cookie对象并把cookie值放进去
        else:
            cookie = req.get_header('Cookie')
            req.add_unredirected_header('Cookie', simple_cookie + '; ' + cookie)  #如果header中已经存在cookie,则把自定义cookie插到已有cookie的末尾
        return req

然后,构造 opener 的时候加上这个 handler 就可以了:

from urllib import request

opener = request.build_opener(request.HTTPCookieProcessor(), SimpleCookieHandler())

PS.刚才就是在写客户端的时候被自定义cookie值给卡住了,差点就崩溃了啊,果然还是网上各种大神给力~

« 返回