pyhton爬虫学习(六):Cookie的使用
什么是cookie
在爬虫的使用中,如果涉及登录等操作,经常要使用到Cookie。
那什么是Cookie呢?
简单来说,我们访问每一个互联网页面,都是通过http协议进行的,而http协议是一个无状态的协议,所谓的无状态协议即无法维持会话间的状态。
比如你用http登录一个网站,加入登录成功了,但是访问该网站其他网页的时候,登录状态则会消失,还需要在登录一次,只要页面涉及更新,就需要反复的进行登录,这是非常不方便的。
所以我们需要对将一些会话信息通过某种方式保存起来。常用的有两种方式,通过cookie保持会话信息或者通过Session保持会话信息。
通过Cookie保存会话信息,就是将会话信息保存在客户端,访问同一个网站的其他页面的时候,会从Cookie中读取对应的会话信息,从而判断目前的会话状态。比如可以判断是否已经登录。
通过Session保存会话信息,会将对应的会话信息保存在服务端,但是服务端一般会给客户端发SessionID等信息,这些信息一般也存储在客户端的Cookie中,用户访问该网站其他网页的时候,会从Cookie中读取这部分信息,然后从服务器中的session中根据这部分cookie信息检索出该客户端的所有会话信息,然后进行会话控制。现在使用session方式保存会话信息的的时候,大部分还是会用cookie。
那么cookie在python怎么使用呢?
首先,先学会怎么保存cookie的变量。比如登录的时候,需要保存cookie变量,在访问该网站的其他网页才能附带该保存的cookie变量进行访问,否则又要做一次登录的操作才有权限。
这里介绍保存cookie变量的两种方法。
使用http.cookiejar.CookieJar()
-
导入Cookie处理模块http.cookiejar
-
使用http.cookiejar.CookieJar()创建CookieJar对象。
-
使用HTTPCookieProcessor创建cookie处理器,并以其为参数构成opener对象
-
创建全局默认的opener对象。
代码如下:(这里假设一个登录的接口)
import urllib.request
import http.cookiejar
url = “http://login“
postdata = urllib.parse.urlencode({
“username”:用户名,
“password”:密码
}).encode(“utf-8”) #使用urlencode编码处理后,再设置为utf-8编码
req = urllib.request.Request(url,postdata)
req.add_header(‘User-Agent’,’Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36’)
#使用http.cookiejar.CookieJa()创建CookieJar对象
cjar = http.cookiejar.CookieJar()
#使用HTTPCookieProcessor创建cookie处理器,并以其为参数构建opener对象
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
urllib.request.install_opener(opener)
data = opener.open(req).read()
with open(“/Users/zhouruiyong/Desktop/python/unix3.html”,”wb”) as fhandle:
fhandle.write(data)
这里使用urllib.request.install_opener()的方法构建全局的opener对象,所以后面直接用urllib.request.urlopen访问的地址也会都带有对应的opener,即cookie也在其中。
获取cookie保存到文件中
# -- coding: utf-8 --
import urllib.request
import http.cookiejar
import ssl
url = “http://www.douban.com“
# context = ssl._create_unverified_context()
ssl._create_default_https_context = ssl._create_stdlib_context
req = urllib.request.Request(url)
req.add_header(‘User-Agent’,’Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36’)
#将cookie保存在本地,并命名为cookie.txt
cookie_filename = ‘/Users/zhouruiyong/Desktop/python/cookie.txt’
cookie_aff = http.cookiejar.MozillaCookieJar(cookie_filename)
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie_aff))
data = opener.open(req).read()
cookie_aff.save(ignore_discard=True,ignore_expires=True)#保存cookie到文件
with open(“/Users/zhouruiyong/Desktop/python/unix3.html”,”wb”) as fhandle:
fhandle.write(data)
运行之后,就会在cookie.txt文件里面看到存储的cookie内容。这里特别注意,因为豆瓣是https的,所以需要加入
sl._create_default_https_context = ssl._create_stdlib_context
才能正常访问。这是使用urllib.request.Request()的需要加入的方法,如果使用urllib.request.urlopen,则可以使用
context = ssl._create_unverified_context()
urllib.request.urlopen(url,context= context)
注意:如果访问https的网址不采取以上措施,会包ssl错误。
那么怎么调用cookie.txt里面的cookie反复使用呢,方法也很简单
cookie=cookielib.MozillaCookieJar()#声明CookieJar对象实例来保存cookie
cookie.load(‘/Users/zhouruiyong/Desktop/python/cookie.txt’,ignore_discard=True,ignore_expires=True)#从文件中读取内容到cookie变量中
handler=urllib.HTTPCookieProcessor(cookie)#处理器
opener=urllib.build_opener(handler)
很容易理解,这边就不细说了。
另外除了这种可以主动保存cookie再拿出来用的情况,我们也可以直接找到需要传递的cookie内容,直接放到相应的位置,也可以实现cookie的相关操作。至于怎么获取需要传递的cookie内容,其实很简单,用浏览器的开发者工具就可以找得到,这里截取谷歌浏览器的获取位置。
0004.png
然后就可以通过req.add_header(‘Cookie’,cookie内容)
进行头部添加,其他请求方式的头部添加也是类似。如果使用requests进行请求,则可以使用requests.get(url,cookies=cookie)
进行添加。
至于怎么检测这个cookies有没有效果,你可以试着登录某个网站,然后获取相应的cookie在python 代码中进行设置,请求保存到本地文件,用浏览器打开文件会发现是已经登录状态,说明你的cookie设置没有问题。