Python之爬虫-- cookie & session

目录

cookie & session

cookie和session的区别

session的存放位置

使用cookie登录

利用cookiejar访问人人, 案例3

cookie的保存-FileCookieJar, 案例5

cookie的读取, 案例6 

案例1: 

案例2: 

案例3: 

案例4: 

案例5: 

案例6: 


为什么要使用Cookie

    Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容,登陆前与登陆后是不同的,或者不允许的。 使用Cookie和使用代理IP一样,也需要创建一个自己的opener。在HTTP包中,提供了cookiejar模块,用于提供对Cookie的支持。

 cookie & session

  • 由于http协议的无记忆性,人们为了弥补这个缺憾,所采用的一个补充协议
  • cookie是发放给用户(即http浏览器)的一段信息,session是保存在服务器上的对应的另一半信息,用来记录用户信息,可以用F12查看Network中点击name中的信息然后可以查看cookie信息

cookie和session的区别

  • 存放位置不同
  • cookie不安全
  • session会保存在服务器上一定时间,会过期
  • 单个cookie保存数据不超过4k, 很多浏览器限制一个站点最多保存20个

session的存放位置

  • 存在服务器端
  • 一般情况,session是放在内存中或者数据库中
  • 没有cookie登录 ,可以看到,没使用cookie则反馈网页为未登录状态
  • 案例1 

使用cookie登录

  • http.cookiejar功能强大,我们可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
  • 手动)直接把cookie复制下来,然后手动放入请求头
    • 案例 2
  • 自动)http模块包含一些关于cookie的模块,通过他们我们可以自动使用cookie
    • CookieJar
      • 管理存储cookie,向传出的http请求添加cookie,
      • cookie存储在内存中,CookieJar实例回收后cookie将消失
    • FileCookieJar(filename, delayload=None, policy=None):
      • 使用文件管理cookie
      • filename是保存cookie的文件
    • MozillaCookieJar(filename, delayload=None, policy=None):
      • 创建与mocilla浏览器cookie.txt兼容的FileCookieJar实例
    • LwpCookieJar(filename, delayload=None, policy=None):
      • 创建与libwww-perl标准兼容的Set-Cookie3格式的FileCookieJar实例
    • 他们的关系是: CookieJar(派生出)-->FileCookieJar-->MozillaCookieJar & LwpCookieJar 
  • 工作原理:创建一个带有cookie的opener,在访问登录的URL时,将登录后的cookie保存下来,然后利用这个cookie来访问其他网址。查看登录之后才能看到的信息。
  • 利用cookiejar访问人人, 案例3

  • 自动使用cookie登录,大致流程是:
    • 打开登录页面后自动通过用户名密码登录
    • 自动提取反馈回来的cookie
    • 利用提取的cookie登录隐私页面 
  • handler是Handler的实例,用来处理复杂请求,常用参看案例代码
    •  # 生成 cookie的管理器
    • cookie_handler = request.HTTPCookieProcessor(cookie)
    • # 创建http请求管理器
    • http_handler = request.HTTPHandler()
    • # 生成https管理器
    • https_handler = request.HTTPSHandler()
  • 创立handler后,使用opener打开,打开后相应的业务由相应的hanlder处理 
  •  cookie作为一个变量,打印出来, 案例4
    • cookie的属性
      • name: 名称
      • value: 值
      • domain:可以访问此cookie的域名
      • path: 可以访问此cookie的页面路径
      • expires:过期时间
      • size: 大小
      • Http字段
  • cookie的保存-FileCookieJar, 案例5

  • cookie的读取, 案例6 

案例1: 

from urllib import request

if __name__ == '__main__':

    url = "http://www.renren.com/965187997/profile"

    rsp = request.urlopen(url)

    html = rsp.read().decode()

    with open("rsp.html", "w") as f:
        f.write(html)

案例2: 

from urllib import request

if __name__ == '__main__':

    url = "http://www.renren.com/965187997/profile"

    headers = {
#Cookie写的是网页中F12打开,然后看Cookie信息
        "Cookie": ""
    }

    req = request.Request(url, headers=headers)

    rsp = request.urlopen(req)

    html = rsp.read().decode()

    with open("rsp.html", "w") as f:
        f.write(html)

