美文网首页
Urllib库的使用九---进阶四(Cookiejar的使用)

Urllib库的使用九---进阶四(Cookiejar的使用)

作者: IT的咸鱼 | 来源:发表于2018-10-18 15:24 被阅读0次
    通过上篇的代码可以看到其实是实现了获取Cookie,通过Cookie来请求网页数据的 但是这样很明显不够灵活,也不够复杂,我们有没有方便一点的做法呢?

    cookiejar库 和 HTTPCookieProcessor处理器

    • 在Python处理Cookie,一般是通过cookiejar模块和 urllib模块的HTTPCookieProcessor处理器类一起使用。

    cookiejar模块:主要作用是提供用于存储cookie的对象
    HTTPCookieProcessor处理器:主要作用是处理这些cookie对象,并构建handler对象。

    cookiejar 库

    • 该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

    • CookieJar
      管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。

    • FileCookieJar (filename,delayload=None,policy=None)
      从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。

    • MozillaCookieJar (filename,delayload=None,policy=None)
      从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。

    • LWPCookieJar (filename,delayload=None,policy=None)
      从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。

    其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar()

    实例一

    获取Cookie,并保存到CookieJar()对象中:
    # urllib_cookiejar_test1.py
    import urllib
    from http import cookiejar
    # 构建一个CookieJar对象实例来保存cookie
    cookiejar = cookiejar.CookieJar()
    # 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
    handler=urllib.request.HTTPCookieProcessor(cookiejar)
    # 通过 build_opener() 来构建opener
    opener = urllib.request.build_opener(handler)
    # 4. 以get方法访问页面,访问之后会自动保存cookie到cookiejar中
    opener.open("http://www.baidu.com")
    ## 可以按标准格式将保存的Cookie打印出来
    cookieStr = ""
    for item in cookiejar:
        cookieStr = cookieStr + item.name + "=" + item.value + ";"
    
    ## 舍去最后一位的分号
    print (cookieStr[:-1])
    #我们使用以上方法将Cookie保存到cookiejar对象中
    

    实例二

    使用MozillaCookjar() 访问网站或者cookie,并且把获得的cookie保存在创建的cookie文件中
    import urllib.request
    import http.cookiejar
    #设置文件名
    filename = 'cookie.txt'
    # 声明一个MozillaCookieJar对象,MozillaCookieJar (filename,delayload=None,policy=None)
    cookiejar = http.cookiejar.MozillaCookieJar(filename)
    # 使用HTTPCookieProcessor()创建cookie处理器对象
    handler = urllib.request.HTTPCookieProcessor(cookiejar)
    #通过build_opener()来构造opener
    opener = urllib.request.build_opener(handler)
    #使用opener.open创建一个请求
    response = opener.open('http://www.baidu.com')
    #保存cookie到本地文件,cookie.txt
    cookiejar.save()
    

    实例三

    MozillaCookjar() 从文件中获取cookies,作为请求的一部分去访问
    import urllib.request
    import http.cookiejar as cookiejar
    #实例化对象
    cookiejar = cookiejar.MozillaCookieJar()
    #要读取得cookie文件
    cookiejar.load('cookie.txt')
    for i in cookiejar:
        print(i.name,i.value)
    

    cookiejar和post模拟登录人人网

    模拟登录要注意几点:

    • 登录一般都会先有一个HTTP GET,用于拉取一些信息及获得Cookie,然后再HTTP POST登录。
    • HTTP POST登录的链接有可能是动态的,从GET返回的信息中获取。
    • password 有些是明文发送,有些是加密后发送。有些网站甚至采用动态加密的,同时包括了很多其他数据的加密信息,只能通过查看JS源码获得加密算法,再去破解加密,非常困难。
    • 大多数网站的登录整体流程是类似的,可能有些细节不一样,所以不能保证其他网站登录成功
    # -*- coding:utf-8 -*-
    import urllib.request
    import http.cookiejar as cookiejar
    from urllib import parse
    #1.构造一个CookieJar对象实例来保存cookie
    cookie = cookiejar.CookieJar()
    # 2.使用HTTPCookieProcessor()创建cookie处理器对象,
    # 参数为CookieJar()对象
    cookie_handler = urllib.request.HTTPCookieProcessor(cookie)
    #3.通过build_opener()来构建opener
    opener = urllib.request.build_opener(cookie_handler)
    #4.addheaders接受一个列表,里面每一个元素都是一个headers信息的元组
    #opener将会附带header信息
    opener.addheaders = [
        ('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0'),
    ]
    #5.需要登录账号和密码
    data = {
        'email':'账号',
        'password':'密码',
    }
    #6. 通过urlencode()转码
    postdata = parse.urlencode(data).encode('utf-8')
    #7. 构建Request请求对象,包含需要发送的用户名和密码
    request = urllib.request.Request("http://www.renren.com/PLogin.do", data = postdata)
    # 8. 通过opener发送这个请求,并获取登录后的Cookie值,
    opener.open(request)
    # 9. opener包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
    response = opener.open("http://www.renren.com/965722397/profile")
    
    #这里为了测试不添加cookie时访问改界面的效果
    #headers = {
    #    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 #Firefox/59.0',
    #}
    # request = urllib.request.Request('http://www.renren.com/965722397/profile',headers=headers)
    # response = urllib.request.urlopen(request)
    
    # 10. 打印响应内容
    #打印结果查看是否访问成功
    print(response.code)
    html = response.read()
    # print(html)
    
    with open('renren.html','wb') as f:
        f.write(html)
    

    相关文章

      网友评论

          本文标题:Urllib库的使用九---进阶四(Cookiejar的使用)

          本文链接:https://www.haomeiwen.com/subject/iifjzftx.html