文章目录

  • Cookie状态管理
  • Cookie处理

Cookie状态管理

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理

Cookie和Session都用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题所做的努力。对于爬虫开发来说,我们更加关注的是Cookie,因为Cookie将状态保存在客户端,Session将状态保存在服务器端

Cookie实际上是一小段的文本信息

Cookie是服务器在本地机器(客户端)上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头向客户端发送Cookie,浏览器则会解析这些Cookie并将它们保存为一个本地文件,它会自动将同一服务器的任何请求绑定上这些Cookie

客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

Session是另一种记录客户状态的机制

Cookie的工作方式:服务器给每个Session分配一个唯一的JESSION-ID,并通过Cookie发送给客户端。当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session

不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了

Cookie处理

在爬虫的时候,经常进行模拟登陆和访问,这时我们需要使用http.cookjarurl.request这两个模块

其中只要使用url.cookjar中的CookieJar类,以及url.request中的HTTPCookieProcessor方法

http.cookjar 模块: 主要作用是提供用于存储cookie的对象
HTTPCookieProcessor处理器:主要作用是处理这些cookie对象,并构建handle对象

CookieJar类有一些子类,分别是FileCookieJar,MozillaCookieJar,LWPCookieJar

  • CookieJar:管理HTTP cookie值、它从HTTP请求中提取cookie并存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失
  • FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据
  • MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例
  • LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例

其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar() 或 LWPCookieJar()

使用CookieJar获取cookie值

需求:访问百度首页,获取访问的cookie

import urllib.request
import http.cookiejar# 构建一个CookieJar对象实例来保存cookie
cookiejar = http.cookiejar.CookieJar()# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为cookieJar()对象
handle = urllib.request.HTTPCookieProcessor(cookiejar)# 通过build_opener()来构建opener
opener = urllib.request.build_opener(handle)# 以get方法访问页面,访问之后会自动保存cookie到cookiejar中
opener.open("http://www.baidu.com")# 可以按标准格式将保存的cookie打印出来
cookieStr = ''
for item in cookiejar:cookieStr = cookieStr + item.name + "=" + item.value + ";"print(item.name + "=" + item.value)# 打印,并去掉最后一位分号
print(cookieStr[:-1])

我们使用以上方法将cookie保存到cookiejar对象中,然后打印cookie中的值,也就是访问百度首页的cookie。运行结果如下:

BAIDUID=150A89F7FD794CB06CD74D08DA0E8AA7:FG=1
BIDUPSID=150A89F7FD794CB06CD74D08DA0E8AA7
H_PS_PSSID=26522_1464_21114_26350_22073
PSTM=1540024558
delPer=0
BDSVRTM=0
BD_HOME=0
BAIDUID=150A89F7FD794CB06CD74D08DA0E8AA7:FG=1;BIDUPSID=150A89F7FD794CB06CD74D08DA0E8AA7;H_PS_PSSID=26522_1464_21114_26350_22073;PSTM=1540024558;delPer=0;BDSVRTM=0;BD_HOME=0

获取网站的cookie并保存cookie到文件中

需求:将cookie保存到文件

import urllib.request
import http.cookiejarurl = "http://www.baidu.com"# 保存cookie的一个文件
cookie_filename = "cookie.txt"# 声明一个MozillaCookieJar(文件对象)对象实例来保存cookie,之后写入文件
cookiejar = http.cookiejar.MozillaCookieJar(cookie_filename)# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为cookieJar()对象
handle = urllib.request.HTTPCookieProcessor(cookiejar)# 通过build_opener()来构建opener
opener = urllib.request.build_opener(handle)# 创建一个请求,原理同urlopen
response = opener.open(url)# 可以按标准格式将保存的cookie打印出来
cookieStr = ''
for item in cookiejar:cookieStr = cookieStr + item.name + "=" + item.value + ";"print(item.name + "=" + item.value)# 打印,并去掉最后一位分号
print(cookieStr[:-1])
# 保存cookie到文件
cookiejar.save()

从文件中获取cookies,做为请求的一部分

从文件中获取cookies,做为请求的一部分去访问网站

import urllib.request
import http.cookiejarurl = "http://www.baidu.com"user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"headers = {"User-Agent" : user_agent, "Connection" : "keep-alive"}
# 保存cookie的一个文件
cookie_filename = "cookie.txt"# 声明一个MozillaCookieJar(文件对象)对象
cookiejar = http.cookiejar.MozillaCookieJar(cookie_filename)
print(cookiejar)# 从文件中读取cookie内容到变量
cookiejar.load(cookie_filename)
print(cookiejar)# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为cookieJar()对象
handle = urllib.request.HTTPCookieProcessor(cookiejar)# 通过build_opener()来构建opener
opener = urllib.request.build_opener(handle)# 创建一个请求
get_request = urllib.request.Request(url, headers=headers)# 原理同urlopen
response = opener.open(get_request)

登录csdn,并保存cookie到文件中,再从文件中读取cookie访问CSDN其他页面

