python网络爬虫系列(三)——cookie的原理、保存与加载

一、什么是cookie?

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

Set-Cookie:NAME=VALUE:Expires/Max-age=DATE;Path=PATH;Domain=DONAIIN_NAME;SECURE

参数意义:

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

使用cookielib库和HTTPCookieProcessor模拟登录:
Cookie是指网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户刻览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话。
这里以人人网为例。人人网中,要访问某个人的主页,必须先登录才能访问,登录说白了就是要有cookie信息。那么如果我们想要用代码的方式访问,就必须要有正确的cookie信息才能访问。解决方案有两种,第一种是使用刻览器访问,然后将cookie信息复制下来,放到headers中。示例代码如下:

from urllib import request# 1.不使用cookie请求大鹏主页
# dapeng_url = "http://www.renren.com/880151247/profile"
# headers = {
#     "User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
#
# }
#
# req = request.Request(url=dapeng_url,headers=headers)
# resp = request.urlopen(req)
# # print(resp.read().decode('utf-8'))
# with open('renren.html','w') as fp:
#     # write函数必须写入一个str的数据类型
#     # resp.read()读出来的是bytes数据类型
#     # bytes -> decode -> str
#     # str -> encode -> bytes
#     fp.write(resp.read().decode('utf-8'))# 2.使用cookie
dapeng_url = "http://www.renren.com/880151247/profile"
headers = {"User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36","Cookie":"anonymid=kc8gdto1-vg5rhe; depovince=ZGQT; _r01_=1; taihe_bi_sdk_uid=e248d1662297420b5f06cd39f5473be6; JSESSIONID=abcd7dz_b4rckd6y2ZEmx; taihe_bi_sdk_session=73ccff9edc2442cb1943f51498722d59; ick_login=917cc18b-cda3-4db0-9cfb-da1e66d794ed; t=7e664919cb492b651432f05ae73537fd8; societyguester=7e664919cb492b651432f05ae73537fd8; id=974712998; xnsid=e1262476; jebecookies=cc307376-600f-4a31-8694-23c4c218aecb|||||; ver=7.0; loginfrom=null; XNESSESSIONID=ac057eb05af7; WebOnLineNotice_974712998=1"}req = request.Request(url=dapeng_url,headers=headers)
resp = request.urlopen(req)
# print(resp.read().decode('utf-8'))
with open('renren1.html','w',encoding='utf-8') as fp:# write函数必须写入一个str的数据类型# resp.read()读出来的是bytes数据类型# bytes -> decode -> str# str -> encode -> bytesfp.write(resp.read().decode('utf-8'))

在这里插入图片描述
但是每次在访问需要cookie的页面都要从浏览器中复制cookiet较麻烦。在Python处理Cookie,一般是通过http.cookiejar模块和ur11ib惯块的HTTPCookieProcessor 处理器类一起使用。http.cookiejar模块主要作用是提供用于存储cookie的对象。
而HTTPCookieProcessor 处理器主要作用是处理这些cookie对象,并构建handler对象。

http.cookiejar模块:
该模块主要的类有CookieJar、FileCookieJar、MozllaCookieJar、LwPCookieJar。这四个类的作用分别如下:

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

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

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

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

利用http.cookiejar和request.HTTPCookieprocessor登录人人网。相关示例代码如下:

from urllib import request
from http.cookiejar import CookieJar
from urllib import parse# 1、登录
# 1.1 创建一个cookiejar对象
cookiejar = CookieJar()# 1.2 使用cookiejar创建一个HTTPCookieProcess对象
handler = request.HTTPCookieProcessor(cookiejar)# 1.3 使用上一步创建的handler创建一个opener
opener = request.build_opener(handler)# 1.4 使用opener发送登录请求(人人网的邮箱和密码)
headers = {
"User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
}
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、访问个人主页
dapeng_url = "http://www.renren.com/880151247/profile"
# 获取个人主页信息页面时,不要新建opener
# 应该使用前面创建好的opener,因为之前的那个opener已经包含了登录所需要的cookie信息
req = request.Request(dapeng_url,headers=headers)
resp = opener.open(req)
with open('renren2.html','w',encoding='utf-8') as fp :fp.write(resp.read().decode('utf-8'))
from urllib import request
from http.cookiejar import CookieJar
from urllib import parseheaders = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
}def get_opener():# 1、登录# 1.1 创建一个cookiejar对象cookiejar = CookieJar()# 1.2 使用cookiejar创建一个HTTPCookieProcess对象handler = request.HTTPCookieProcessor(cookiejar)# 1.3 使用上一步创建的handler创建一个openeropener = request.build_opener(handler)return openerdef login_renren(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)def visit_profile(opener):# 2、访问个人主页dapeng_url = "http://www.renren.com/880151247/profile"# 获取个人主页信息页面时,不要新建opener# 应该使用前面创建好的opener,因为之前的那个opener已经包含了登录所需要的cookie信息req = request.Request(dapeng_url, headers=headers)resp = opener.open(req)with open('renren3.html', 'w', encoding='utf-8') as fp:fp.write(resp.read().decode('utf-8'))if __name__ == '__main__':opener = get_opener()login_renren(opener)visit_profile(opener)

