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

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