Python的cookies与session

一. 渊源

当我们浏览一个网页,比如逛淘宝,我们在上面进行了登录,然后看上了心仪的东西并加入了购物车。临时有事,把电脑关掉了,第二天再重新打开这个界面的时候,我们发现并没有进行登录操作,就已经登陆上去了,而且看了一下昨天的“足迹”和购物车,该在的还都在,这是为什么?如果过一段很长的时间,再去看的话,那个登录的程序我们还得再走一遍,这又是为什么?今天我们就以此作为一个引入,介绍一下今天的主角-----cookies,就是这个小饼干。

二. 实例介绍

当我们逛淘宝的时候,我们的登录信息会被记录下来,并保存在本地,短期内在再次登录的时候,它就会被检索,如果有,那么就会登陆上去,不需要二次登录,这个过程中,起作用的就是cookies。cookies还有一个好伙伴,是session,这个我们待会儿再说它。
很多时候,我们在百度一个东西后,如果在下面要进行评论,都必须进行登录。殊不知,你在登陆的时候,有一个东西一直在监视在你的一举一动。下来我们就具体分析这个过程。

三. 具体分析

我们以这个网站作为分析的对象:
https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php
首先打开这个网站,输入账号:spiderman和密码:crawler334566别着急点击登录,用的谷歌浏览器,使用快捷键“Ctrl+shift+i”,然后调出网页的源码,如下图所示:
Network页面
把图中的“Preserve log”勾起来,然后点击左侧页面的登录即可。

可以看到,点击登录后,右侧也“燥起来了”:

登陆后的动态
我们点击那个wp-login.php,看到很多东西,点击最下面的Form Data,展开后就可以看到我们刚才被“监视”了,并且账号和密码也在这里一览无余,如图:
在这里插入图片描述
至此,我们就可以看到cookies的一个简要的作用,它把我们提交的表单信息(注册、登录这种的)保存了下来,下次再用的时候,就不用再次登录了,方便了很多。为啥就是cookies起的作用?我们再点开上面的“Response Headers”,可以看到set cookies的参数,set cookies的意思就是往浏览器写入了cookies,由此才知道cookies确实在这儿到了作用。

四. 代码实现(Python)

  1. 通过刚才的Form Data,我们可以看到在登录的时候,服务器的一个数据的保存。利用这个,我们现在向服务器发起登陆请求。
import requests
url  = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php'
#这个url我们可以在General里面获得
headers = {
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36
}
#headers在Request Headers里的最后一项,加headers的目的是为了模拟浏览器的正常访问,避免被反爬虫
data = {
log: spiderman
pwd: crawler334566
wp-submit: 登录
redirect_to: https://wordpress-edu-3autumn.localprod.forc.work
testcookie: 1
}
#有关登陆的参数封装为字典,赋值给data
gin_in = requests.pots(url,headers = headers,data = data)
print(gin_in)

#运行结果:<Response [200]>
	注:200是状态码,表示登陆成功

2.像刚才提到的,我们在百度下面的评论。现在我们也在这个博客下面进行评论,看看效果是什么样子。
我在下面评论一句“纯属测试哈哈哈哈”,然后可以看到右侧夹在了很多东西,找到“wp-comments-post.php”,点开它,看里面的headers,哇,看下图:
在这里插入图片描述
现在,我们又找到了发表评论的参数,接着上面的代码继续写,目的是能够发表想发表的评论,因为我们在上一步已经登录上去了。

import requests
url  = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php'
#这个url我们可以在General里面获得
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
}
#headers在Request Headers里的最后一项,加headers的目的是为了模拟浏览器的正常访问,避免被反爬虫
data = {
'log': 'spiderman',
'pwd': 'crawler334566',
'wp-submit': '登录',
'redirect_to': 'https://wordpress-edu-3autumn.localprod.forc.work',
'testcookie': '1'
}
#有关登陆的参数封装为字典,赋值给data
login_in = requests.pots(url,headers = headers,data = data)

cookies = login_in.cookies
#调用requests对象(login_in)的cookies属性获得登录的cookies,并赋值给变量cookies。

url_1 = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-comments-post.php'
#我们要发表评论的文章的网址
data_1 = {
'comment': input('s输入你想发表的评论:'),
'submit': '发表评论',
'comment_post_ID': '13'
'comment_parent': '0'
}
#把有关评论的参数封装为字典
comment = requests.post(url_1,headers = headers,data = data_1,cookies = cookies)
#调用cookies的方法就是在post请求中传入cookies参数
print(comment.status_code)
#打印状态码,若等于200,则表明发表成功

通过以上代码,我们就可以发表评论了。

五 . 项目优化(session)

大体上先来了解一下session,我们在逛淘宝的时候,与网页的交互就相当于会话,而session是会话过程中,服务器用来记录特定用户会话的信息。比如你打开浏览器逛购物网页的整个过程中,浏览了哪些商品,在购物车里放了多少件,这些记录都会被服务器保存在session中。如果没有session,可能会出现这样的情况:你加购了很多的东西,结算时,啥子都没有。
session和cookies的关系非常密切,cookies中存储着session的编码信息,session中又存储了cookies的信息。
当浏览器第一次访问购物页面时,服务器会返回set cookies的字段给浏览器,而浏览器会把cookies保存到本地。第二次访问时,就会带着cookies去请求,而因为cookies里带有会话的编码信息,服务器会立马认出这个用户,同时返回和这个用户相关的特定编码的session。这就是为什么每次重新登录后,之前在购物车车里放入的商品信息不会消失的原因。至此,我们就大概搞清了session和cookies的关系了。

