python-爬虫-网络请求(三)

系统 1452 0

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就已经成功的读取出来了


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论