日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python-爬蟲-網(wǎng)絡(luò)請求(三)

系統(tǒng) 1754 0

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)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 华阴市| 沅江市| 大港区| 绿春县| 中方县| 万盛区| 台北县| 正蓝旗| 铜川市| 富源县| 灌云县| 塔城市| 永城市| 隆林| 安仁县| 聂拉木县| 渝北区| 山丹县| 闽侯县| 简阳市| 故城县| 舞阳县| 泸水县| 顺义区| 沭阳县| 息烽县| 谢通门县| 阿克苏市| 砀山县| 罗田县| 峡江县| 禹城市| 县级市| 晴隆县| 夏津县| 尖扎县| 怀集县| 武邑县| 清新县| 兴海县| 富裕县|