1. 优化:创建一个session来处理cookies
在requests的高级用法里,有这样的方法。下来我们可以看到优化后的代码:

import requests

session = requests.session()
#用requests.session()创建session对象,相当于创建了一个特定的会话,帮我们自动保存cookies

url  = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php'

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
}

data = {
'log': input("输入账号:"),
'pwd': input('输入密码:'),   #这样写更优雅
'wp-submit': '登录',
'redirect_to': 'https://wordpress-edu-3autumn.localprod.forc.work',
'testcookie': '1'
}
#有关登陆的参数封装为字典,赋值给data
login_in = requests.pots(url,headers = headers,data = data)

session.post(url,headers = headers,data = data)
#在创建的session下用post发起请求

url_1 = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-comments-post.php'
data_1 = {
'comment': input('输入你想发表的评论:'),
'submit': '发表评论',
'comment_post_ID': '13'
'comment_parent': '0'
}

comment = session.post(url_1,headers = headers,data = data_1)

print(comment)
2. 进一步优化:保存登录状态----存储cookies
把cookies要存储到txt文件里,但是cookies并不是字符串。可以用这样的方法:先把cookies转成字典,然后再通过json模块转换成字符串,然后再用open()函数把cookies存储成txt文件。
(1)cookies转换成字典的方法:

requests.utils.dict_from_cookiejar(参数)

(2)json模块的使用方法:

函数 描述
json.dumps 将Python对象编码成json字符串
json.loada 将已编码的JSON字符串解码为Python对象

存储cookies为txt文件:

import requests
session = requests.session()
url = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php'
headers = {
'User-Agen't: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
}
data = {
'log': input("输入账号:"),
'pwd': input('输入密码:'),   #这样写更优雅
'wp-submit': '登录',
'redirect_to': 'https://wordpress-edu-3autumn.localprod.forc.work',
'testcookie': '1'
}
session.post(url,headers = headers,data = data)
cookies-dict = requests.utils.dict_from_cookiejar(session.cookies)
cookies_str = json.dumps(cookies_dict)
f = open('cookies.txt','w')
f.write(cookies_str)
f.close()

3. 读取cookies
这一步与上一步相反,先把字符串转成字典,再把字典转成本来的格式。读取cookies的代码如下:

cookies_txt = open('cookies.txt','r')
cookies_dict = json.loads(cookies_txt.read())
#把字符串转换成字典
cookies = requests.utils.cookiejar_from_dict(cookie_dict)
#把字典转换成cookies本来的格式
session.cookies = cookies
#获取cookies

4. 终极优化
把上面所有的代码合起来,并考虑到cookies在本地存在与否以及cookies过期的问题,我们将代码最终完善如下,不懂的地方在对应处分别由相应的注释。

import requests,json
#c创建一个session对象,自动保持了cookies
session = requests.session()
#添加请求头,避免被反爬虫
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
}

def cookies_read():
    cookies_txt = open('cookies.txt','r')
    cookies_dict = json.loads(cookies_txt.read())
    cookies = requests.utils.cookiejar_from_dict(cookies_dict)
    return cookies

def login_in():
    #登陆界面的网址
    url = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php'
    data = {
        'log': input('请输入你的账号:'),
        'pwd': input('请输入你的密码:'),
        'wp-submit': '登录',
        'redirect_to': 'https://wordpress-edu-3autumn.localprod.forc.work/wp-admin/',
        'testcookie': '1'
    }
    #在会话下,用post发起登陆请求
    session.post(url,headers = headers,data = data)

    #以下代码是指的是在没有cookies的情况下,对cookies进行读取和保存为txt文件的过程
    #把cookies转化为字典
    cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)
    #调用json的dumps函数把cookies从字典再转换成字符串
    cookies_str = json.dumps(cookies_dict)
    #创建文件,准备写入cookies
    f = open('cookies.txt','w')
    #把已经转化为字符串的cookies写入文件
    f.write(cookies_str)
    f.close()

def write_message():
    #要发评论的文章的网址
    url_2 = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-comments-post.php'
    data_1 = {
        'comment':input('你想发表什么评论:'),
        'submit': '发表评论',
        'comment_post_ID': '13',
        'comment_parent': '0'
    }
    return(session.post(url_2,headers = headers,data = data_1))

try:
    session.cookies = cookies_read()
except FileNotFoundError:
    login_in()
    session.cookies = cookies_read()

status_code = write_message()
if status_code == 200:
    print('成功了!')
else:
    login_in()
    session.cookies = cookies_read()
    status_code = write_message()

六. 结语

至此,我们已经完成了对cookies和session的基本认知和对它们的应用问题的一个实例,以及在当今的重要性。灵活利用cookies可以为我们的日常生活带来很多便利,要多多学习。
文章难免有错,欢迎大家在指出,我们一起学习进步!

发布了11 篇原创文章 · 获赞 12 · 访问量 2392

猜你喜欢

转载自blog.csdn.net/J_GMson/article/details/90471901
今日推荐