1.什么是cookie?
在网站中,http的请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登陆服务器返回一些数据(cookie)给浏览器,然后浏览器保存到本地,当该用户第二次请求的时候,就会自动把上次请求存储的cookie数据自动的携带给服务器。服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同浏览器有不同的存储大小,但一般不超过4kb。因此使用cookie只能存储一些小量的数据。
cookie的格式:
Set-cookie: NAME=VALUE Expires/Max-age=DATE Path=PATH Domain=DOMAIN_NAME SECURE
参数解释:
- NAME:cookie的名字
- VALUE:cookie的值
- Expires: cookie的过期时间。
- Path: cookie作用的路径。
- Domain: cookie作用的域名。
- SECURE:是否只在htps协议下起作用
2.使用cookielib库和HTTPCookieProcessor模拟登陆
2.1 手工复制cookie
Cookie是指网站服务器为了辨别身份和session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登陆信息到用户下次与服务器的会话。
实战演练:
- 不使用cookie,直接访问
from urllib import request
# 不使用cookie去登录主页
tmp_url = \'http://www.renren.com/238656222/profile\'
headers = {
\'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36\'
}
req = request.Request(url=tmp_url,headers=headers)
resp = request.urlopen(req)
# print(resp.read().decode())
# 将返回的网站源码写入到文件中
with open(\'renren.html\',\'w\',encoding=\'utf-8\') as f:
f.write(resp.read().decode(\'utf-8\'))
运行后,在浏览器打开下载的renren.html,如下:
- 使用cookie
打开谷歌浏览器的检查 -->> Network ,然后刷新页面:http://www.renren.com/238656222/profile 【前提是已经成功登录了】,找到下图中所示,即可得到cookie信息
from urllib import request
tmp_url = \'http://www.renren.com/238656222/profile\'
headers = {
\'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36\',
\'Cookie\':\'anonymid=k63l1pld-bmvm58; _r01_=1; taihe_bi_sdk_uid=e010145001347915db9751467f2cd0ea; _ga=GA1.2.1477590665.1580561077; depovince=GW; ick_login=b0a0dff4-179b-4cda-ae35-fbf3e97f9912; taihe_bi_sdk_session=602eb6642e983c664e81de65e367d143; _de=02B2EB92B8F71ACD92522705638FE3D8; ick=c1f8dd1e-4910-4c57-ac6c-b83ac1076c06; __utma=151146938.1477590665.1580561077.1580561077.1585144279.2; __utmc=151146938; __utmz=151146938.1585144279.2.2.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmb=151146938.4.10.1585144279; jebecookies=80d8ee16-c0e2-4a18-8fbf-7a53f40793e2|||||; p=7619396d7fce293085bc7b12b502a2da2; first_login_flag=1; ln_uact=18298377941; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20130527/1710/h_main_kCBe_44640000035d111a.jpg; t=bd1094d556c2c9d7e0c270a25abc53862; societyguester=bd1094d556c2c9d7e0c270a25abc53862; id=422522252; xnsid=ee08367c; ver=7.0; loginfrom=null; wp_fold=0; jebe_key=03183a84-908b-4464-a274-effbad2465bd%7C328749f653f1c822a5c17f3cffb81c7e%7C1585144561819%7C1%7C1585144563940\'
}
req = request.Request(url=tmp_url,headers=headers)
resp = request.urlopen(req)
# print(resp.read().decode())
# 将返回的网站源码写入到文件中
with open(\'renren2.html\',\'w\',encoding=\'utf-8\') as f:
f.write(resp.read().decode(\'utf-8\'))
此时已经成功的登录到主页了
2.2 自动登录并授权访问
在【2.1 手工复制cookie】中,我们每次都需要手工去浏览器复制cookie比较麻烦,在Python处理cookie,一般是通过http.cookiejar模块和urllib模块的HttpCookieProcessor处理类一起使用。http.cookiejar模块主要作用是存储cookie对象。而HttpCookieProcessor处理类主要是处理这些cookie对象,并构建Handler对象。
- http.cookiejar模块
该模块主要的类有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。这四个类的作用分别如下:-
CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
-
FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
-
MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
-
LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。
-
实战演练:利用http.cookiejar和HttpCookieProcessor登录人人网,并授权访问
from urllib import request
from urllib import parse
from http.cookiejar import CookieJar
headers = {
\'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36\'
}
def get_opener():
# 1.登录
# 1.1创建一个cookiesjar对象
cookiejar = CookieJar()
# 1.2使用cookiejar创建一个HTTPCookieProcessor对象
handler = request.HTTPCookieProcessor(cookiejar)
# 1.3使用上一步创建的handler创建一个opener
opener = request.build_opener(handler)
return opener
def login_renren(opener):
# 1.4使用opener发送登录的请求(人人网的邮箱和密码)
data = {
\'email\': \'182xxxx\',
\'icode\':\'\',
\'origURL\': \'http://www.renren.com/home\',
\'domain\': \'renren.com\',
\'key_id\': \'1\',
\'captcha_type\': \'web_login\',
\'password\': \'4b58ca16c38851fd1b6ca6be866e95d7dbce492e32c659be27a9403732b86b06\',
\'rkey\': \'cb15f985754fd884a44506ff5db1256e\',
\'f\': \'http%3A%2F%2Fwww.renren.com%2F422522252\'
}
login_url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2020232216437"
req = request.Request(login_url, data=parse.urlencode(data).encode(\'utf-8\'), headers=headers)
opener.open(req)
print(request.urlopen(req).read().decode())
def visit_profile(opener):
# 2.访问主页
tmp_url = "http://www.renren.com/238656222/profile"
# 获取个人主页的页面的时候,不要新建一个opener
# 而是应该使用之前的那个opener,因为之前的那个opener已经包含了
# 登录所需要的cookie信息
req = request.Request(tmp_url, headers=headers)
resp = opener.open(req)
with open(\'renren3.html\', \'w\', encoding=\'utf-8\') as fp:
fp.write(resp.read().decode(\'utf-8\'))
if __name__ == \'__main__\':
opener = get_opener()
login_renren = login_renren(opener)
visit_profile = visit_profile(opener)
上述代码中data中的信息来自浏览器,在Network下可以查看
3.cookie信息的保存和加载
3.1 cookie信息的保存
保存cookie到本地,可以使用cookiejar的save方法,并且需要指定一个文件名
# Author:Logan
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar(\'cookie.txt\')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
headers = {
\'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36\'
}
req = request.Request(\'http://httpbin.org/cookies/set?man=tom\',headers=headers)
resp = opener.open(req)
print(resp.read())
cookiejar.save()
运行程序后,我们可以看到生成了一个cookie.txt文件,但是打开文件发现,并没有保存cookie,如下图:
接着打开浏览器观察,如下图:
接着查看目前在使用的Cookie如下图:
通过上图我们可以发现Cookie是在浏览器会话结束的时候cookie就到期了,所以我们的cookie中没有保存cookie
此时我们需要添加参数ignore_discard=True
,修改点如下图标记部分
再次查看,可以看到cookie已经被保存了
3.2 cookie信息的加载
# Author:Logan
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar(\'cookie.txt\')
cookiejar.load(ignore_discard=True)
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
headers = {
\'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36\'
}
req = request.Request(\'http://httpbin.org/cookies\',headers=headers)
resp = opener.open(req)
for cookie in cookiejar:
print(cookie)
打印结果: