一、Cookie会话

  简单地说,cookie就是存储在用户浏览器中的一小段文本文件。Cookies是纯文本形式,它们不包含任何可执行代码。一个Web页面或服务器告之浏览器来将这些信息存储并且基于一系列规则在之后的每个请求中都将该信息返回至服务器。当服务器收到浏览器请求附带的Cookie会话信息,会认为浏览器发出的请求是合法的,是经过身份验证的。否则,会拒绝浏览器的请求。

二、访问需要登录态Cookie的页面

1.使用opener.open()方式

 import urllib.request
import urllib.parse
import re
import http.cookiejar
import urllib.error user_agent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4'
# 初始化headers
headers = {'User-Agent': user_agent}
url = 'http://xxx.xxx.com/auth/valid.json'
cookie_filename = 'cookie.txt'
cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler) try:
# 登录分期乐
params = {'uin': 'xxxxx', 'passwd': 'xxxxxx', 'imgcode': '',
'_1': '', '_2': '', '_3': '', 'url': ''
}
data = urllib.parse.urlencode(params).encode(encoding='utf-8', errors='ignore')
request = urllib.request.Request(url, data=data, headers=headers, method='POST')
response = opener.open(request)
buff = response.read()
html = buff.decode('utf-8')
cookie.save(ignore_discard=True, ignore_expires=True) # 保存cookie到cookie.txt中
for item in cookie:
print('Name = ' + item.name)
print('Value = ' + item.value)
if re.search('ok', html):
print('login success')
# 访问需要登录态Cookie的页面
target_url = 'http://order.xxxxxx.com/order/list.html'
request = urllib.request.Request(target_url, headers=headers, method='GET')
response = opener.open(request)
print(response.read().decode('utf-8'))
else:
print('login fail')
except urllib.error.HTTPError as e:
print(e.reason)
except urllib.error.URLError as e:
print(e.reason)

现在我们来分析下以上的代码,怎么保存并把cookie传递到后续每个需要登录态的请求:

cookie_filename = 'cookie.txt'cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
cookie.save(ignore_discard=True, ignore_expires=True) 
引用http.cookiejar.MozillaCookieJar类声明一个FileCookieJar对象cookie,cookie可以用来把请求获取到的cookie会话信息保存到以cookie_filename命名的文件中,还可以在页面请求时从cookie文件中加
载会话信息并作为请求头参数Cookie。

handler = urllib.request.HTTPCookieProcessor(cookie) 

opener = urllib.request.build_opener(handler)

引用urllib.request.HTTPCookieProcessor类声明一个handler对象,用来处理http cookie会话信息,并把它作为参数传递给urllib.request.build_opener,设置成全局的http handler处理器,这样使用

opener.open()的请求都会带上之前保存的cookie会话信息。

2.使用urllib.request.urlopen()方式

 try:
# 登录分期乐
params = {'uin': 'xxxxxx', 'passwd': 'xxxxxx', 'imgcode': '',
'_1': '', '_2': '', '_3': '', 'url': ''
}
data = urllib.parse.urlencode(params).encode(encoding='utf-8', errors='ignore')
request = urllib.request.Request(url, data=data, headers=headers, method='POST')
response = opener.open(request)
buff = response.read()
html = buff.decode('utf-8')
cookie.save(ignore_discard=True, ignore_expires=True) # 保存cookie到cookie.txt中
order_cookie = []
for item in cookie:
print('Name = ' + item.name)
print('Value = ' + item.value)
e = (item.name, item.value) # 转换为元祖,保存到列表中
order_cookie.append(item.name + '=' + item.value) order_cookie = ';'.join(order_cookie) # 拼接成a=b;c=d;格式字符串
if re.search('ok', html):
print('login success')
# 访问需要登录态Cookie的页面
target_url = 'http://order.xxxxxx.com/order/list.html'
order_headers = {
'User-Agent': user_agent,
'Cookie': order_cookie # 请求头带上Cookie
}
request = urllib.request.Request(target_url, headers=order_headers, method='GET')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
else:
print('login fail')
except urllib.error.HTTPError as e:
print(e.reason)
except urllib.error.URLError as e:
print(e.reason)

与opener.open()方式相比,通过urllib.request.urllib发送请求方式稍微复杂些,首先需要遍历返回的登录态的cookie,转换为元素并保存到列表orderlist里面,再通过字符串join(seq)方法拼接成字符串,最后以字典格式添加到请求头order_headers里面传递给

