pyhton爬虫学习(六):Cookie的使用

2020-05-14  本文已影响0人  记忆九天

什么是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()

代码如下:(这里假设一个登录的接口)

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设置没有问题。

欢迎关注本人公众号和小程序,谢谢
公众号 小程序
上一篇 下一篇

猜你喜欢

热点阅读