爬虫之——初识cookie

爬虫之——初识cookie

什么是cookie?

在网站中,http的请求是无状态的。也就是说即使第一次和服务器连接后并登录成功后,发出第二次请求的时候,服务器依然不知道当前请求是哪个用户。cookie的出现就是为了解决这个问题。第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动地携带给服务器,服务器通过浏览器携带的数据就能判断当前的数据是哪一个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB,因此使用cookie只能存储一些少量的数据。

cookie的格式
Set-Cookie:NAME=VALUE:Expires/Max-age-DATE:Path=PATH:Domain=DOMAIN_NAME:SECURE

参数的意义:

  • NAME:cookie的名字。
  • VALUE:cookie的值。
  • Expires:cookie的过期时间。
  • Path:coolie作用的路径。
  • Domain:cookie作用的域名。
  • SECURE:是否只在https协议下起作用。

1.使用cookielib库和HTTPCookieProcessor模拟登录【暴力登录法】

cookie可以保持登录信息到用户下次与服务器的会话。

from urllib import request
url="http://www.renren.com/880151247/profile"
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
"Cookie":"登录人人网后-访问目标主页的cookie"}
req=request.Request(url=url,headers=headers)
resp=request.urlopen(req)
with open('renren.html','w',encoding='utf-8') as fp:
	fp.write(resp.read().decode('utf-8'))

在这里插入图片描述

为什么称为暴力登录法呢?

因为该方法每次使用时,必须要到目标网页复制cookie。

2.使用http.cookiejar实现自动化登录

该模块主要的类有CookieJar,FileCookieJar,MozillaCookieJar,LWPCookieJar。这四个类的作用分别如下:

  1. CookieJar:管理HTTPcookie值,存储HTTP请求生成cookie,向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
  2. FileCookieJar:从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问文件,即只有在需要时才读取文件或在文件中存储数据。
  3. MozillaCookieJar:从FileCookieJar派生而来,创建与Mozilla浏览器cookie.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

headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
# 1.登录
def get_opener():
# 1.1.创建一个cookiejar对象
    cookiejar=CookieJar()
# 1.2.使用cookiejar创建一个HTTPCookieProcessor对象
    handler=request.HTTPCookieProcessor(cookiejar)
# 1.3使用上一步创建的handler创建一个opener
    opener=request.build_opener(handler)
    return opener
def login(opener):
# 1.4使用opener发送登录的请求

    data={
        'email':"人人网用户的邮箱账号",
        'password':"密码"
    }
    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)
#2.访问主页
def visit(opener):
    url="http://www.renren.com/880151247/profile"
    #获取个人主页页面的时候,不要新建一个opener,应该使用之前的饿opener,因为它已经包含了之前的opener
    resp=opener.open(url)
    req=request.Request(url,headers=headers)
    resp=opener.open(req)
    with open("renren5.html",'w',encoding='utf-8') as fp:
        fp.write(resp.read().decode('utf-8'))

if __name__ == '__main__':
    opener=get_opener()
    login(opener)
    visit(opener)

3.cookie信息的保存与加载

保存

将cookie保存到本地可以使用cookiejar的save方法。【使用前提:指定一个文件名】
指定当前目录下的cookiejar.txt为存储位置

from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar=MozillaCookieJar("cookiejar.txt")
handler=request.HTTPCookieProcessor(cookiejar)
opener=request.build_opener(handler)
resp=opener.open('http://www.baidu.com/')
#如果前方没有指定存储的文件的话,在save的参数中需要写上指定的文件名称
cookiejar.save()

通过上述的操作,我们可以获取到百度的cookie
在这里插入图片描述
####修改/设置cookie
我们可以通过地址栏设置cookie:

http://httpbin.org/cookies/set?course=spider

在这里插入图片描述
当前浏览器关闭,则现有的cookie均过期。而这个放在程序中的体现就是当程序运行结束后,cookie过期。故要想通过代码的形式保存cookie,需要在save方法中添加参数“ignore_discard=True"。这样可以实现即将过期的cookie的信息存储。

from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar=MozillaCookieJar("cookiejar.txt")
handler=request.HTTPCookieProcessor(cookiejar)
opener=request.build_opener(handler)
resp=opener.open('http://www.baidu.com/')
cookiejar.save()
resp=opener.open('http://httpbin.org/cookies/set?course=aha')
cookiejar.save(ignore_discard=True)

在这里插入图片描述

加载

如果浏览器已经关闭或设置cookie的程序已经结束,则需要在load方法中设置“ignore_discard=True”,来加载过期的cookie信息

from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar=MozillaCookieJar("cookiejar.txt")
#加载已经过期的cookie信息
cookiejar.load(ignore_discard=True)
handler=request.HTTPCookieProcessor(cookiejar)
opener=request.build_opener(handler)
resp=opener.open('http://httpbin.org/cookies')
for cookie in cookiejar:
    print(cookie)

在这里插入图片描述

小曦有话说:如果准备使用爬虫爬取网页内容,一定的web知识必不可少呦。本篇文章的内容为学习https://www.bilibili.com/video/BV1aJ411C7oM?from=search&seid=11265456435626878235系列的笔记

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值