用cookie和session解决http访问的无状态性 - Go语言中文社区

用cookie和session解决http访问的无状态性


 

目录

(一)前端数据抓取

 (二)网路请求格式

 (三)代码编写

 (三)基于二的结果直接请求登陆后的页面能否成功?(不能)

(四)http无状态访问解决方法 

方法一:(太笨,不推荐,懂原理就行,就是加上Request Header信息,里面有cookie)

 方法二:(推荐)requests库的session对象能够帮我们跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookies。(省时间可直接看我)


提示:最终解决方案可直接看(四)的方法二

提示:最终解决方案可直接看(四)的方法二

提示:最终解决方案可直接看(四)的方法二

(一)前端数据抓取

我们点击登录时将email和password传输到action指定的接口进行验证,验证成功会返回index页面

 (二)网路请求格式

 我先故意输错账户密码来观察时怎么提交数据的,原来在login的headers里的Form Data中我们上图画出的两个id,一个email,一个password,那么我么写代码就好写了,因为我们确定了登录接口是上图的action地址,字典两个键值对是email和password

 

 (三)代码编写

import requests

login_url = 'http://www.renren.com/PLogin.do'  # action指定的接口网址
param_dic = {
    "email":'15292222130', #我乱写的,用自己真是的账号试试吧
    'password':'2502222629'
}
response = requests.post(url=login_url,data=param_dic) # 模仿Form Data中的数据传入接口来获取页面
print(response)
with open('login_me.html','w',encoding='utf-8') as fp: # 保存到当前目录下的login_me.html
    fp.write(response.text)

 点击运行生成的login_me.html文件就能进入我们登陆后的界面了:

 这就是返回到本地的登陆成功后的页面

 

 (三)基于二的结果直接请求登陆后的页面能否成功?(不能)

先说明结果吧:login_me.html是登陆成功后的页面,index.html是让你登录的输入用户名密码的login页面,也就是说第一次登陆对第二次访问不保留任何数据,这就是http的无状态性

以下代码生成两个页面,

import requests

login_url = 'http://www.renren.com/PLogin.do'
param_dic = {
    "email":'15292222130', # 用自己真实的号
    'password':'2502222629'
}
response = requests.post(url=login_url,data=param_dic)    # 用户名密码登陆
print(response)
with open('login_me.html','w',encoding='utf-8') as fp:    # 结果拿到login_me.html中
    fp.write(response.text)

print('------------------------------------')

response2 = requests.get(url='http://share.renren.com/share/hot/v7') # 直接访问登陆后的分享界面
print(response2)
with open('index.html','w',encoding='utf-8') as fp: # 结果拿到index.html中
    fp.write(response2.text)

执行结果:

login_me.html页面运行结果:

index.html页面运行结果:(上面登陆成功对我并没有卵用)

(四)http无状态访问解决方法 

方法一:(太笨,不推荐,懂原理就行,就是加上Request Header信息,里面有cookie)

将用户和密码登陆后的分享界面的Request Headers的内容(里面有cookie等信息)传到request2那句语句里就好了。

注意:(1)必须传入与http://share.renren.com/share/hot/v7对应的cookie,因为每个页面的cookie不一样,一样的只是用户名和密码等一些重要的部分罢了,如下图主页与分享页cookie相等测试结果为false

            (2)Request Headers的内容的压缩 Accept-Encoding:gzip, deflate语句去掉

下图是http://share.renren.com/share/hot/v7http://www.renren.com/970549775页面cookied的比较:说明不同页面cookie不完全同,所以Request Headers的内容也不同

 操作代码如下:

import requests

login_url = 'http://www.renren.com/PLogin.do'
param_dic = {
    "email":'15292222130', # 用自己真实的呀,此处本人已改
    'password':'2502222629'
}
# response = requests.post(url=login_url,data=param_dic)
# print(response)
# with open('login_me.html','w',encoding='utf-8') as fp:
#     fp.write(response.text)
# print('------------------------------------')
header = {
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    # Accept-Encoding:gzip, deflate    去掉本行
    'Accept-Language':'zh-CN,zh;q=0.9',
    'Cache-Control':'max-age=0',
    'Connection':'keep-alive',
    'Cookie':'anonymid=juw9e8uvw942tf; depovince=JL; _r01_=1; ick_login=4d62f3f6-618c-40d6-a886-d7d448ec2115; ick=2e7078e5-35b5-40d8-8bcf-9f2996393445; __utma=151146938.2133801573.1556175088.1556175088.1556175088.1; __utmc=151146938; __utmz=151146938.1556175088.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; first_login_flag=1; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; XNESSESSIONID=e53492a7f0de; __guid=16886779.3661857952729198600.1556179294726.8813; jebecookies=8260082c-e8cd-4ff1-a0e8-9e42a46c1305|||||; _de=9238B3813359A30973ACD3C06372F715; p=eebddb9bfc5b0cba776902572576d9695; ln_uact=15290419130; t=4a5519e74017cdff3899a0fe05d015195; societyguester=4a5519e74017cdff3899a0fe05d015195; id=970549775; xnsid=ac23bd63; ver=7.0; loginfrom=null; jebe_key=c233d0a3-3da1-4de0-b3ab-dcf9190ecfaf%7Cd435b4d4dce7db0b54ca4d1603b6ef68%7C1556185164882%7C1%7C1556185152706; wp_fold=0; monitor_count=6',
    'Host':'share.renren.com',
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'

}
response2 = #requests.request('get',url='http://share.renren.com/share/hot/v7',headers=header)与下面一句一样,因为requests.get方法在返回时就调用了requests.request()方法,且以get为第一个参数
response2 = requests.get(url='http://share.renren.com/share/hot/v7',headers=header)
print(response2)
with open('index_header.html','w',encoding='utf-8') as fp:
    fp.write(response2.text)

 注意:

#requests.request('get',url='http://share.renren.com/share/hot/v7',headers=header)与下面一句一样,因为requests.get方法在返回时就调用了requests.request()方法,且以get为第一个参数
response2 = requests.get(url='http://share.renren.com/share/hot/v7',headers=header)

运行结果:

执行index_header.html页面成功进入返回到本地的分享页面:

 方法二:(推荐)requests库的session对象能够帮我们跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookies。(省时间可直接看我)

import requests

login_url = 'http://www.renren.com/PLogin.do'
param_dic = {
    "email":'15292222130',
    'password':'2502222629'
}
session = requests.session()

response = session.post(url=login_url,data=param_dic) #post请求实现,session保持参数

response3 = session.get(url='http://share.renren.com/share/hot/v7') # 用session保持的参数进行第二次请求实现登陆

with open('session_me.html','w',encoding='utf-8') as fp:
    fp.write(response3.text)

 执行代码生成的页面:

 打开页面:

 我们可以实现动态编码设置,按照每个网页的编码形式写入文件,结果会与上面效果一样:

成功!

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/sinat_38068807/article/details/89520437
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-29 21:51:46
  • 阅读 ( 2784 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