1. Cookie简介(详见百度百科)

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265。(可以叫做浏览器缓存)

Cookie,意思是“小甜点”,存储的数量有限,不同的浏览器有不同的存储大小,但一般不超过4kb。

cookie的格式:

# --coding:utf-8-- #
# 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:是否在https协议下起作用

2. 使用Cookie和HTTPCookieProcessor模拟登陆

有些网站在访问某个人的主页,必须先登录才能访问,登陆说白了就是要有cookie信息。那么如果我们想要用代码的方式访问,就必须要有正确的cookie信息才能访问。解决方案有两种

(1)第一种是使用浏览器访问,然后将cookie信息复制下来,放到headers中,示例代码如下:

# --coding:utf-8-- #
import urllib2
# 1. 不使用cookie去请求网站“http://www.renren.com/410203840/profile”
person_url = "http://www.renren.com/410203840/profile"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36"
}
req = urllib2.Request(url=person_url, headers=headers)
resp = urllib2.urlopen(req)
with open("C:\\Users\\Administrator\\Desktop\\notcookie.html", "w") as fp:
    # write函数必须写入一个str的数据类型
    # resp.read()读出来的是一个bytes数据类型
    # bytes -> decode -> str
    # str -> encode -> bytes
    # fp.write(resp.read().decode('utf-8'))
    fp.write(resp.read())

# 2. 使用cookie去请求网站“http://www.renren.com/410203840/profile”
person_url0 = "http://www.renren.com/410203840/profile"
headers0 = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36",
    "Cookie": "wP_h=274634eb0dde4425e245fb116e3b2815876463c0; anonymid=ji4qelyh-9q1mm6; depovince=GW; _r01_=1; JSESSIONID=abc3MdXtmkNRy4Zat-Apw; ick_login=64c8fe32-3b8a-4c28-8b0d-1cbd2413a268; __utma=151146938.630660969.1528387907.1528387907.1528387907.1; __utmc=151146938; __utmz=151146938.1528387907.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; ick=6031132c-f3f8-4522-a9fa-05f3d9896a2c; _de=426D9275B2D2D9FAA134AD7773858BDB; t=1e9adf0614c1e6410d231919dbe055e05; societyguester=1e9adf0614c1e6410d231919dbe055e05; id=966343165; xnsid=24f8124b; XNESSESSIONID=33807365f6a6; ch_id=10016; wp_fold=0; jebecookies=07a35f66-baa5-4f2b-90e7-b2040df0f12c|||||; jebe_key=bcfdf5f1-4130-400d-883c-3e69502ce52c%7C7ba940edb19430bf2d01d07d26712600%7C1528389711605%7C1; jebe_key=bcfdf5f1-4130-400d-883c-3e69502ce52c%7C7ba940edb19430bf2d01d07d26712600%7C1528389711605%7C1%7C1528389833434"
}
req0 = urllib2.Request(url=person_url0, headers=headers0)
resp0 = urllib2.urlopen(req0)
with open("C:\\Users\\Administrator\\Desktop\\cookie.html", "w") as fp:
    # write函数必须写入一个str的数据类型
    # resp.read()读出来的是一个bytes数据类型
    # bytes -> decode -> str
    # str -> encode -> bytes
    # fp.write(resp.read().decode('utf-8'))
    fp.write(resp0.read())

(2)第二种方法是用cookielib模块、urllib2中的HTTPCookieProcessor方法模拟登陆。示例代码如下:

# --coding:utf8-- #
import urllib
import urllib2
import cookielib

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


def get_opener():
    # 1. 登陆
    # 1.1 创建一个cookiejar对象
    cookiejar = cookielib.CookieJar()
    # 1.2 使用CookieJar创建一个HTTPCookieProcess对象
    handler = urllib2.HTTPCookieProcessor(cookiejar)
    # 1.3 使用已经创建的handler创建一个opener
    opener = urllib2.build_opener(handler)
    return opener


def login_renren(opener):
    # 1.4 使用opener发送登陆的请求(登陆某人网的账号和密码)
    # 自己的账号和自己的密码
    data = {
        "email": "970138074@qq.com",
        "password": "pythonspider"
    }
    login_url = "http://www.renren.com/PLogin.do"
    req = urllib2.Request(login_url, data=urllib.urlencode(data).encode("utf-8"), headers=headers)
    opener.open(req)


def visit_profile(opener):
    # 2 访问个人主页
    person_url = "http://www.renren.com/410203840/profile"
    # 获取个人主页的页面的时候,不要新建一个opener。应该使用之前那个opener,
    # 因为之前那个opener已经包含了登陆所需要的cookie信息
    resp = opener.open(person_url)
    with open("C:\\Users\\Administrator\\Desktop\\incookie.html", "w") as f:
        f.write(resp.read())


if __name__ == '__main__':
    opener = get_opener()
    login_renren(opener)
    visit_profile(opener)

3. cookie信息的加载与保存

# --coding:utf-8-- #
# cookie信息的加载与保存
import urllib
import urllib2
import cookielib

cookiejar = cookielib.MozillaCookieJar("C:\\Users\\Administrator\\Desktop\\cookie.txt")
cookiejar.load(ignore_discard=True)
handler = urllib2.HTTPCookieProcessor(cookiejar)
opener = urllib2.build_opener(handler)

resp = opener.open("http://httpbin.org/cookies/set?freeform=abc")
# ignore_discard=True 忽略被抛弃的东西(忽略过时的cookie信息)
cookiejar.save(ignore_discard=True)

for cookie in cookiejar:
    print cookie

print "Cookie保存成功"

以上就是这两种方法,仅供参考,欢迎交流。