import urllib.request, urllib.parse, urllib.error
import http.cookiejarlogin_url = "https://passport.csdn.net/account/login"
login_user = {"username":"UserPython", "password" : "passpw"}
postdata = urllib.parse.urlencode(login_user).encode("utf-8")
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
headers = {"User-Agent" : user_agent, "Connection" : "keep-alive"}# 保存cookie的一个文件
cookie_filename = "cookie.txt"# 声明一个MozillaCookieJar(文件对象)对象
cookiejar = http.cookiejar.MozillaCookieJar(cookie_filename)# 从文件中读取cookie内容到变量
# cookiejar.load(cookie_filename)# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为cookieJar()对象
handle = urllib.request.HTTPCookieProcessor(cookiejar)# 通过build_opener()来构建opener
opener = urllib.request.build_opener(handle)# 创建一个请求
get_request = urllib.request.Request(login_url, postdata, headers=headers)try:response = opener.open(get_request)page = response.read().decode("utf-8")print(page)
except urllib.error.URLError as e:print(e.code, ":", e.reason)# 保存cookie到cookie.txt中
cookiejar.save()
import urllib.request, urllib.parse, urllib.error
import http.cookiejaruser_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
headers = {"User-Agent" : user_agent, "Connection" : "keep-alive"}cookie_filename = "cookie.txt"cookie= http.cookiejar.MozillaCookieJar(cookie_filename)
cookie.load(cookie_filename, ignore_discard=True, ignore_expires=True)handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)get_url = "https://mp.csdn.net/mdeditor/83214161#"
get_request = urllib.request.Request(get_url, headers=headers)
get_response = opener.open(get_request)
print(get_response.read().decode("utf-8"))

Python爬虫_Cookie相关推荐

  1. python中cookies怎么用_Cookie在python爬虫中怎么用?Cookielib又是什么?

    我们登录一个网页或者软件的时候,都要输入账号才能进入界面,随后就可以看其中的内容了.Cookie就类似于担任一个审查员的身份.对想要访问人的身份进行大大小小的审核,合格的才能放任通行,之后我们就可以愉 ...

  2. 关于Python爬虫原理和数据抓取1.1

    为什么要做爬虫? 首先请问:都说现在是"大数据时代",那数据从何而来? 企业产生的用户数据:百度指数.阿里指数.TBI腾讯浏览指数.新浪微博指数 数据平台购买数据:数据堂.国云数据 ...

  3. python爬虫之Scrapy框架的post请求和核心组件的工作 流程

    python爬虫之Scrapy框架的post请求和核心组件的工作 流程 一 Scrapy的post请求的实现 在爬虫文件中的爬虫类继承了Spider父类中的start_urls,该方法就可以对star ...

  4. python爬虫抓取信息_python爬虫爬取网上药品信息并且存入数据库

    我最近在学习python爬虫,然后正好碰上数据库课设,我就选了一个连锁药店的,所以就把网上的药品信息爬取了下来. 1,首先分析网页 2,我想要的是评论数比较多的,毕竟好东西大概是买的人多才好.然后你会 ...

  5. python爬虫案例_推荐上百个github上Python爬虫案例

    现在学生都对爬虫感兴趣,这里发现一些好的github开源的代码,分享给各位 1.awesome-spider 该网站提供了近上百个爬虫案例代码,这是ID为facert的一个知乎工程师开源的,star6 ...

  6. Python培训分享:python爬虫可以用来做什么?

    爬虫又被称为网络蜘蛛,它可以抓取我们页面的一些相关数据,近几年Python技术的到来,让我们对爬虫有了一个新的认知,那就是Python爬虫,下面我们就来看看python爬虫可以用来做什么? Pytho ...

  7. 玩转 Python 爬虫,需要先知道这些

    作者 | 叶庭云 来源 | 修炼Python 头图 | 下载于视觉中国 爬虫基本原理 1. URI 和 URL URI 的全称为 Uniform Resource Identifier,即统一资源标志 ...

  8. 买不到口罩怎么办?Python爬虫帮你时刻盯着自动下单!| 原力计划

    作者 | 菜园子哇 编辑 | 唐小引 来源 | CSDN 博客 马上上班了,回来的路上,上班地铁上都是非常急需口罩的. 目前也非常难买到正品.发货快的口罩,许多药店都售完了. 并且,淘宝上一些新店口罩 ...

  9. 一个月入门Python爬虫,轻松爬取大规模数据

    如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样一个月入门Python爬虫,轻松爬的编程语言提供越来越多的优秀工具,让爬虫 ...

最新文章

  1. java 反射field_java – 使用反射获取Field的泛型类型
  2. linux dmesg命令(显示开机信息)
  3. Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
  4. html5做一个皮卡丘,用css实现一个皮卡丘
  5. 企业微信_读取成员(获取用户详情)
  6. 限制文本输入框只能输入0-9数字
  7. 企业库第4版最后版本下载
  8. ABP应用层——参数有效性验证
  9. Ubnutu20.04安装Tensorflow
  10. C/C++[算法入门]
  11. DEM数据(12米)精度获取方法
  12. adobe怎么统计字数,在Adobe Reader中统计PDF中的文字数
  13. Matlab有趣代码
  14. js特效 jQuery特效 网页特效网站 web网站模板下载推荐
  15. 判断是否是手机号码的方法
  16. 两百万美元“NFT”消失的惨案
  17. 保护信息安全,实名认证该怎么选?
  18. 安装jdk,没有jre
  19. chrome表单自动填充默认样式-autofill
  20. Unity前项渲染和延迟渲染(二)

热门文章

  1. centos7开机启动自定义脚本_在Centos 7系统中开启启动自定义脚本的方法
  2. java outer关键字_java中的关键字
  3. 什么是计算机应用上机报告,计算机应用实验报告样本.doc
  4. 框架简述 带你认识 Mybatis
  5. SpringBoot面试题第一弹
  6. 微信小程序种利用轮播图实现tab栏切换
  7. 最常用的 HTTP 方法:GET 和 POST
  8. Idea中Spring整合MyBatis框架中配置文件中对象注入问题解决方案
  9. For in + 定时器
  10. TypeError: 'range' object doesn't support item deletion