如图,为了实现用户标记,在Http无状态请求的基础之上,我们需要在请求中携带一些用户信息(比如用户名之类,这些信息是服务器发送到本地浏览器的,但是服务器并不存储这些信息),这就是cookie机制。如下图所示,在登录马蜂窝网站之后,就可以看到浏览器已经保存了一些cookie信息(chrome浏览器为例):
需要注意的是:cookie信息是保存在本地浏览器里面的,服务器上并不存储相关的信息。 在发送请求时,cookie的这些内容是放在 Http协议中的header 字段中进行传输的。
Session_key:服务器给用户返回的ID
Session_data:一段加密的文字。用户名,密码,一些其他的用户信息。把这些信息生成一段字符串,是加密的
expire_date:django后台会设置过期时间。 主要是担心session被黑客截取,那就一直可以用,盗用数据。
第二步,当用户登录时,服务器会给本地浏览器返回一些cookie信息,包括session ID。
#提取到的请求信息:
Headers:
Request URL:https://passport.mafengwo.cn/login/
Request Method:POST
origin:https://passport.mafengwo.cn
referer:https://passport.mafengwo.cn/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
Form Data:
passport:13725168940
password:aaa00000000
# -*- coding: utf-8 -*-
import requests
userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
header = {
# "origin": "https://passport.mafengwo.cn",
"Referer": "https://passport.mafengwo.cn/",
'User-Agent': userAgent,
}
def mafengwoLogin(account, password):
# 马蜂窝模仿 登录
print ("开始模拟登录马蜂窝")
postUrl = "https://passport.mafengwo.cn/login/"
postData = {
"passport": account,
"password": password,
}
responseRes = requests.post(postUrl, data = postData, headers = header)
# 无论是否登录成功,状态码一般都是 statusCode = 200
print(f"statusCode = {responseRes.status_code}")
print(f"text = {responseRes.text}")
if __name__ == "__main__":
# 从返回结果来看,有登录成功
mafengwoLogin("13756567832", "000000001")
# -*- coding: utf-8 -*-
import requests
# python2 和 python3的兼容代码
try:
# python2 中
import cookielib
print(f"user cookielib in python2.")
except:
# python3 中
import http.cookiejar as cookielib
print(f"user cookielib in python3.")
# session代表某一次连接
mafengwoSession = requests.session()
# 因为原始的session.cookies 没有save()方法,所以需要用到cookielib中的方法LWPCookieJar,这个类实例化的cookie对象,就可以直接调用save方法。
mafengwoSession.cookies = cookielib.LWPCookieJar(filename = "mafengwoCookies.txt")
userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
header = {
# "origin": "https://passport.mafengwo.cn",
"Referer": "https://passport.mafengwo.cn/",
'User-Agent': userAgent,
}
def mafengwoLogin(account, password):
# 马蜂窝模仿 登录
print("开始模拟登录马蜂窝")
postUrl = "https://passport.mafengwo.cn/login/"
postData = {
"passport": account,
"password": password,
}
# 使用session直接post请求
responseRes = mafengwoSession.post(postUrl, data = postData, headers = header)
# 无论是否登录成功,状态码一般都是 statusCode = 200
print(f"statusCode = {responseRes.status_code}")
print(f"text = {responseRes.text}")
# 登录成功之后,将cookie保存在本地文件中,好处是,以后再去获取马蜂窝首页的时候,就不需要再走mafengwoLogin的流程了,因为已经从文件中拿到cookie了
mafengwoSession.cookies.save()
if __name__ == "__main__":
# 从返回结果来看,有登录成功
# mafengwoLogin("13756567832", "000000001")
# 文件:mafengwoCookies.txt
#LWP-Cookies-2.0
Set-Cookie3: __today_login=1; path="/"; domain=".mafengwo.cn"; path_spec; domain_dot; expires="2018-03-16 15:56:15Z"; httponly=None; version=0
Set-Cookie3: mafengwo="0a60e1a04f6a6f5555f0e285602b5b17_94281374_5aab641fb23d42.37804626_5aab641fb23dc3.28763728"; path="/"; domain=".mafengwo.cn"; path_spec; domain_dot; expires="2018-06-13 06:25:03Z"; httponly=None; version=0
Set-Cookie3: mfw_uuid="5aab641f-b789-96ef-736d-48640285f4c0"; path="/"; domain=".mafengwo.cn"; path_spec; domain_dot; expires="2019-03-16 06:25:03Z"; version=0
Set-Cookie3: oad_n="a%3A3%3A%7Bs%3A3%3A%22oid%22%3Bi%3A1029%3Bs%3A2%3A%22dm%22%3Bs%3A20%3A%22passport.mafengwo.cn%22%3Bs%3A2%3A%22ft%22%3Bs%00009%3A%222018-03-16+14%3A28%3A47%22%3B%7D"; path="/"; domain=".mafengwo.cn"; path_spec; domain_dot; expires="2018-03-23 06:25:03Z"; version=0
Set-Cookie3: uol_throttle=94281374; path="/"; domain=".mafengwo.cn"; path_spec; domain_dot; expires="2018-03-16 06:35:03Z"; version=0
# -*- coding: utf-8 -*-
import requests
# python2 和 python3的兼容代码
try:
# python2 中
import cookielib
print(f"user cookielib in python2.")
except:
# python3 中
import http.cookiejar as cookielib
print(f"user cookielib in python3.")
# session代表某一次连接
mafengwoSession = requests.session()
# 因为原始的session.cookies 没有save()方法,所以需要用到cookielib中的方法LWPCookieJar,这个类实例化的cookie对象,就可以直接调用save方法。
mafengwoSession.cookies = cookielib.LWPCookieJar(filename = "mafengwoCookies.txt")
userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
header = {
# "origin": "https://passport.mafengwo.cn",
"Referer": "https://passport.mafengwo.cn/",
'User-Agent': userAgent,
}
def isLoginStatus():
# 通过访问个人中心页面的返回状态码来判断是否为登录状态
routeUrl = "http://www.mafengwo.cn/plan/route.php"
# 下面有两个关键点
# 第一个是header,如果不设置,会返回500的错误
# 第二个是allow_redirects,如果不设置,session访问时,服务器返回302,
# 然后session会自动重定向到登录页面,获取到登录页面之后,变成200的状态码
# allow_redirects = False 就是不允许重定向
responseRes = mafengwoSession.get(routeUrl, headers = header, allow_redirects = False)
print(f"isLoginStatus = {responseRes.status_code}")
if responseRes.status_code != 200:
return False
else:
return True
if __name__ == "__main__":
mafengwoSession.cookies.load()
isLogin = isLoginStatus()
print(f"is login mafengwo = {isLogin}")
'''
# 按照之前保存过的mafengwoCookies.txt登录,属于登录状态:
user cookielib in python3.
isLoginStatus = 200
is login mafengwo = True
'''
'''
# 如果把mafengwoCookies.txt中的信息修改掉之后,就无法登录了,属于非登录状态了
user cookielib in python3.
isLoginStatus = 302
is login mafengwo = False
'''
# -*- coding: utf-8 -*-
import requests
# python2 和 python3的兼容代码
try:
# python2 中
import cookielib
print(f"user cookielib in python2.")
except:
# python3 中
import http.cookiejar as cookielib
print(f"user cookielib in python3.")
# session代表某一次连接
mafengwoSession = requests.session()
# 因为原始的session.cookies 没有save()方法,所以需要用到cookielib中的方法LWPCookieJar,这个类实例化的cookie对象,就可以直接调用save方法。
mafengwoSession.cookies = cookielib.LWPCookieJar(filename = "mafengwoCookies.txt")
userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
header = {
# "origin": "https://passport.mafengwo.cn",
"Referer": "https://passport.mafengwo.cn/",
'User-Agent': userAgent,
}
# 马蜂窝模仿 登录
def mafengwoLogin(account, password):
print("开始模拟登录马蜂窝")
postUrl = "https://passport.mafengwo.cn/login/"
postData = {
"passport": account,
"password": password,
}
# 使用session直接post请求
responseRes = mafengwoSession.post(postUrl, data = postData, headers = header)
# 无论是否登录成功,状态码一般都是 statusCode = 200
print(f"statusCode = {responseRes.status_code}")
print(f"text = {responseRes.text}")
# 登录成功之后,将cookie保存在本地文件中,好处是,以后再去获取马蜂窝首页的时候,就不需要再走mafengwoLogin的流程了,因为已经从文件中拿到cookie了
mafengwoSession.cookies.save()
# 通过访问个人中心页面的返回状态码来判断是否为登录状态
def isLoginStatus():
routeUrl = "http://www.mafengwo.cn/plan/route.php"
# 下面有两个关键点
# 第一个是header,如果不设置,会返回500的错误
# 第二个是allow_redirects,如果不设置,session访问时,服务器返回302,
# 然后session会自动重定向到登录页面,获取到登录页面之后,变成200的状态码
# allow_redirects = False 就是不允许重定向
responseRes = mafengwoSession.get(routeUrl, headers = header, allow_redirects = False)
print(f"isLoginStatus = {responseRes.status_code}")
if responseRes.status_code != 200:
return False
else:
return True
if __name__ == "__main__":
# 第一步:尝试使用已有的cookie登录
mafengwoSession.cookies.load()
isLogin = isLoginStatus()
print(f"is login mafengwo = {isLogin}")
if isLogin == False:
# 第二步:如果cookie已经失效了,那就尝试用帐号登录
print(f"cookie失效,用户重新登录...")
mafengwoLogin("13756567832", "000000001")
resp = mafengwoSession.get("http://www.mafengwo.cn/plan/fav_type.php", headers = header, allow_redirects = False)
print(f"resp.status = {resp.status_code}")
# 第一次运行程序的输出:
# 由于第一次还没有生成cookie,所以需要用账户登录一次
user cookielib in python3.
isLoginStatus = 302
is login mafengwo = False
cookie失效,用户重新登录...
开始模拟登录马蜂窝
statusCode = 200
……………………
resp.status = 200
# 第二次运行程序的输出:
# 第二次,就直接使用cookie登录了,不再需要使用帐号登录
user cookielib in python3.
isLoginStatus = 200
is login mafengwo = True
resp.status = 200