案例3: 

from urllib import request, parse
from http import cookiejar

#  创建cookiejar的实例
cookie = cookiejar.CookieJar()

# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()

# 生成https管理器
https_handler = request.HTTPSHandler()

# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)

def login():
    '''
    负责初次登录
    需要输入用户名密码,用来获取登录cookie凭证
    :return:
    '''

    # 发送登录信息的地址,此url需要从登录form的action属性中提取
    url = "http://www.renren.com/PLogin.do"

    # 此键值需要从登录form的两个对应input中提取name属性
    data = {
        "email": "13119144223",
        "password": "123456"
    }

    # 把数据进行编码
    data = parse.urlencode(data)

    # 创建一个请求对象
    req = request.Request(url, data=data.encode())

    # 使用opener发起请求
    rsp = opener.open(req)

def getHomePage():
    url = "http://www.renren.com/965187997/profile"

    # 如果已经执行了login函数,则opener自动已经包含相应的cookie值
    rsp = opener.open(url)

    html = rsp.read().decode()
    with open("rsp.html", "w") as f:
        f.write(html)

if __name__ == '__main__':
    login()
    getHomePage()

案例4: 

from urllib import request, parse
from http import cookiejar

#  创建cookiejar的实例
cookie = cookiejar.CookieJar()

# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()

# 生成https管理器
https_handler = request.HTTPSHandler()

# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)

def login():
    '''
    负责初次登录
    需要输入用户名密码,用来获取登录cookie凭证
    :return:
    '''

    # 此url需要从登录form的action属性中提取
    url = "http://www.renren.com/PLogin.do"

    # 此键值需要从登录form的两个对应input中提取name属性
    data = {
        "email": "13119144223",
        "password": "123456"
    }

    # 把数据进行编码
    data = parse.urlencode(data)

    # 创建一个请求对象
    req = request.Request(url, data=data.encode())

    # 使用opener发起请求
    rsp = opener.open(req)

if __name__ == '__main__':
    '''
    执行完login之后,会得到授权之后的cookie
    我们尝试把cookie打印出来
    '''
    login()

    print(cookie)
    for item in cookie:
        print(type(item))
        print(item)
        for i in dir(item):
            print(i)

案例5: 

from urllib import request, parse
from http import cookiejar

#  创建filecookiejar的实例
filename = "cookie.txt"
cookie = cookiejar.MozillaCookieJar(filename)

# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()

# 生成https管理器
https_handler = request.HTTPSHandler()

# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)

def login():
    '''
    负责初次登录
    需要输入用户名密码,用来获取登录cookie凭证
    :return:
    '''

    # 此url需要从登录form的action属性中提取
    url = "http://www.renren.com/PLogin.do"

    # 此键值需要从登录form的两个对应input中提取name属性
    data = {
        "email": "13119144223",
        "password": "123456"
    }

    # 把数据进行编码
    data = parse.urlencode(data)

    # 创建一个请求对象
    req = request.Request(url, data=data.encode())

    # 使用opener发起请求
    rsp = opener.open(req)

    # 保存cookie到文件
    # ignor_discard表示及时cookie将要被丢弃也要保存下来
    # ignore_expire表示如果该文件中cookie即使已经过期,保存
    cookie.save(ignore_discard=True, ignore_expires=True)


if __name__ == '__main__':
    login()

案例6: 

from urllib import request, parse
from http import cookiejar

#  创建cookiejar的实例
cookie = cookiejar.MozillaCookieJar()
#直接读取上一个案例得到的cookie
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)

# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()

# 生成https管理器
https_handler = request.HTTPSHandler()

# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)


def getHomePage():
    url = "http://www.renren.com/965187997/profile"

    # 如果已经执行了login函数,则opener自动已经包含相应的cookie值
    rsp = opener.open(url)


    html = rsp.read().decode()
    with open("rsp.html", "w") as f:
        f.write(html)

if __name__ == '__main__':
    getHomePage()

猜你喜欢

转载自blog.csdn.net/ydw_ydw/article/details/81988646