http.cookiejar
前面讲到的cookie的使用,我们首先使用的是浏览器登陆之后,将中间的cookie取出来,之后将其应用到代码中,实现代码请求的功能,但是显然这样并不是非常的完美,如果代码能够自动的获取到cookie并完成后续的工作会更加的完美
对于这个http.cookiejar,该模块主要的类有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。对于这四类的作用非别如下:
1、CookieJar:管理HTTP cookie值,存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象,整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失
2、FileCookieJar:从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中,filename是存储cookie的文件名,delayload为True时支持延迟访问文件,即只有在需要时才需读取文件或在文件中存储数据
3、MozillaCookieJar:从FileCookieJar派生而来,创建与Mozilla浏览器cookies.txt兼容的FileCookieJar实例
4、LWPCookieJar:从FileCookieJar派生而来,创建与libwww-per标准的Set-Cookie3文件格式兼容的FileCookieJar实例
除了上面说到的http.cookiejar以外,还需要使用到request.HTTPCookieProcessor
示例:
from
urllib
import
request
from
urllib
import
parse
from
http
.
cookiejar
import
CookieJar
# 1、登陆
# 1.1、创建一个cookiejar对象
cookiejar
=
CookieJar
(
)
# 1.2、使用cookiejar创建一个HTTPCookieProcess对象
handler
=
request
.
HTTPCookieProcessor
(
cookiejar
)
# 1.3、使用上一步创建的handler创建一个opener
opener
=
request
.
build_opener
(
handler
)
# 1.4、使用opener发送登陆的请求
headers
=
{
'User-Agent'
:
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
data
=
{
'email'
:
'xxx@qq.com'
,
'password'
:
'xxx'
}
login_url
=
'http://www.renren.com/PLogin.do'
req
=
request
.
Request
(
login_url
,
data
=
parse
.
urlencode
(
data
)
.
encode
(
'utf-8'
)
,
headers
=
headers
)
opener
.
open
(
req
)
# 访问个人主页
dapeng_url
=
'http://www.renren.com/xxx/profile'
# 获取个人主页的页面的时候,不要新建一个opener
# 而应该使用之前的那个opener,因为之前的那个opener中间已经包含了登陆所需要的cookie信息
req
=
request
.
Request
(
dapeng_url
,
headers
=
headers
)
resp
=
opener
.
open
(
req
)
with
open
(
'renren.html'
,
'w'
,
encoding
=
'utf-8'
)
as
fw
:
fw
.
write
(
resp
.
read
(
)
.
decode
(
'utf-8'
)
)
对于上面的代码,看起来还是比较的乱,下面将其封装成不同的函数
from
urllib
import
request
from
urllib
import
parse
from
http
.
cookiejar
import
CookieJar
headers
=
{
'User-Agent'
:
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
def
get_opener
(
)
:
cookiejar
=
CookieJar
(
)
handler
=
request
.
HTTPCookieProcessor
(
cookiejar
)
opener
=
request
.
build_opener
(
handler
)
def
login_renren
(
opener
)
:
data
=
{
'email'
:
'xxx@qq.com'
,
'password'
:
'xxx'
}
login_url
=
'http://www.renren.com/PLogin.do'
req
=
request
.
Request
(
login_url
,
data
=
parse
.
urlencode
(
data
)
.
encode
(
'utf-8'
)
,
headers
=
headers
)
opener
.
open
(
req
)
def
visit_profile
(
opener
)
:
# 访问个人主页
dapeng_url
=
'http://www.renren.com/xxx/profile'
# 获取个人主页的页面的时候,不要新建一个opener
# 而应该使用之前的那个opener,因为之前的那个opener中间已经包含了登陆所需要的cookie信息
req
=
request
.
Request
(
dapeng_url
,
headers
=
headers
)
resp
=
opener
.
open
(
req
)
with
open
(
'renren.html'
,
'w'
,
encoding
=
'utf-8'
)
as
fw
:
fw
.
write
(
resp
.
read
(
)
.
decode
(
'utf-8'
)
)
if
__name__
==
'__main__'
:
opener
=
get_opener
(
)
login_renren
(
opener
)
visit_profile
(
opener
)
保存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
(
)
这里需要了解到的是在实例化MozillaCookieJar时候,我们就能够传入需要最后将cookie保存到的文件名;如果在实例化的时候并没有写需要保存到哪个文件中间的话,在最后调用save方法的时候,也是可以将文件名放入其中的
将上面的命令执行完成之后,就能够得到如下的cookie.txt文件
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file! Do not edit.
.
baidu
.
com TRUE
/
FALSE
3713864400
BAIDUID AE67114AD42FA696B9C9139CD37B0806
:
FG
=
1
.
baidu
.
com TRUE
/
FALSE
3713864400
BIDUPSID AE67114AD42FA696B9C9139CD37B0806
.
baidu
.
com TRUE
/
FALSE
3713864400
PSTM
1566380753
前面说到cookie是存在有生命周期的,如果超过这个时间,cookie就会消失
这里可以通过浏览器访问http://httpbin.org/cookies/set?course=hahaha,这样就会在浏览器中创建一个cookie的key是course,value是hahaha,但是当浏览器关闭的时候,这个cookie就会随之消失,代码中间也是一样,代码执行完成之后,cookie就会自动消失,这个时候如果想要将这个过期的cookie也保存在本地文件中间,就需要使用到参数ignore_discard=True了,如下面代码所示
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://httpbin.org/cookies/set?course=hahaha'
)
cookiejar
.
save
(
ignore_discard
=
True
)
此时查看cookie.txt文件,可以看到如下的内容
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file! Do not edit.
httpbin
.
org FALSE
/
FALSE course hahaha
可以看到,中间的course的值就是我们设置的hahaha
上面介绍到将一个cookie信息写入到一个文件中间,自然有存入就会有读取,将一个cookie信息读取出来的方式就是load方法
from
http
.
cookiejar
import
MozillaCookieJar
cookiejar
=
MozillaCookieJar
(
'cookie.txt'
)
cookiejar
.
load
(
ignore_discard
=
True
)
for
cookie
in
cookiejar
:
print
(
cookie
)
上面在load的时候一样使用到了ignore_discard的参数,表示忽略过期时间
打印出来的内容如下:
<
Cookie course
=
hahaha
for
httpbin
.
org
/
>
可以看到,前面设置的course=hahaha就已经成功的读取出来了