CookieJar和HTTPCookieProcessor
CookieJar和HTTPCookieProcessor
我们在使用爬虫的时候,经常会用到cookie进行模拟登陆和访问。在使用urllib库做爬虫,我们需要借助http.cookiejar库中的CookieJar来实现。
CookieJar类有一些子类,分别是FileCookieJar,MozillaCookieJar,LWPCookieJar。
CookieJar:管理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()。
当然,如果我们对cookie有定制的需要,那么我们也要借助HTTPCookieProcess处理器来处理。具体看下面代码。
使用CookieJar获取cookie值
代码如下:
if __name__ == '__main__':
url = 'http://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0(Windows NT 10.0; WOW64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3427.400 QQBrowser/9.6.12513.400'
}
cookie = cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
resp = opener.open(url)
cookieStr = ''
for item in cookie:
cookieStr = cookieStr + item.name + '=' + item.value + ';'
print(cookieStr)
输出结果:
BAIDUID=C69C91EF147DBFE7206E152C8652E773:FG=1;BIDUPSID=C69C91EF147DBFE7206E152C8652E773;H_PS_PSSID=1460_21118_18560_24879_20927;PSTM=1510410052;BDSVRTM=0;BD_HOME=0;
获取网站的cookie并保存cookie到文件中
保存cookie到文件,我们需要使用MozillaCookjar()
import urllib.request
from http import cookiejar
def save_cookie(url, cookie_filename):
cookie = cookiejar.MozillaCookieJar(cookie_filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
resp = opener.open(url)
cookieStr = ''
for item in cookie:
cookieStr = cookieStr + item.name + '=' + item.value + ';'
print(cookieStr)
cookie.save()
if __name__ == '__main__':
url = 'http://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0(Windows NT 10.0; WOW64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3427.400 QQBrowser/9.6.12513.400'
}
cookie_filename = 'cookie.txt'
req = urllib.request.Request(url, headers=headers)
save_cookie(req, cookie_filename)
获取文件中的cookie访问链接
import urllib.request
from http import cookiejar
def load_cookie(url, cookie_filename):
cookie = cookiejar.MozillaCookieJar()
cookie.load(cookie_filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
resp = opener.open(req)
cookieStr = ''
for item in cookie:
cookieStr = cookieStr + item.name + '=' + item.value + ';'
print(cookieStr)
if __name__ == '__main__':
url = 'http://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0(Windows NT 10.0; WOW64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3427.400 QQBrowser/9.6.12513.400'
}
cookie_filename = 'cookie.txt'
req = urllib.request.Request(url, headers=headers)
load_cookie(req, cookie_filename)
使用cookiejar和post用户名和密码模拟人人网用户登入
import urllib.request
import urllib.parse
from http import cookiejar
if __name__ == '__main__':
# 人人网的很早的登入网站(最新的登入网站做了校验机制,现在不好登入...)
url = 'http://www.renren.com/PLogin.do'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
# post的data数据,email是用户名,password是密码,这个是登入网站的input标签的name属性值
data = {'email': 'xxxxxxxxx', 'password': 'xxxxxxx'}
# 转成url编码
data = urllib.parse.urlencode(data).encode('utf-8')
# 保存cookie的文件名称
cookie_filename = 'renren_cookie.txt'
# 获取cookie对象
cookie = cookiejar.MozillaCookieJar(cookie_filename)
# 构建一个cookie的处理器
handler = urllib.request.HTTPCookieProcessor(cookie)
# 获取一个opener对象
opener = urllib.request.build_opener(handler)
# 获取一个请求对象
req = urllib.request.Request(url, data)
# 给opener添加请求头,使用的是元组的方式
opener.addheaders = [('User-Agent',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36')]
# 请求服务器,返回响应对象,这时cookie已经随着resp对象携带过来了
resp = opener.open(req)
# 保存cookie到文件
cookie.save()
# 将响应的内容写入到文件
with open('renren_login.html', 'wb')as f:
f.write(resp.read())
目前人人网对这种方式已经有校验,打开保存的文件renren_login.html,一开始处于登入状态,但是过会跳到登入页面去。应该是有校验机制。
CookieJar和HTTPCookieProcessor的更多相关文章
- Python爬虫 Cookie的使用
Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么 ...
- python爬虫(六)_urllib2:handle处理器和自定义opener
本文将介绍handler处理器和自定义opener,更多内容请参考:python学习指南 opener和handleer 我们之前一直使用的是urllib2.urlopen(url)这种形式来打开网页 ...
- python urllib和urllib3包使用
urllib包 urllib是一个包含几个模块来处理请求的库.分别是: urllib.request 发送http请求 urllib.error 处理请求过程中,出现的异常. urllib.parse ...
- python爬虫入门(二)Opener和Requests
Handler和Opener Handler处理器和自定义Opener opener是urllib2.OpenerDirector的实例,我们之前一直在使用urlopen,它是一个特殊的opener( ...
- urllib使用
1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=Fals ...
- (爬虫)urllib库
一.爬虫简介 什么是爬虫?通俗来讲爬虫就是爬取网页数据的程序. 要了解爬虫,还需要了解HTTP协议和HTTPS协议:HTTP协议是超文本传输协议,是一种发布和接收HTML页面的传输协议:HTTPS协议 ...
- python爬虫第五天
cookie 我们访问网页是通过http协议进行的,而http协议是一个无状态协议(无法维持会话之间的状态),比如我们登录一个网站成功后访问另一个网页,那么登录状态 ...
- Python——爬虫——爬虫的原理与数据抓取
一.使用Fiddler抓取HTTPS设置 (1)菜单栏 Tools > Telerik Fiddler Options 打开“Fiddler Options”对话框 (2)HTTPS设置:选中C ...
- 分享一个爬取HUST(哈理工)学生成绩的Python程序(OCR自动识别验证码)
Python版本:3.5.2 日期:2018/1/21 __Author__ = "Lance#" # -*- coding = utf-8 -*- from urllib imp ...
随机推荐
- 将maven打包为一个jar(可以体外加入jar)
使用 maven-compiler-plugin插件, 在maven的pom的<build></build>标签中上加入 <build> <plugins&g ...
- 关于junit包导入不了但是maven本地库中却存在的问题
导入项目的时候发现junit的类使用不了,于是就去看看包导入了没有 发现包是灰色的,于是猜想可能是maven本地库中包没下载过来 查询了本地库发现包是存在的,这就奇怪的,经过网上查询之后得到解决方案 ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十三周
java学习第十三周 本周,进行了对前六章知识点的小测试,在测试中我也发现了许多自己学习上存在的隐患,对一些知识点理解的太过粗略,没有很好的去记忆那些重要的小细节,把注意力过多的放在了 ...
- Linux实战教学笔记19:Linux相关网络知识梳理
第十九节 Linux相关网络知识梳理 标签(空格分隔): Linux实战教学笔记-陈思齐 一,前言 一个运维有时也要和网络打交道,所以具备最基本的网络知识,对一个运维人员来说是必要的.但,对于我们的工 ...
- Oracle中针对中文进行排序
在oracle 9i之前,对中文的排序,是默认按2进制编码来进行排序的. 9i时增加了几种新的选择: 按中文拼音进行排序:SCHINESE_PINYIN_M 按中文部首进行排序:SCHINESE_RA ...
- c# ftp 判断目录是否存在和创建文件夹
工作中项目一直使用的ftp上传日志文件出现了问题,新的服务器搭建好后,日志无法上传.正好来学习一下ftp. 程序中的流程是,一个计时器,每分钟检测配置文件中本地日志文件路径下有没有日志文件,如果有就上 ...
- shiro 权限集成 sessionManager 配置 学习记录(三)
1.shiro配置文件增加sessionManager管理 <!-- 6.shiro结合Session会话管理器 start --> <bean id="sessionMa ...
- Ajax与Controller的参数交互
理论 jQuery.ajax( options )中重要参数设置 jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据.通过jquery.ajax与SpringMVC的C ...
- Mysql Join语法以及性能优化
引言 内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分.外左联结与外右联结的区别在于如果用A左联结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反 ...
- Ext.data.association.hasMany一对多模型使用示例
来自<sencha touch权威指南>第11章,323页开始 --------------------------------------------------- index.html ...