爬虫(10):Cookie

Cookie 是指某些网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话。

Cookie原理

HTTP是无状态的面向连接的协议, 为了保持连接状态, 引入了Cookie机制 Cookie是http消息头中的一种属性,包括:    

    Cookie名字(Name)
    Cookie的值(Value)
    Cookie的过期时间(Expires/Max-Age)
    Cookie作用路径(Path)
    Cookie所在域名(Domain),

    Cookie的值(Value)
    Cookie的过期时间(Expires/Max-Age)
    Cookie作用路径(Path)
    Cookie所在域名(Domain),

    使用Cookie进行安全连接(Secure)。

   前两个参数是Cookie应用的必要条件,另外,还包括Cookie大小(Size,不同浏览器对Cookie个数及大小限制是有差异的)。


Cookie由变量名和值组成,根据 Netscape公司的规定,Cookie格式如下:

    Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE


Cookie应用Cookies在爬虫方面最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续。

cookielib库 和 HTTPCookieProcessor处理器在Python处理Cookie,一般是通过cookielib模块和 urllib2模块的HTTPCookieProcessor处理器类一起使用。

cookielib模块:主要作用是提供用于存储cookie的对象

HTTPCookieProcessor处理器:主要作用是处理这些cookie对象,并构建handler对象。

cookielib 库该模块主要的对象有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实例。

其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar() 或 LWPCookieJar()

我们来做几个案例:

1.获取Cookie,并保存到CookieJar()对象中    #
   

import urllib.request
from http import cookiejar

# 创建cookiejar对象
cookie = cookiejar.CookieJar()
# 处理器
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)

# 打开器
opener = urllib.request.build_opener(cookie_handler)

# 处理请求
response = opener.open('http://www.baidu.com')
print(response.code)
# print(cookie)

cookies = ''
for c in cookie:
    cookies += c.name + '=' + c.value + '\n'
    print(cookies)

2.访问人人网获得cookie,并把获得的cookie保存在cookie文件中    #
    !C:\Python36\python.exe    

import urllib
from http import cookiejar
from urllib import request, parse


cookieFile = 'cookie.txt'
cookie = cookiejar.LWPCookieJar()

cookie_handler = urllib.request.HTTPCookieProcessor(cookie)

opener = urllib.request.build_opener(cookie_handler)

# 登陆url
loginurl = "http://www.renren.com/PLogin.do"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}

data = {
    "email": "18588403840",
    "password": "Changeme_123"
}
data = urllib.parse.urlencode(data).encode('utf-8')

req = urllib.request.Request(url=loginurl, data=data, headers=headers)import urllib
from http import cookiejar
from urllib import request, parse




cookieFile = 'cookie.txt'
cookie = cookiejar.LWPCookieJar()


cookie_handler = urllib.request.HTTPCookieProcessor(cookie)


opener = urllib.request.build_opener(cookie_handler)


# 登陆url
loginurl = "http://www.renren.com/PLogin.do"


headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}


data = {
    "email": "18588403840",
    "password": "Changeme_123"
}
data = urllib.parse.urlencode(data).encode('utf-8')


req = urllib.request.Request(url=loginurl, data=data, headers=headers)


response = opener.open(req)




cookie.save(filename=cookieFile, ignore_discard=True, ignore_expires=True)


print(response.read().decode('utf-8'))

response = opener.open(req)


cookie.save(filename=cookieFile, ignore_discard=True, ignore_expires=True)

print(response.read().decode('utf-8'))

3.从文件中获取cookies,做为请求的一部分去访问    #
  

import urllib
from urllib import request
from http import cookiejar

cookie = cookiejar.LWPCookieJar()

cookiefile = './cookie.txt'
# 读取保存好的cookie
cookie.load(cookiefile, ignore_discard=True, ignore_expires=True)

# 处理器
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)

# 打开器
opener = urllib.request.build_opener(cookie_handler)

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}

# 不需要数据
data = {}

url = 'http://www.renren.com/965557295/profile'

req = urllib.request.Request(url, headers=headers)

response = opener.open(req)

print(response.read().decode('utf-8'))



猜你喜欢

转载自blog.csdn.net/yx1179109710/article/details/80901554