在这里插入图片描述

保存cookie到本地:
保存cookie到本地,可以使用cookiejarsave方法,并且需要指定一个文件名:

from urllib import request
from http.cookiejar import MozillaCookieJarcookiejar = MozillaCookieJar('cookie.txt')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)resp = opener.open('http://www.baidu.com/')cookiejar.save()

在这里插入图片描述
通过http://httpbin.org/cookies/set?course=abc 来设置cookie:

from urllib import request
from http.cookiejar import MozillaCookieJarcookiejar = MozillaCookieJar('cookie1.txt')
# cookiejar.load()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)# resp = opener.open('http://www.baidu.com/')
resp = opener.open('http://httpbin.org/cookies/set?course=abc')
# resp = opener.open('http://httpbin.org/cookies')
# for cookie in cookiejar:
#     print(cookie)
cookiejar.save(ignore_discard=True)

在这里插入图片描述
加载保存在本地的cookie:

from urllib import request
from http.cookiejar import MozillaCookieJarcookiejar = MozillaCookieJar('cookie1.txt')
cookiejar.load(ignore_discard=True) # 加载保存在本地的cookie
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)# resp = opener.open('http://www.baidu.com/')
# resp = opener.open('http://httpbin.org/cookies/set?course=abc')
resp = opener.open('http://httpbin.org/cookies')
for cookie in cookiejar:print(cookie)
# cookiejar.save(ignore_discard=True)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 2266. 统计打字方案数(动态规划)

文章目录1. 题目2. 解题1. 题目 Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。 为了 打出 一个字母,Alice 需要 按 对应字母 i 次,i 是该字母在这个按键上所处的位置。 比方说,为了按出字母 s ,Alice 需要按 7 四…

大学毕业4年-回顾和总结(2)-钱,收入和支出

过年回家,长辈最喜欢问两件事。第一件事,谈朋友没有啊。第二件事,现在一个月搞多少钱。 如果你和他们说,一个月工资是1万,那么他们立刻认为,你现在手上应该有十多万了。 上班族听了,心里…

python网络爬虫系列(四)——requests模块

requests模块 知识点: 掌握 headers参数的使用掌握 发送带参数的请求掌握 headers中携带cookie掌握 cookies参数的使用掌握 cookieJar的转换方法掌握 超时参数timeout的使用掌握 代理ip参数proxies的使用掌握 使用verify参数忽略CA证书掌握 requests模块发送post请…

PyQt5 基本窗口控件(绘图类 / 拖拽 / 剪贴板 / 日历时间 / 菜单、工具、状态栏 / 打印)

文章目录1. 窗口绘图类1.1 QPainter绘制文字绘制点1.2 QPen1.3 QBrush1.4 QPixmap2. 拖拽与剪贴板2.1 拖拽2.2 剪贴板 QClipboard3. 日历与时间3.1 QCalendar3.2 QDateTimeEdit4. 菜单栏、工具栏、状态栏4.1 菜单栏 QMenuBar4.2 工具栏 QToolBar4.3 状态栏 QStatusBar5. QPrint…

python网络爬虫系列(0)——爬虫概述 http协议复习

