Python爬虫中cookie&session的介绍、以及使用cookie免密登陆

cookie & session

  • 由于http协议的无状态性,人们为了弥补这个,所采用的一个补充协议

  • cookie是发放给用户(即http浏览器)的一段信息,session是保存在服务器上对应的另一半信息,用来记录用户信息

  • cookie和session的区别

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

    • 存在服务器端
    • 一般情况下,session是放在内存中或服务器中
    • 没有cookie登陆,网页显示未登录状态
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)

# 此时rsp.html 可以看见是一大堆代码,使用pycharm浏览器运行,会出现人人网登陆界面
# 说:您的用户名和密码不匹配
  • cookie登陆
    • 可以直接把cookie复制下来,然后手动放入请求头
from urllib import request

if __name__ == '__main__':
    url = "http://www.renren.com/965187997/profile"
    headers = {
        "Cookie": "anonymid=jfosp2p2-48i1hh; depovince=BJ; _r01_=1; jebe_key=f2e12094-303b-4171-900f-ed304e5a5ba1%7C7629e5c8e0f7f334244eb5436ef05a2c%7C1523070488659%7C1%7C1523070515670; wp_fold=0; jebecookies=a201c15f-9745-40fc-9d32-7112f8cf849f|||||; ick_login=cbfe66e0-743c-46a4-a956-7d692056361d; _de=420A8DC764CD1624FC7C8526DA9A3A25; p=db36f5ff987e7e58c901f6194a22b7007; first_login_flag=1; ln_uact=13119144223; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; t=1b2976196819d4a57127f5b87ac495f77; societyguester=1b2976196819d4a57127f5b87ac495f77; id=965187997; xnsid=61e9001d; __utma=151146938.742687335.1523070758.1523070758.1523070758.1; __utmc=151146938; __utmz=151146938.1523070758.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=151146938.1.10.1523070758; ver=7.0; loginfrom=null; JSESSIONID=abcIxsy_d_tR06bwXfEkw; _urm_965187997=21"
    }
    req = request.Request(url, headers=headers)
    rsp = request.urlopen(req)

    html = rsp.read().decode()

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

  • http模块中包含一些关于cookie的模块,通过他们可以直接使用cookie
    • CookieJar
      • 管理存储cookie,向传出的http请求添加cookie
      • cookie存储在内存中,CookieJar实例回收后cookie将消失
    • FileCookieJar
      • 使用文件管理cookie
      • filename是管理cookie的文件
    • MozillaCookieJar
      • 创建与Mozilla浏览器cookie.txt兼容的FileCookieJar实例
    • LwpCookieJar
      • 创建与libwww-perl标准兼容的Set-Cookie3格式的FileCookieJar实例
    • 他们的关系是:CookieJar->FileCookieJar->MozillaCookieJar & LwpCookieJar
  • 利用cookieJar访问
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", encoding="utf-8") as f:
        f.write(html)


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

  • 自动使用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作为一个变量打印出来

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)
  • cookie的属性
    • name: 名称
    • value: 值
    • domain:可以访问此cookie的域名
    • path: 可以发昂文此cookie的页面路径
    • expires:过期时间
    • size: 大小
    • Http字段
  • cookie的保存-FileCookieJar
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到文件
    # ignore_discard表示及时cookie将要被丢弃也要保存下来
    # ignore_expire表示如果该文件中cookie即使已经过期,保存
    cookie.save(ignore_discard=True, ignore_expires=True)


if __name__ == '__main__':
    login()

cookie.txt

# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit.

.renren.com    TRUE   /  FALSE  1596953254 _de    420A8DC764CD1624FC7C8526DA9A3A25
.renren.com    TRUE   /  FALSE  1723529254 anonymid   jzca7tdg-xms625
.renren.com    TRUE   /  FALSE     first_login_flag   1
.renren.com    TRUE   /  FALSE     id 965187997
.renren.com    TRUE   /  FALSE  1568441254 ln_hurl    http://head.xiaonei.com/photos/0/0/men_main.gif
.renren.com    TRUE   /  FALSE  1568441254 ln_uact    13119144223
.renren.com    TRUE   /  FALSE     loginfrom  null
.renren.com    TRUE   /  FALSE     p  f1b69469c35a07f7192a7849920697647
.renren.com    TRUE   /  FALSE     societyguester 839062696cf90047e26724167f08c6f67
.renren.com    TRUE   /  FALSE     t  839062696cf90047e26724167f08c6f67
.renren.com    TRUE   /  FALSE     ver    7.0
.renren.com    TRUE   /  FALSE     xnsid  6c1c8566
.renren.com    TRUE   /xtalk/    FALSE     t  3525c7fd556f545d1044f72b049494f5
www.renren.com FALSE  /  FALSE     JSESSIONID abcDGW184RB1xeWR34tYw

  • cookie的读取
from urllib import request, parse
from http import cookiejar

#  创建cookiejar的实例
cookie = cookiejar.MozillaCookieJar()
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",encoding="utf-8") as f:
        f.write(html)


if __name__ == '__main__':
    getHomePage()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值