http.cookiejar
前面講到的cookie的使用,我們首先使用的是瀏覽器登陸之后,將中間的cookie取出來,之后將其應(yīng)用到代碼中,實(shí)現(xiàn)代碼請求的功能,但是顯然這樣并不是非常的完美,如果代碼能夠自動(dòng)的獲取到cookie并完成后續(xù)的工作會(huì)更加的完美
對于這個(gè)http.cookiejar,該模塊主要的類有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。對于這四類的作用非別如下:
1、CookieJar:管理HTTP cookie值,存儲(chǔ)HTTP請求生成的cookie、向傳出的HTTP請求添加cookie的對象,整個(gè)cookie都存儲(chǔ)在內(nèi)存中,對CookieJar實(shí)例進(jìn)行垃圾回收后cookie也將丟失
2、FileCookieJar:從CookieJar派生而來,用來創(chuàng)建FileCookieJar實(shí)例,檢索cookie信息并將cookie存儲(chǔ)到文件中,filename是存儲(chǔ)cookie的文件名,delayload為True時(shí)支持延遲訪問文件,即只有在需要時(shí)才需讀取文件或在文件中存儲(chǔ)數(shù)據(jù)
3、MozillaCookieJar:從FileCookieJar派生而來,創(chuàng)建與Mozilla瀏覽器cookies.txt兼容的FileCookieJar實(shí)例
4、LWPCookieJar:從FileCookieJar派生而來,創(chuàng)建與libwww-per標(biāo)準(zhǔn)的Set-Cookie3文件格式兼容的FileCookieJar實(shí)例
除了上面說到的http.cookiejar以外,還需要使用到request.HTTPCookieProcessor
示例:
from
urllib
import
request
from
urllib
import
parse
from
http
.
cookiejar
import
CookieJar
# 1、登陸
# 1.1、創(chuàng)建一個(gè)cookiejar對象
cookiejar
=
CookieJar
(
)
# 1.2、使用cookiejar創(chuàng)建一個(gè)HTTPCookieProcess對象
handler
=
request
.
HTTPCookieProcessor
(
cookiejar
)
# 1.3、使用上一步創(chuàng)建的handler創(chuàng)建一個(gè)opener
opener
=
request
.
build_opener
(
handler
)
# 1.4、使用opener發(fā)送登陸的請求
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
)
# 訪問個(gè)人主頁
dapeng_url
=
'http://www.renren.com/xxx/profile'
# 獲取個(gè)人主頁的頁面的時(shí)候,不要新建一個(gè)opener
# 而應(yīng)該使用之前的那個(gè)opener,因?yàn)橹暗哪莻€(gè)opener中間已經(jīng)包含了登陸所需要的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'
)
)
對于上面的代碼,看起來還是比較的亂,下面將其封裝成不同的函數(shù)
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
)
:
# 訪問個(gè)人主頁
dapeng_url
=
'http://www.renren.com/xxx/profile'
# 獲取個(gè)人主頁的頁面的時(shí)候,不要新建一個(gè)opener
# 而應(yīng)該使用之前的那個(gè)opener,因?yàn)橹暗哪莻€(gè)opener中間已經(jīng)包含了登陸所需要的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
(
)
這里需要了解到的是在實(shí)例化MozillaCookieJar時(shí)候,我們就能夠傳入需要最后將cookie保存到的文件名;如果在實(shí)例化的時(shí)候并沒有寫需要保存到哪個(gè)文件中間的話,在最后調(diào)用save方法的時(shí)候,也是可以將文件名放入其中的
將上面的命令執(zhí)行完成之后,就能夠得到如下的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是存在有生命周期的,如果超過這個(gè)時(shí)間,cookie就會(huì)消失
這里可以通過瀏覽器訪問http://httpbin.org/cookies/set?course=hahaha,這樣就會(huì)在瀏覽器中創(chuàng)建一個(gè)cookie的key是course,value是hahaha,但是當(dāng)瀏覽器關(guān)閉的時(shí)候,這個(gè)cookie就會(huì)隨之消失,代碼中間也是一樣,代碼執(zhí)行完成之后,cookie就會(huì)自動(dòng)消失,這個(gè)時(shí)候如果想要將這個(gè)過期的cookie也保存在本地文件中間,就需要使用到參數(shù)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
)
此時(shí)查看cookie.txt文件,可以看到如下的內(nèi)容
# 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的值就是我們設(shè)置的hahaha
上面介紹到將一個(gè)cookie信息寫入到一個(gè)文件中間,自然有存入就會(huì)有讀取,將一個(gè)cookie信息讀取出來的方式就是load方法
from
http
.
cookiejar
import
MozillaCookieJar
cookiejar
=
MozillaCookieJar
(
'cookie.txt'
)
cookiejar
.
load
(
ignore_discard
=
True
)
for
cookie
in
cookiejar
:
print
(
cookie
)
上面在load的時(shí)候一樣使用到了ignore_discard的參數(shù),表示忽略過期時(shí)間
打印出來的內(nèi)容如下:
<
Cookie course
=
hahaha
for
httpbin
.
org
/
>
可以看到,前面設(shè)置的course=hahaha就已經(jīng)成功的讀取出來了
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