一、爬虫概述 知识点: 了解 爬虫的概念 了解 爬虫的作用 了解 爬虫的分类 掌握 爬虫的流程 1. 爬虫的概念 模拟浏览器,发送请求,获取响应 网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟客户端(主要指…

使用TFHpple解析html

https://github.com/topfunky/hpple 前期准备工作 引入静态库文件 添加库文件的 header search paths(注意,必须选中 All) 将从github上下载的源码包拖入工程当中 准备工作结束 使用详情 我们来解析网址 http://www.cnblogs.com/YouXianMing/ 中的title标签哦. 思路是这样子的:…

LeetCode 2269. 找到一个数字的 K 美丽值

文章目录1. 题目2. 解题1. 题目 一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目: 子字符串长度为 k 。子字符串能整除 num 。 给你整数 num 和 k ,请你返回 num 的 k 美丽值。 注意: 允许有 前缀 0 。 0 不能整除任…

LeetCode 2270. 分割数组的方案数(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始长度为 n 的整数数组 nums 。 如果以下描述为真,那么 nums 在下标 i 处有一个 合法的分割 : 前 i 1 个元素的和 大于等于 剩下的 n - i - 1 个元素的和。下标 i 的右边 至少有一个 元素&#xff…

python网络爬虫系列(五)——数据提取 jsonpath模块

一、数据提取概述 知识点 了解 响应内容的分类了解 xml和html的区别 1. 响应内容的分类 在发送请求获取响应之后,可能存在多种不同类型的响应内容;而且很多时候,我们只需要响应内容中的一部分数据 结构化的响应内容 json字符串 可以使用re、…

LeetCode 2271. 毯子覆盖的最多白色砖块数(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 tiles &#xff0c;其中 tiles[i] [li, ri] &#xff0c;表示所有在 li < j < ri 之间的每个瓷砖位置 j 都被涂成了白色。 同时给你一个整数 carpetLen &#xff0c;表示可以放在 任何位置 的一块毯子。 请你返回…

Nimbus三Storm源码分析--Nimbus启动过程

Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus”来启动看下源码, 此处和上面client不同, jvmtype"-server", 最终调用"backtype.storm.daemon.nimbus"的mainnimbus是用clojure实现的, 但是clojure是基于JVM的, 所以在最终发布…

python网络爬虫系列(六)——数据提取 lxml模块

一、数据提取-lxml模块 知识点 了解 lxml模块和xpath语法的关系了解 lxml模块的使用场景了解 lxml模块的安装了解 谷歌浏览器xpath helper插件的安装和使用掌握 xpath语法-基础节点选择语法掌握 xpath语法-节点修饰语法掌握 xpath语法-其他常用语法掌握 lxml模块中使用xpath语…

LeetCode 2273. 移除字母异位词后的结果数组

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串 words &#xff0c;其中 words[i] 由小写英文字符组成。 在一步操作中&#xff0c;需要选出任一下标 i &#xff0c;从 words 中 删除 words[i] 。其中下标 i 需要同时满足下述两个条件&#xff1a; 0 < i …

python网络爬虫系列(七)——selenium的介绍 selenium定位获取标签对象并提取数据 selenium的其它使用方法

一、selenium的介绍 知识点&#xff1a; 了解 selenium的工作原理了解 selenium以及chromedriver的安装掌握 标签对象click点击以及send_keys输入 1. selenium运行效果展示 Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;Seleniu…

LeetCode 2274. 不含特殊楼层的最大连续楼层数

文章目录1. 题目2. 解题1. 题目 Alice 管理着一家公司&#xff0c;并租用大楼的部分楼层作为办公空间。 Alice 决定将一些楼层作为 特殊楼层 &#xff0c;仅用于放松。 给你两个整数 bottom 和 top &#xff0c;表示 Alice 租用了从 bottom 到 top&#xff08;含 bottom 和 t…

python网络爬虫系列(八)——常见的反爬手段和解决方法

常见的反爬手段和解决思路 学习目标 了解 服务器反爬的原因了解 服务器常反什么样的爬虫了解 反爬虫领域常见的一些概念了解 反爬的三个方向了解 常见基于身份识别进行反爬了解 常见基于爬虫行为进行反爬了解 常见基于数据加密进行反爬 1 服务器反爬的原因 爬虫占总PV(PV是指…

LeetCode 2275. 按位与结果大于零的最长组合(位运算)

文章目录1. 题目2. 解题1. 题目 对数组 nums 执行 按位与 相当于对数组 nums 中的所有整数执行 按位与 。 例如&#xff0c;对 nums [1, 5, 3] 来说&#xff0c;按位与等于 1 & 5 & 3 1 。同样&#xff0c;对 nums [7] 而言&#xff0c;按位与等于 7 。 给你一个…

python网络爬虫系列(九)——打码平台的使用

验证码处理 学习目标 了解 验证码的相关知识掌握 图片识别引擎的使用了解 常见的打码平台掌握 通过打码平台处理验证码的方法 1.图片验证码 1.1 什么是图片验证码 验证码&#xff08;CAPTCHA&#xff09;是“Completely Automated Public Turing test to tell Computers an…

LeetCode 2278. 字母在字符串中的百分比

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s 和一个字符 letter &#xff0c;返回在 s 中等于 letter 字符所占的 百分比 &#xff0c;向下取整到最接近的百分比。 示例 1&#xff1a; 输入&#xff1a;s "foobar", letter "o" 输出&#xff1a;3…

python网络爬虫系列(十)——chrome在爬虫中的使用

chrome浏览器使用方法介绍 学习目标 了解 新建隐身窗口的目的了解 chrome中network的使用了解 寻找登录接口的方法 1 新建隐身窗口 浏览器中直接打开网站&#xff0c;会自动带上之前网站时保存的cookie&#xff0c;但是在爬虫中首次获取页面是没有携带cookie的&#xff0c;这…