Python爬蟲(chóng)中urllib庫(kù)的使用進(jìn)階--cookie的使用

什么是cookie:

在網(wǎng)站中绣夺,http請(qǐng)求是無(wú)狀態(tài)的。也就是說(shuō)即使第一次和服務(wù)器連接后并且登錄成功后荆秦,第二次請(qǐng)求服務(wù)器依然不能知道當(dāng)前請(qǐng)求是哪個(gè)用戶背捌。cookie的出現(xiàn)就是為了解決這個(gè)問(wèn)題,第一次登錄后服務(wù)器返回一些數(shù)據(jù)(cookie)給瀏覽器路狮,然后瀏覽器保存在本地虫啥,當(dāng)該用戶發(fā)送第二次請(qǐng)求的時(shí)候,就會(huì)自動(dòng)的把上次請(qǐng)求存儲(chǔ)的cookie數(shù)據(jù)自動(dòng)的攜帶給服務(wù)器奄妨,服務(wù)器通過(guò)瀏覽器攜帶的數(shù)據(jù)就能判斷當(dāng)前用戶是哪個(gè)了涂籽。cookie存儲(chǔ)的數(shù)據(jù)量有限,不同的瀏覽器有不同的存儲(chǔ)大小砸抛,但一般不超過(guò)4KB评雌。因此使用cookie只能存儲(chǔ)一些小量的數(shù)據(jù)。

cookie的格式:

Set-Cookie: NAME=VALUE直焙;Expires/Max-age=DATE景东;Path=PATH;Domain=DOMAIN_NAME奔誓;SECURE

參數(shù)意義:

  • NAME:cookie的名字耐薯。
  • VALUE:cookie的值。
  • Expires:cookie的過(guò)期時(shí)間丝里。
  • Path:cookie作用的路徑曲初。
  • Domain:cookie作用的域名。
  • SECURE:是否只在https協(xié)議下起作用杯聚。

使用cookielib庫(kù)和HTTPCookieProcessor模擬登錄:

Cookie 是指網(wǎng)站服務(wù)器為了辨別用戶身份和進(jìn)行Session跟蹤臼婆,而儲(chǔ)存在用戶瀏覽器上的文本文件,Cookie可以保持登錄信息到用戶下次與服務(wù)器的會(huì)話幌绍。
這里以人人網(wǎng)為例颁褂。人人網(wǎng)中故响,要訪問(wèn)某個(gè)人的主頁(yè),必須先登錄才能訪問(wèn)颁独,登錄說(shuō)白了就是要有cookie信息彩届。那么如果我們想要用代碼的方式訪問(wèn),就必須要有正確的cookie信息才能訪問(wèn)誓酒。解決方案有兩種樟蠕,第一種是使用瀏覽器訪問(wèn),然后將cookie信息復(fù)制下來(lái)靠柑,放到headers中寨辩。示例代碼如下:

from urllib import request

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
    'Cookie': 'anonymid=jacdwz2x-8bjldx; depovince=GW; _r01_=1; _ga=GA1.2.1455063316.1511436360; _gid=GA1.2.862627163.1511436360; wp=1; JSESSIONID=abczwY8ecd4xz8RJcyP-v; jebecookies=d4497791-9d41-4269-9e2b-3858d4989785|||||; ick_login=884e75d4-f361-4cff-94bb-81fe6c42b220; _de=EA5778F44555C091303554EBBEB4676C696BF75400CE19CC; p=61a3c7d0d4b2d1e991095353f83fa2141; first_login_flag=1; ln_uact=970138074@qq.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn121/20170428/1700/main_nhiB_aebd0000854a1986.jpg; t=3dd84a3117737e819dd2c32f1cdb91d01; societyguester=3dd84a3117737e819dd2c32f1cdb91d01; id=443362311; xnsid=169efdc0; loginfrom=syshome; ch_id=10016; jebe_key=9c062f5a-4335-4a91-bf7a-970f8b86a64e%7Ca022c303305d1b2ab6b5089643e4b5de%7C1511449232839%7C1; wp_fold=0'
}

url = 'http://www.renren.com/880151247/profile'

req = request.Request(url,headers=headers)
resp = request.urlopen(req)
with open('renren.html','w') as fp:
    fp.write(resp.read().decode('utf-8'))

但是每次在訪問(wèn)需要cookie的頁(yè)面都要從瀏覽器中復(fù)制cookie比較麻煩。在Python處理Cookie歼冰,一般是通過(guò)http.cookiejar模塊和urllib模塊的HTTPCookieProcessor處理器類一起使用靡狞。http.cookiejar模塊主要作用是提供用于存儲(chǔ)cookie的對(duì)象。而HTTPCookieProcessor處理器主要作用是處理這些cookie對(duì)象隔嫡,并構(gòu)建handler對(duì)象甸怕。

http.cookiejar模塊:

