python爬虫之使用cookie爬取登录后的界面、使用cookieFileJar保存cookie文件、cookie读取

本文介绍了Python爬虫中如何利用Cookie进行登录和访问登录后界面,包括Cookie与Session的区别、Cookie的属性、如何保存和读取Cookie到文件。通过FileCookieJar实例学习了如何自动使用和管理Cookie,实现模拟登录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、cookie & session简介

-由于http协议的无记忆性,人们为了弥补这个这个缺憾,所采用的一个补充协议

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

(1)cookie和session的区别

-存放位置不同

-cookie不安全

-session会保存在服务器上一定时间,会过期

-单个cookie保存数据不超过4K,很多浏览器限制一个站点最多保存20个

(2)session的存放位置

-存在服务器端

-一般情况,session是放在(想要速度快的话放内存)内存中或者(默认放)数据库中

-没有cookie登录,可以看到,没有使用cookie则反馈网页为未登录状态

from urllib import request
if __name__ == '__main__':
    url = "https://www.renren.com/965187997/profile"
    #req = request.Request(url)
    rsp = request.urlopen(url)
    html = rsp.read().decode()

'''
UnicodeEncodeError: 'gbk' codec can't encode character '\ue600' in position 145620: illegal multibyte sequence
解决:改为utf-8
'''
with open("rsp.html","w") as f:
    f.write(html)

2、cookie登录、访问、属性、保存

(1)直接把cookie复制下来,然后手动放入请求头(例:访问人人网)

# 爬虫使用cookie
from urllib import request

if __name__ == '__main__':
    url = "http://www.renren.com/970362268"

    headers = {
        "cookie":"_r01_=1; ick=1a32e31e-bdfa-408b-8b87-68ac0c4ff4c7; anonymid=ju9fbgww-soghnp; depovince=GW; JSESSIONID=abcb7WJ_ynJeK_VXV2aOw; ick_login=c85d8114-439e-4d82-8e5f-10646cd37430; t=62d2b8164ae2b729d12263c9f4c482e68; societyguester=62d2b8164ae2b729d12263c9f4c482e68; id=970362268; xnsid=ff14ddfa; ver=7.0; loginfrom=null; jebe_key=16d9bc6a-222a-40ce-af09-9a18a0663e8c%7C57573f7fa1d38d00970b98271913a7f8%7C1554793573096%7C1%7C1554793573019; jebecookies=a908f08f-6694-4188-bd7c-91c1b8bd1024|||||; wp_fold=0"
    }

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

    rsp = request.urlopen(req)
    html = rsp.read().decode()

    with open("rsp.html","w",encoding="utf-8")as f:
        # 将爬取的页面打印出来
        print(html)
        f.write(html)

(2)http模块包含一些关于cookie的模块,通过他们我们可以自动使用cookie

-CookieJar

        -管理存储cookie,向传出的http请求添加cookie

        -cookie存储在内存中,CookieJar实例回收后cookie将消失

-FileCookieJar

        -使用文件管理cookie

        -filename是保存cookie的文件

-MozillaCookieJar(filename,delayload=None,policy=None):

        -创建与mocilla浏览器cookie.txt兼容的FileCookieJar实例

-LwpCookieJar(filename,delayload=None,polcy=None):

         -创建与libwww-perl标准兼容的Set-Cookie3格式的FileCookieJar实例

-他们的关系是:CookieJar-->FileCookieJar-->MozillaCookieJar & LwpCookieJar

(3)利用cookiejar访问人人网

        -自动使用cookie登录,大致流程是

        -打开登录页面后自动通过用户名密码登录

        -自动提取反馈回来的cookie

        -利用提取的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:
    '''
    #人人网登陆界面查看源码,
    # <form method="post" id="loginForm" class="login-form" action="http://www.renren.com/PLogin.do">
    url = "http://www.renren.com/PLogin.do"

    data = {
        "email":"",#输入用户名
        "password":""#输入密码
    }

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

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

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

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

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

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

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

(4)handler是Handler的实例,常用有

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

-创立handler后使用opener打开,打开后相应的业务由相应的handler处理

-cookie作为一个变量打印出来

# 使用cookiejar
# 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
    url = 'http://www.renren.com/PLogin.do'

    id = input('请输入用户名:')
    pw = input('请输入密码:')

    data = {
        # 参数使用正确的用户名密码
        "email": id,
        "password": pw
    }
    # 把数据进行编码
    data = parse.urlencode(data)
    # 创建一个请求对象
    req = request.Request(url,data=data.encode('utf-8'))
    # 使用opener发起请求
    rsp = opener.open(req)

# 以上代码就可以进一步获取cookie了,cookie在哪呢?cookie在opener里
def getHomePage():
    # 地址是用在浏览器登录后的个人信息页地址
    url = "http://www.renren.com/970362268"

    # 如果已经执行login函数,则opener自动已经包含cookie
    rsp = opener.open(url)
    html = rsp.read().decode()

    with open("rsp1.html", "w", encoding="utf-8")as f:
        # 将爬取的页面
        print(html)
        f.write(html)

if __name__ == '__main__':
    login()
    # 执行完login之后,会得到授权之后的cookie,下一步打印出来
    print(cookie)
    for item in cookie:
        print(type(item))
        print(item)
        for i in dir(item):
            print(i)

(5)cookie的属性

-name:名称

-value:值

-domain:可以访问此cookie的域名

-path:可以访问此cookie的页面路径

-expires:过期时间

-size:大小

-Http字段

(6)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:
    '''
    #人人网登陆界面查看源码,
    # <form method="post" id="loginForm" class="login-form" action="http://www.renren.com/PLogin.do">
    url = "http://www.renren.com/PLogin.do"

    id = input("请输入用户名")
    pd = input("请输入密码")
    data = {
        "email":id,#输入用户名
        "password":pd#输入密码
    }

    #把数据进行编码
    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()

(7)cookie的读取

from urllib import request,parse
from http import cookiejar

#创建filecookiejar的实例
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/970362268"

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

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

if __name__ == '__main__':
    getHomePage()

 

 

      

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值