最近两个晚上在写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)
<[, ]>
下面的总结感谢此文章给的提示:为 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值给卡住了,差点就崩溃了啊,果然还是网上各种大神给力~