該模塊主要的類有CookieJar、FileCookieJar腮恩、MozillaCookieJar梢杭、LWPCookieJar。這四個(gè)類的作用分別如下:

CookieJar:管理HTTP cookie值庆揪、存儲(chǔ)HTTP請(qǐng)求生成的cookie式曲、向傳出的HTTP請(qǐng)求添加cookie的對(duì)象。整個(gè)cookie都存儲(chǔ)在內(nèi)存中缸榛,對(duì)CookieJar實(shí)例進(jìn)行垃圾回收后cookie也將丟失吝羞。
FileCookieJar (filename,delayload=None,policy=None):從CookieJar派生而來(lái),用來(lái)創(chuàng)建FileCookieJar實(shí)例内颗,檢索cookie信息并將cookie存儲(chǔ)到文件中钧排。filename是存儲(chǔ)cookie的文件名。delayload為True時(shí)支持延遲訪問(wèn)訪問(wèn)文件均澳,即只有在需要時(shí)才讀取文件或在文件中存儲(chǔ)數(shù)據(jù)恨溜。
MozillaCookieJar (filename,delayload=None,policy=None):從FileCookieJar派生而來(lái),創(chuàng)建與Mozilla瀏覽器 cookies.txt兼容的FileCookieJar實(shí)例找前。
LWPCookieJar (filename,delayload=None,policy=None):從FileCookieJar派生而來(lái)糟袁,創(chuàng)建與libwww-perl標(biāo)準(zhǔn)的 Set-Cookie3 文件格式兼容的FileCookieJar實(shí)例。

登錄人人網(wǎng):

利用http.cookiejarrequest.HTTPCookieProcessor登錄人人網(wǎng)躺盛。相關(guān)示例代碼如下:

from urllib import request,parse
from http.cookiejar import CookieJar

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
}

def get_opener():
    cookiejar = CookieJar()
    handler = request.HTTPCookieProcessor(cookiejar)
    opener = request.build_opener(handler)
    return opener

def login_renren(opener):
    data = {"email": "970138074@qq.com", "password": "pythonspider"}
    data = parse.urlencode(data).encode('utf-8')
    login_url = "http://www.renren.com/PLogin.do"
    req = request.Request(login_url, headers=headers, data=data)
    opener.open(req)

def visit_profile(opener):
    url = 'http://www.renren.com/880151247/profile'
    req = request.Request(url,headers=headers)
    resp = opener.open(req)
    with open('renren.html','w') as fp:
        fp.write(resp.read().decode("utf-8"))

if __name__ == '__main__':
    opener = get_opener()
    login_renren(opener)
    visit_profile(opener)

保存cookie到本地:

保存cookie到本地项戴,可以使用cookiejarsave方法,并且需要指定一個(gè)文件名:

from urllib import request
from http.cookiejar import MozillaCookieJar

cookiejar = MozillaCookieJar("cookie.txt")
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
}
req = request.Request('http://httpbin.org/cookies',headers=headers)

resp = opener.open(req)
print(resp.read())
cookiejar.save(ignore_discard=True,ignore_expires=True)

從本地加載cookie:

從本地加載cookie槽惫,需要使用cookiejarload方法周叮,并且也需要指定方法:

from urllib import request
from http.cookiejar import MozillaCookieJar

cookiejar = MozillaCookieJar("cookie.txt")
cookiejar.load(ignore_expires=True,ignore_discard=True)
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
}
req = request.Request('http://httpbin.org/cookies',headers=headers)

resp = opener.open(req)
print(resp.read())
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辩撑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仿耽,更是在濱河造成了極大的恐慌合冀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件项贺,死亡現(xiàn)場(chǎng)離奇詭異君躺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)敬扛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門晰洒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)朝抖,“玉大人啥箭,你說(shuō)我怎么就攤上這事≈涡” “怎么了急侥?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)侮邀。 經(jīng)常有香客問(wèn)我坏怪,道長(zhǎng),這世上最難降的妖魔是什么绊茧? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任铝宵,我火速辦了婚禮,結(jié)果婚禮上华畏,老公的妹妹穿的比我還像新娘鹏秋。我一直安慰自己,他們只是感情好亡笑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布侣夷。 她就那樣靜靜地躺著,像睡著了一般仑乌。 火紅的嫁衣襯著肌膚如雪百拓。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天晰甚,我揣著相機(jī)與錄音衙传,去河邊找鬼。 笑死厕九,一個(gè)胖子當(dāng)著我的面吹牛蓖捶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播止剖,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腺阳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼落君!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起亭引,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绎速,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后焙蚓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纹冤,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年购公,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萌京。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宏浩,死狀恐怖知残,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情比庄,我是刑警寧澤求妹,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站佳窑,受9級(jí)特大地震影響制恍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜神凑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一净神、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溉委,春花似錦鹃唯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至型宝,卻和暖如春八匠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趴酣。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工梨树, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人岖寞。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓抡四,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子指巡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容