Python 全栈工程师核心面试 300 问深入解析(2020 版)----全文预览
Python 全栈工程师核心面试 300 问深入解析(2020 版)----欢迎订阅
上接:
Python3网络爬虫教程5——ProxyHandler处理(代理服务器和代理IP)
4. cookie & session
- 产生的原因:
- 由于HTTP协议没有记忆性,人们为了弥补这个缺陷,所采用的一个补充协议
- cookie是发放给用户(即http浏览器)的一段信息,session是保存在服务器上的
- 对应的另一半信息,用来记录用户的信息
- cookie和session的区别
- 存放位置不同
- cookie不安全
- session会保存在服务器上一段时间,有一定的期限,会过期
- 单个cookie数据不超过4KB,很多浏览器限制一个站点最多保存20个
- session的存放位置
- 存在服务器端
- 一般情况,session是放在内存中或者数据库中
- 没有cookie登陆,模拟登陆人人网
- 看案例43_11
- 没有cookie的登陆,返回的网页为未登陆状态,自动跳转到登陆首页
案例 43_11
# 没有cookie登陆,模拟登陆人人网
# 先登陆自己人人网个人主页,复制主页的网址,
# 如果关闭浏览器后再次打开浏览器,粘贴网址,由于浏览器保存了cookie信息,会进入到个人主页
# 个人主页地址复制到另外一台电脑登陆或者另外一个浏览器,由于没有cookie登陆会跳转到人人网主页
import chardet
from urllib import request
if __name__ == '__main__':
# 个人人人网登陆后的个人主页
url = 'http://www.renren.com/574862780'
rsp = request.urlopen(url)
html = rsp.read().decode('UTF-8')
# 将打开的网页保存为html文件,然后浏览器打开
with open('43_11_rsp.html', 'w') as f:
f.write(html)
- 使用cookie登陆人人网
- 直接将网页中的cookie复制下来,然后手动放入请求头
- 看案例43_12
案例 43_12
# 使用cookie登陆,模拟登陆人人网
# 先登陆自己人人网个人主页,复制主页的网址,
# 如果关闭浏览器后再次打开浏览器,粘贴网址,由于浏览器保存了cookie信息,会进入到个人主页
# 个人主页地址复制到另外一台电脑登陆或者另外一个浏览器,由于没有cookie登陆会跳转到人人网主页
# 复制已登录的主页中的cookie信息到请求头中
# 注意cookie有时效性,第二天再次使用可能cookie已经失效
import chardet
from urllib import request
if __name__ == '__main__':
# 个人人人网登陆后的个人主页
url = 'http://www.renren.com/969464538/profile'
headers = {'Cookie': 'anonymid=jqz93aa61j2ebq; depovince=ZGQT; _r01_=1; JSESSIONID=abcCDVfle7EH5eGmyXAHw; ick_login=2c2236f7-9001-4b87-8f7a-4d1ef7936834; t=0c73459378e50f6e3ee47ae345e53ff28; societyguester=0c73459378e50f6e3ee47ae345e53ff28; id=969464538; xnsid=a53a566e; jebecookies=f50fc9af-aab9-4b0e-ba46-2f6662e91791|||||; ver=7.0; loginfrom=null; wp_fold=0'}
req = request.Request(url, headers=headers)
rsp = request.urlopen(req)
html = rsp.read().decode()
# 将打开的网页保存为html文件,然后浏览器打开
with open('43_12_rsp.html', 'w') as f:
f.write(html)
- cookie模块
- http模块包含一些关于cookie的模块,通过他们我们可以自动使用cookie
- CookieJar
- 管理存储cookie,向传出的http请求头添加cookie
- cookie存储在内存中,CookieJar实例回收后cookie将消失
- FileCookieJar(filename, delayload=None, policy=None)
- 使用文件管理cookie
- filename是保存cookie的文件
- MozillaCookieJar(filename, delayload=None, policy=None)
- 创建与Mozilla浏览器cookie.txt兼容的FileCookie案例
- LwpCookieJar(filename, delayload=None, policy=None)
- 创建与libwww-perl标准兼容的Set-Cookie3格式的FileCookieJar实例
- 他们关系是:CookieJar–>FileCookieJar–>MozillaCookieJar&LwpCookieJar
- 利用CookieJar访问人人网
- 看实例43_13
- 自动使用cookie登陆的流程
- 打开登陆页面后自动通过用户密码登陆
- 自动提取反馈回来的cookie
- 利用提取的cookie登陆隐私页面
- 案例中的handler是Handler的实例,常规用法参考实例
案例 43_12
# 使用cookie登陆,模拟登陆人人网
# 先登陆自己人人网个人主页,复制主页的网址,
# 如果关闭浏览器后再次打开浏览器,粘贴网址,由于浏览器保存了cookie信息,会进入到个人主页
# 个人主页地址复制到另外一台电脑登陆或者另外一个浏览器,由于没有cookie登陆会跳转到人人网主页
# 复制已登录的主页中的cookie信息到请求头中
# 注意cookie有时效性,第二天再次使用可能cookie已经失效
import chardet
from urllib import request
if __name__ == '__main__':
# 个人人人网登陆后的个人主页
url = 'http://www.renren.com/969464538/profile'
headers = {'Cookie': 'anonymid=jqz93aa61j2ebq; depovince=ZGQT; _r01_=1; JSESSIONID=abcCDVfle7EH5eGmyXAHw; ick_login=2c2236f7-9001-4b87-8f7a-4d1ef7936834; t=0c73459378e50f6e3ee47ae345e53ff28; societyguester=0c73459378e50f6e3ee47ae345e53ff28; id=969464538; xnsid=a53a566e; jebecookies=f50fc9af-aab9-4b0e-ba46-2f6662e91791|||||; ver=7.0; loginfrom=null; wp_fold=0'}
req = request.Request(url, headers=headers)
rsp = request.urlopen(req)
html = rsp.read().decode()
# 将打开的网页保存为html文件,然后浏览器打开
with open('43_12_rsp.html', 'w') as f:
f.write(html)
# 生成cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
- 创建handler之后,使用opener打开,打开后相应的业务由相应的handler处理
- 将cookie作为一个变量打出来
- 参考案例43_14
- cookie的属性
- name: 名称
- value: 值
- domain: 可以访问此cookie的域名
- path: 可以访问此cookie的页面路径
- expires: 过期的时间
- size:大小
- http字段
- cookie的保存
- 使用FileCookieJar
- 参考案例43_15
- cookie的读取
- 使用cookie.load('cookie.txt')
案例 43_14
# 将cookie打印出来
# 看看cookie里面有什么
from urllib import request, parse
from http import cookiejar
# 创建cookiejar的实例
cookie = cookiejar.CookieJar()
# 生成cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
# 初次登录,验证后给我们cookie
def login():
'''
负责初次登录
需输入用户名和密码,用来获取cookie凭证
'''
# 登录用户地址,进入人人网登录首页,查看网页源码
# 网页源码中打开查找,查找“下次自动登录”
# 然后向上找form,里面就有login-form
url = 'http://www.renren.com/PLogin.do'
# 此键值需要从登录form的对应两个input中提取name属性
data = {
'email': '908851835@qq.com',
'password': 'zfb123456'
}
# 把数据进行编码
data = parse.urlencode(data)
# 创建一个请求对象
req = request.Request(url, data=data.encode())
# 使用opener发起请求,会自动提取我的cookie
rsp = opener.open(req)
if __name__ == '__main__':
# 如果已经执行了login,则opener则自动已经包含了相应的cookie值
login()
# 我们将cookie打印出来,可以采用访问字典的方式访问
print(cookie)
for item in cookie:
print(type(cookie))
print(item)
# 获取item的属性
print(dir(item))
# 把最后一个item里面所有的变量打印出来
for i in dir(item):
print(i)
案例 43_15
# 将获取到的cookie保存下来
# 使用filecookiejar实现
from urllib import request, parse
from http import cookiejar
# 创建filecookiejar的实例
filename = '43_15_cookie.txt'
cookie = cookiejar.MozillaCookieJar(filename)
# 生成cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
# 初次登录,验证后给我们cookie
def login():
'''
负责初次登录
需输入用户名和密码,用来获取cookie凭证
'''
# 登录用户地址,进入人人网登录首页,查看网页源码
# 网页源码中打开查找,查找“下次自动登录”
# 然后向上找form,里面就有login-form
url = 'http://www.renren.com/PLogin.do'
# 此键值需要从登录form的对应两个input中提取name属性
data = {
'email': '908851835@qq.com',
'password': 'zfb123456'
}
# 把数据进行编码
data = parse.urlencode(data)
# 创建一个请求对象
req = request.Request(url, data=data.encode())
# 使用opener发起请求,会自动提取我的cookie
rsp = opener.open(req)
# 保存cookie到文件
# ignore_discard表示即使cookie没什么用了也会保存下来
# ignore_expires表示该文件中的cookie即使已经过期也保存下来
cookie.save(ignore_discard=True, ignore_expires=True)
if __name__ == '__main__':
login()
下接:
Python3网络爬虫教程7——SSL数字证书