为什么要使用 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 来访问其他网址。 如登录之后才能查看的成绩查询呀,本学期课表呀等等网址,模拟登录就这么实现

Python爬虫入门六Cookie的使用相关推荐

  1. Python爬虫入门六之Cookie的使用

    大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...

  2. python爬虫入门(六) Scrapy框架之原理介绍

    Scrapy框架 Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬 ...

  3. 如何学习Python爬虫[入门篇]?

    这篇文章已经过去很久了,有一些学习资源链接已经失效了,还一直有小伙伴在Python的路上摸索.所以我根据自己的学习和工作经历整理了一套Python学习电子书,在公众号「路人甲TM」后台回复关键词「1」 ...

  4. Python爬虫入门(6):Cookie的使用

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  5. python爬虫入门教程(非常详细),超级简单的Python爬虫教程

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  6. python爬虫入门教程--优雅的HTTP库requests(二)

    requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive.连接池.Cookie持久化.内容自动解压.HTTP代理.SSL认证等很多特性,下面这篇文章主要给大家介绍 ...

  7. python爬虫入门教程--快速理解HTTP协议(一)

    http协议是互联网里面最重要,最基础的协议之一,我们的爬虫需要经常和http协议打交道.下面这篇文章主要给大家介绍了关于python爬虫入门之快速理解HTTP协议的相关资料,文中介绍的非常详细,需要 ...

  8. python爬虫入门代码-Python爬虫入门

    原标题:python爬虫入门 基础知识 HTTP协议 我们浏览网页的浏览器和手机应用客户端与服务器通信几乎都是基于HTTP协议,而爬虫可以看作是一个另类的客户端,它把自己伪装成浏览器或者手机应用客户端 ...

  9. python爬虫程序实例-10个python爬虫入门实例

    作者:h3zh1 来源:cnblogs.com/h3zh1/p/12548946.html 今天为大家准备了几个简单的python爬虫入门实例,分享给大家. 涉及主要知识点:web是如何交互的 req ...

最新文章

  1. 助理来也胡一川:用数据驱动打造智能行业助理(技术+业务)
  2. linux进程网络均衡,linux多CPU进程负载均衡解析
  3. Java多线程(三)之ConcurrentHashMap深入分析
  4. php怎么关闭oracle连接,PHP 连接 Oracle
  5. vim自己主动缩进配置
  6. 通俗理解九大排序算法
  7. CAVLC和CABAC简介
  8. 设置模糊阴影_制作带模糊效果的PPT首页
  9. 神舟计算机主板bios,最详细的各种主板bios设置方法
  10. Bochs使用简单教程
  11. 计算机软考初级工程资料,计算机软考数据库系统工程师考前练习300资料.doc
  12. 使用Box2dWeb模拟飞行箭矢
  13. origin基本操作
  14. 计算机输入法切换用户登录,在电脑上如何设置输入法全局切换的功能
  15. uniapp 跳转外部链接
  16. android中drawable的自建资源
  17. 开发者收到“加料”的假 Offer,害上家被盗近 6.25 亿美元!
  18. 【论文简述及翻译】MVSNet:Depth Inference for Unstructured Multi-view Stereo(ECCV 2018)
  19. 云主机安装redis
  20. 【视频制作】PR如何制作追踪马赛克

热门文章

  1. kernel32.dll出错解决方案
  2. Active Directory授权还原
  3. 用SQL实现统计报表中的“小计”和“合计”
  4. corba的兴衰_数据科学薪酬的兴衰
  5. 计算机软件技术基础fifo算法,软件技术基础真题
  6. 代码流星雨是什么形式_为什么要在2020年与流星合作
  7. 开源项目贡献者_如何认识您的开源项目贡献者并发展您的社区
  8. 【慎思堂】之JS牛腩总结
  9. 在没人相信的时候,你的坚持才真正可贵
  10. php设计模式-工厂设计模式