Python爬虫入门六Cookie的使用

为什么要使用 Cookie 呢? Cookie,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的。那么我们可以利用 Urllib2 库保存我们登录的 Cookie,然后再抓取其他页面就达到目的了。 在此之前呢,我们必须先介绍一个 opener 的概念。

1.Opener

当你获取一个 URL 你使用一个 opener (一个 urllib2.OpenerDirector 的实例)。在前面,我们都是使用的默认的 opener,也就是 urlopen。它是一个特殊的 opener,可以理解成 opener 的一个特殊实例,传入的参数仅仅是 url,data,timeout。 如果我们需要用到 Cookie,只用这个 opener 是不能达到目的的,所以我们需要创建更一般的 opener 来实现对 Cookie 的设置。

2.Cookielib

cookielib 模块的主要作用是提供可存储 cookie 的对象,以便于与 urllib2 模块配合使用来访问 Internet 资源。Cookielib 模块非常强大,我们可以利用本模块的 CookieJar 类的对象来捕获 cookie 并在后续连接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有 CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。 它们的关系:CookieJar —— 派生 ——>FileCookieJar —— 派生 ——->MozillaCookieJar 和 LWPCookieJar

获取Cookie保存到变量

首先,我们先利用 CookieJar 对象实现获取 cookie 的功能,存储到变量中,先来感受一下

import urllib2
import cookielib
#声明一个CookieJar对象实例来保存cookie
cookie = cookielib.CookieJar()
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler=urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler)
#此处的open方法同urllib2的urlopen方法,也可以传入request
response = opener.open('http://www.baidu.com')
for item in cookie:print("{}:{}".format(item.name,item.value))

结果:

BAIDUID:5E5BB57DD1B922B6CFA22BC660CA2641:FG=1
BIDUPSID:5E5BB57DD1B922B6F3874B1DF9628134
H_PS_PSSID:33423_1438_33306_31254_32972_33351_33313_33312_33311_33310_33413_33309_26350_33308_33307_33389_33370
PSTM:1609568045
BDSVRTM:0
BD_HOME:1

2.保存Cookie到文件

在上面的方法中,我们将 cookie 保存到了 cookie 这个变量中,如果我们想将 cookie 保存到文件中该怎么做呢?这时,我们就要用到 FileCookieJar 这个对象了,在这里我们使用它的子类 MozillaCookieJar 来实现 Cookie 的保存

import cookielib
import urllib2#设置保存cookie的文件,同级目录下的cookie.txt
filename = 'cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler = urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler)
#创建一个请求,原理同urllib2的urlopen
response = opener.open("http://www.baidu.com")
#保存cookie到文件
cookie.save(ignore_discard=True, ignore_expires=True)

关于最后 save 方法的两个参数在此说明一下: 官方解释如下

  • ignore_discard: save even cookies set to be discarded.
  • ignore_expires: save even cookies that have expiredThe file is overwritten if it already exists

由此可见,ignore_discard 的意思是即使 cookies 将被丢弃也将它保存下来,ignore_expires 的意思是如果在该文件中 cookies 已经存在,则覆盖原文件写入,在这里,我们将这两个全部设置为 True。运行之后,cookies 将被保存到 cookie.txt 文件中,我们查看一下内容,如下

# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit..baidu.com	TRUE	/	FALSE	1641104421	BAIDUID	A614B3154C44552F0472B9D9BA37F9ED:FG=1
.baidu.com	TRUE	/	FALSE	3757052068	BIDUPSID	A614B3154C44552FDDEF489DFBD028B8
.baidu.com	TRUE	/	FALSE		H_PS_PSSID	33425_1437_33306_31254_33350_33313_33312_33311_33310_33413_33309_33321_33308_33307_33266_33389_33370
.baidu.com	TRUE	/	FALSE	3757052068	PSTM	1609568421
www.baidu.com	FALSE	/	FALSE		BDSVRTM	0
www.baidu.com	FALSE	/	FALSE		BD_HOME	1

从文件中获取Cookie并访问

那么我们已经做到把 Cookie 保存到文件中了,如果以后想使用,可以利用下面的方法来读取 cookie 并访问网站,感受一下

import cookielib
import urllib2#创建MozillaCookieJar实例对象
cookie = cookielib.MozillaCookieJar()
#从文件中读取cookie内容到变量
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
#创建请求的request
req = urllib2.Request("http://www.baidu.com")
#利用urllib2的build_opener方法创建一个opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open(req)
print response.read()

4.利用Cookie模拟登陆网站

以教育系统为例,利用 cookie 实现模拟登录,并将 cookie 信息保存到文本文件中

import urllib
import urllib2
import cookielibfilename = 'cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
postdata = urllib.urlencode({'stuid':'xxx','pwd':'xxx'})
#登录教务系统的URL
loginUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login'
#模拟登录,并把cookie保存到变量
result = opener.open(loginUrl,postdata)
#保存cookie到cookie.txt中
cookie.save(ignore_discard=True, ignore_expires=True)
#利用cookie请求访问另一个网址,此网址是成绩查询网址
gradeUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre'
#请求访问成绩查询网址
result = opener.open(gradeUrl)
print result.read()

以上程序的原理如下 创建一个带有 cookie 的 opener,在访问登录的 URL 时,将登录后的 cookie 保存下来,然后利用这个 cookie 来访问其他网址。 如登录之后才能查看的成绩查询呀,本学期课表呀等等网址,模拟登录就这么实现

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

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

