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

这里以人人网为例。人人网中,要访问某个人的主页,必须要先登录才能访问,登录说白了就是要有 cookie 信息。那么如果我们想要用代码的方式访问,就必须要有正确的 cookie 信息才能访问,解决方案有两种,第一种是使用浏览器访问,然后将 cookie 信息复制下来,放到 headers 中,示例代码如下:

#encoding: utf-8
from urllib import  request

depeng_url = "http://www.renren.com/880151247/profile"

headers = {
    'UserAgent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    'Cookie': 'anonymid=jqewdu46-f830xp; depovince=GW; _r01_=1; JSESSIONID=abc9VPQhX7gL_hnevMnGw; ick_login=4fdbca4f-c066-4f40-a01e-7f10366dc67c; _de=5C036F2CDFB303719207B9A3A486C947; t=988054f3b22992650f4362722ba56d1e2; societyguester=988054f3b22992650f4362722ba56d1e2; id=968493932; xnsid=f2662708; jebecookies=d1072d7b-4170-4a74-bb5c-01e6db26baf1|||||; ver=7.0; loginfrom=null; jebe_key=e69dc881-6f1b-475b-9986-40ee2d43d05c%7C1bc078f6a5af51e81eaaa6221694f0ea%7C1546416414963%7C1%7C1546416413988; jebe_key=e69dc881-6f1b-475b-9986-40ee2d43d05c%7C1bc078f6a5af51e81eaaa6221694f0ea%7C1546416414963%7C1%7C1546416413992; wp_fold=0'
}

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

resp = request.urlopen(req)

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

但是每次在访问需要 cookie 的页面都要从浏览器中复制 cookie 比较麻烦。在 Python 处理 Cookie ,一般是通过http.cookiejar模块和urllib模块的HTTPCookieProcessor处理器类一起使用。http.cookiejar模块主要作用是提供用于存储的 cookie 对象。

http.cookiejar模块

该模块主要的类有CookieJarFileCookieJarMozillaCookieJarLWPCookieJar。这四个类的作用分别如下:

  • CookoeJar :管理HTTP cookie值、存储HTTP请求生成的 cookie 、向传出的HTTP请求添加 cookie 的对象。整个 cookie 都存储在内存中,对 CookieJar 实例进行垃圾回收后 cookie 也将丢失
  • FileCookieJar(filename,delayload=None,policy=None):从 CookieJar 派生而来,用来创建 FileCookieJar 实例,检索 cookie 信息并将 cookie 存储到文件中。filename是存储的 cookie 文件名。delayloadTrue时支持延迟访问文件,即只有在需要时才读取文件或在文件中存储数据。
  • MozillCookieJar(filename,delayload=None,policy=None):从 FileCookieJar 派生而来,创建与 Mozill 浏览器 cookie.txt 兼容的 FileCookieJar 实例
  • LWPCookieJar(filename,delayload=None,policy=None):从 FileCookieJar 派生而来,创建与 libwww-per 标准的 Set-Cookie3 文件格式兼容的 FileCookieJar 实例

利用http.cookiejarrequest.HTTPCookieProcessor登录人人网。相关示例代码如下:

#encoding: utf-8

from urllib import request
from urllib import parse
from http.cookiejar import CookieJar

headers = {
        'UserAgent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
    }

def get_opener():
    # 1.登录
    # 1.1 创建CookieJar对象
    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': '填写你的邮箱',
        'password': '填写你的密码'
    }

    login_url = "http://www.renren.com/PLogin.do"
    req = request.Request(login_url, data=parse.urlencode(data).encode('utf-8'), headers=headers)
    opener.open(req)

def visit_profile(opener):
    # 2.访问个人主页
    dapeng_url = "http://www.renren.com/880151247/profile"
    req = request.Request(dapeng_url, headers=headers)
    resp = opener.open(req)
    with open('renren.html', 'w', encoding='utf-8') as fp:
        fp.write(resp.read().decode('utf-8'))

if __name__ == '__main__':
    opener = get_opener()
    login_renren(opener)
    visit_profile(opener)
最后修改:2019 年 01 月 03 日 01 : 50 PM