Request对象的参数headers赋值,调用urllib.request.urlopen()就能带上Cookie会话信息请求了,虽然步骤挺多,不过方法还是行得通的。

Python爬虫基础之Cookie的更多相关文章

  1. Python爬虫基础

    前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...

  2. python爬虫-基础入门-python爬虫突破封锁

    python爬虫-基础入门-python爬虫突破封锁 >> 相关概念 >> request概念:是从客户端向服务器发出请求,包括用户提交的信息及客户端的一些信息.客户端可通过H ...

  3. python爬虫-基础入门-爬取整个网站《3》

    python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...

  4. python爬虫-基础入门-爬取整个网站《2》

    python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...

  5. python爬虫-基础入门-爬取整个网站《1》

    python爬虫-基础入门-爬取整个网站<1> 描述: 使用环境:python2.7.15 ,开发工具:pycharm,现爬取一个网站页面(http://www.baidu.com)所有数 ...

  6. Python爬虫基础(一)——HTTP

    前言 因特网联系的是世界各地的计算机(通过电缆),万维网联系的是网上的各种各样资源(通过超文本链接),如静态的HTML文件,动态的软件程序······.由于万维网的存在,处于因特网中的每台计算机可以很 ...

  7. 【学习笔记】第二章 python安全编程基础---python爬虫基础(urllib)

    一.爬虫基础 1.爬虫概念 网络爬虫(又称为网页蜘蛛),是一种按照一定的规则,自动地抓取万维网信息的程序或脚本.用爬虫最大的好出是批量且自动化得获取和处理信息.对于宏观或微观的情况都可以多一个侧面去了 ...

  8. Python爬虫基础之requests

    一.随时随地爬取一个网页下来 怎么爬取网页?对网站开发了解的都知道,浏览器访问Url向服务器发送请求,服务器响应浏览器请求并返回一堆HTML信息,其中包括html标签,css样式,js脚本等.我们之前 ...

  9. Python爬虫基础之认识爬虫

    一.前言 爬虫Spider什么的,老早就听别人说过,感觉挺高大上的东西,爬网页,爬链接~~~dos黑屏的数据刷刷刷不断地往上冒,看着就爽,漂亮的校花照片,音乐网站的歌曲,笑话.段子应有尽有,全部都过来 ...

随机推荐

  1. filebeat-6.4.3-windows-x86_64输出Kafka

    配置filebeat.yml文件 filebeat.prospectors: - type: log encoding: utf- enabled: true paths: - e:\log.log ...

  2. squid3.5缓存代理实践记录

    准备: 两台服务器,一台web,一台squid缓存代理 squid机域名:www.dannylinux.top web机IP:12.1.1.1 1.版本: [root@danny squid]# sq ...

  3. window.open() & iframe & tab

    window.open() & iframe & tab window.open() open pages in the same window / tab https://stack ...

  4. 2019-04-10 集成JasperReport

    1. 报表的制作过程为 ① 制作.jrxml报表模板文件,并编译成.jasper ② 代码处理.jasper文件并填充数据进行输出 2. 一开始是打算使用iReport作为模板制作工具的,但是有以下局 ...

  5. element 给table的个别表格框添加样式 ---重构里面的组件

    <el-table ref="singleTable" :show-header='false' :data="tableData" align='cen ...

  6. Nginx CONTENT阶段 concat模块

    L67 concat_delimiter : 根据js 指定 分隔符 比如 “|” 那么每个文件分隔符为 “|” concat_types : 指定要合并文件的类型 concat_unique : s ...

  7. oracle wm_concat 函数无法使用的情况下,使用LISTAGG()函数

    http://dacoolbaby.iteye.com/blog/1698957 --20180327 重写wm_concat函数,解决行数超过上限问题 /*执行前请将APPS替换为当前登录用户*/ ...

  8. 简单的连接数据库的java程序模板

    简单的连接数据库的java程序,方便临时使用: import java.sql.*; import java.io.*; import java.sql.DriverManager; import j ...

  9. elastic的gc相关

    https://www.jianshu.com/p/1f450826f62e   gc原理介绍 相关优化 https://zhaoyanblog.com/archives/319.html 问题 ht ...

  10. [洛谷P1006] 传纸条

    双线程DP的常识:DP的阶段问题:多阶段决策问题 传送门:$>here<$ 题意 n*m的矩阵里,从左上角走到右下角(只能往右或往下),再从右下角走回左上角(只能往左或往上).其中不能重复 ...