相关文章

有得必有失

上次也说道Ruby on Rails 是一个很不错的框架。本人也想去研究一翻,我已经不再替别人写程序了。 当编程变成一门兴趣的时候,而不是吃饭的依据。我觉得我需要跟着我的心走。 1:我现在的工作环境是在LINUX下,我一次次的折腾mono好吧…

mybatis下log4j使用

1. log4j jar包(mvnrepository) 2. log4j.properties文件 log4j.properties内容: log4j.rootLoggerDEBUG, stdout, logfile    log4j.appender.stdoutorg.apache.log4j.ConsoleAppender    log4j.appender.stdout.layoutorg.apache…

Python爬虫入门七正则表达式

已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式 1.了解正则表达式 正则表达式是用来匹配字符串非常强大的工具,在其…

Linux 文件系统与设备文件系统 (一)—— udev 设备文件系统

一、什么是Linux设备文件系统 首先我们不看定义,定义总是太抽象很难理解,我们先看现象。当我们往开发板上移植了一个新的文件系统之后(假如各种设备驱动也移植好了),启动开发板,我们用串口工具进入开发板&a…

CSS 如何让Table的里面TD全有边框 而Table的右左边框没有

比如这样一个CSS.td3{font-size: 14px;color: #FFFFFF;background-color: #000000;BORDER-RIGHT: #f6f6f6 1px solid; //显示右边框为1px,如果不想显示就为0pxBORDER-TOP: #f9f9f9 0px solid; //显示上边框为1px,如果不想显示就为0pxBORDER-LEFT: #f9f9f…

情人节,教大家使用css画出一朵玫瑰花。

情人节到了,给大家来一朵高端的玫瑰花。 在网上看到的一个canvas实现的玫瑰花,效果很好,但是代码被压缩过,也没有注释,看的云里雾里的。 今天我教大脚用CSS来实现一朵玫瑰花。 先看效果 首先我们画出一个花瓣 1、画出一…

Python爬虫利器一Requests库的用法

之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助。入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取。那么这一节来简单介绍一下 requests 库的基本…

Windows窗口样式

windows样式有很多种,不同的windows,windows控件接受不同的样式。如Combo box接受下以样式:WS_CHILD AlwaysWS_VISIBLE UsuallyWS_DISABLED RarelyWS_VSCROLL To add vertical scrolling for the list box in the combo boxWS_HSCROL…

Linux 字符设备驱动开发基础(六)—— VFS 虚拟文件系统解析

一、VFS 虚拟文件系统基础概念 Linux 允许众多不同的文件系统共存,并支持跨文件系统的文件操作,这是因为有虚拟文件系统的存在。虚拟文件系统,即VFS(Virtual File System)是 Linux 内核中的一个软件抽象层。它通过一些…

初识 es6

es6 可能出来已经有一段时间了,但是我到今天才发现他的好,却不是很了解他,也不知道各个浏览器的兼容性怎么样?今天就把他们都弄明白。 新增命令 let ES6新增了let命令,用来声明变量。它的用法类似于var,但是…

Python爬虫利器四PhantomJS的用法

大家有没有发现之前我们写的爬虫都有一个共性,就是只能爬取单纯的 html 代码,如果页面是 JS 渲染的该怎么办呢?如果我们单纯去分析一个个后台的请求,手动去摸索 JS 渲染的到的一些结果,那简直没天理了。所以&#xff0…

从零开始学习Hadoop--第1章 Hadoop的安装

Hadoop的安装比较繁琐,有如下几个原因:其一,Hadoop有非常多的版本;其二,官方文档不尽详细,有时候更新脱节,Hadoop发展的太快了;其三,网上流传的各种文档,或者…

vim使用—实现程序的自动补齐(C语言)

使用过Source Insight的人一定对它的自动补全功能印象深刻,在很多的集成开发环境中,也都支持自动补全。vim做为一个出色的编辑器,这样的功能当然少不了。至于如何实现程序自动补全,网上教程很多。这里,我将自己配置过程…

8、JDBC入门整理

JDBC入门 l 导jar包:驱动! l 加载驱动类:Class.forName(“类名”); l 给出url、username、password, l 使用DriverManager类来得到Connection对象! 1 什么是JDBC(接口,实现为驱动) JDBC(Java DataBase…

Python 爬虫利器二之 Beautiful Soup 的用法

上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具&…

[C#]Attribute特性(3)——AttributeUsage特性和特性标识符

相关文章 [C#]Attribute特性 [C#]Attribute特性(2)——方法的特性及特性参数 AttributeUsage特性 除了可以定制自己的特性来注释常用的C#类型外,您可以用AttributeUsage特性来定义您想怎样使用这些特性。AttributeUsage特性采用如下的调用惯例: 1 [Attri…

Linux 命令 ——less命令

less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less …

Python 爬虫利器三之 Xpath 语法与 lxml 库的用法

原文链接https://cuiqingcai.com/2621.html 前言 前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法。如果大…

android闹钟实现原理

闹钟的原理可用下面我自己画的一幅图来概括:(不对的地方,尽管吐槽) 我们来看看新建闹钟到闹钟响铃的步骤: 1、新建一个闹钟: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22…

将openstack的Token认证信息存储在memcache中

公司线上的openstack环境运行了5个多月的时间,keystone库的token表已经增长到了31GB,这个数据量还是很大的,对于以后的数据库备份很不方便。每次管理openstack的时候,都会产生一个新的token验证,而历史token信息其实都…