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,一开始处于登入状态,但是过会跳到登入页面去。应该是有校验机制。

最新文章

  1. Nginx中FastCGI配置优化
  2. web自学网站
  3. 我所理解的readonly和const
  4. border-collapse实现表格细线边框
  5. DB2 UDB DBA 核对清单
  6. m3u8文件简介
  7. Linux free字段解析
  8. 作为平台的Windows PowerShell(一)
  9. 使用 apache ant 轻松实现文件压缩/解压缩(转)
  10. java 数组插入元素
  11. Group Convolution分组卷积,以及Depthwise Convolution和Global Depthwise Convolution
  12. Intellij IDEA 从数据库生成 JPA Entity
  13. 判断某个元素是否存在于某个 js 数组中
  14. LeetCode 简单等级
  15. Day22 常用模块01
  16. 关于Vue中的 render: h => h(App) 具体是什么含义?
  17. html2canvas - 微信中长按存图 - 将h5活动结果保存到本地
  18. .net core 读取本地指定目录下的文件
  19. Eclipse/MyEclipse按任何键,都可以提示?(最强帮手)
  20. 几行代码实现iOS摇一摇功能

热门文章

  1. JDBC读取配置文件
  2. Proxmox 安装 dsm 黑群 备忘
  3. java.lang.IllegalStateException: getOutputStream() has already been called for this response解决方案
  4. Listview getItemViewType的使用
  5. 安装了Anaconda之后,Maya运行报错,Python 找不到 Maya 的 Python 模块
  6. cannot find -lf2c
  7. Red Hat 6.5 Samba服务器的搭建(匿名访问,免登录)
  8. 如何快速增加pdf书签,解除pdf限制
  9. 编写高质量代码改善C#程序的157个建议——建议75:警惕线程不会立即启动
  10. 使用jasmine-node 进行NodeJs单元测试 环境搭建