python3爬虫学习笔记之cookie的使用

Openers和Handlers

当你访问URL时,你使用的就是一个opener(这是urllib.reuest.OpenerDirector的一个实例)。一般来说我们使用的是默认的opener—通过urlopen—但是你可以创建自定义的opener。opener会使用handler。所有的“重活”都是由handler完成的。每一个handler知道如何去处理某种类型的URL(http,ftp等等),或者是如何处理访问URL的某一方面,如HTTP重定向或HTTP cookies。

如果你想要用特定的handler来访问URL,你可以创建一个opener。比如,得到一个处理cookies的opener或者是一个不处理重定向的opener。

直接获取网站cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'JustFantasy'

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

request_url = 'http://www.baidu.com'

# 此处r是用来防止字符转义的,如果字符串中有'\t'的话,如果不加r就会被转义
user_agent = r'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87'

# Keep-Alive功能使客户端到服务器端的连接持续有效
headers = {'User-Agent': user_agent, 'Connection': 'keep-alive'}

# 创建一个cookie对象,不传递参数说明创建了一个空的cookie对象
cookie_obj = cookiejar.CookieJar()

# 创建一个cookie处理器,来管理cookie_obj
handler = request.HTTPCookieProcessor(cookie_obj)

# 初始化一个opener,此opener中所有通信的cookie_obj都会在cookie对象中记录。
# 这个cookie是没有域限制的,也就是全局cookie
opener = request.build_opener(handler)
req = request.Request(request_url, headers=headers)
response = opener.open(req)
#print(response.read().decode('utf-8'))
for obj in cookie_obj:
print('Name=' + obj.name)
print('Value=' + obj.value)

打印结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Name=BAIDUID
Value=F7B32E8B42B0D2699852D37CA2EEA208:FG=1
Name=BIDUPSID
Value=F7B32E8B42B0D2699852D37CA2EEA208
Name=H_PS_PSSID
Value=1464_21110_17001_22035_22157
Name=PSTM
Value=1489496197
Name=BDSVRTM
Value=0
Name=BD_HOME
Value=0
Name=BD_LAST_QID
Value=17852155557234882650

将获取到的cookie写入文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'JustFantasy'

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

request_url = 'http://www.baidu.com'

filename = 'cookie.txt'

# 此处r是用来防止字符转义的,如果字符串中有'\t'的话,如果不加r就会被转义
user_agent = r'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87'

# Keep-Alive功能使客户端到服务器端的连接持续有效
headers = {'User-Agent': user_agent, 'Connection': 'keep-alive'}

# 创建一个MozillaCookie对象,用来保存COOKIE,之后写入文件,注意这里需要传递文件名称作为参数
cookie_obj = cookiejar.MozillaCookieJar(filename)
# 创建一个cookie处理器,来管理cookie_obj
handler = request.HTTPCookieProcessor(cookie_obj)

# 初始化一个opener,此opener中所有通信的cookie_obj都会在cookie对象中记录。这个cookie是没有域限制的,也就是全局cookie
opener = request.build_opener(handler)
req = request.Request(request_url, headers=headers)
response = opener.open(req)

# 保存到cookie文件中
# ignore_discard表示cookies将被丢弃也将它保存下来
# ignore_expires表示如果在该文件中cookies已经存在,则覆盖原文件写入
cookie_obj.save(ignore_discard=True, ignore_expires=True)

执行完毕之后的文件内容:

1
2
3
4
5
6
7
8
9
10
11
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file! Do not edit.

.baidu.com TRUE / FALSE 3636980893 BAIDUID DF850858024C160092C94859576B7EC2:FG=1
.baidu.com TRUE / FALSE 3636980893 BIDUPSID DF850858024C160092C94859576B7EC2
.baidu.com TRUE / FALSE H_PS_PSSID 1438_21093_18560_17001_22035_22160
.baidu.com TRUE / FALSE 3636980893 PSTM 1489497072
www.baidu.com FALSE / FALSE BDSVRTM 0
www.baidu.com FALSE / FALSE BD_HOME 0
www.baidu.com FALSE / FALSE 1489497247 BD_LAST_QID 16085727699863129509

从文件中获取Cookie并访问

原理就是从文件中获取cookie,传递给cookie处理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'JustFantasy'

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

# 此处r是用来防止字符转义的,如果字符串中有'\t'的话,如果不加r就会被转义
user_agent = r'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87'
# Keep-Alive功能使客户端到服务器端的连接持续有效
headers = {'User-Agent': user_agent, 'Connection': 'keep-alive'}
# 请求URL
request_url = 'http://www.baidu.com'
# 记录COOKIE的文件名称
filename = 'cookie.txt'

# 初始化一个MozillaCookie对象
cookie_obj = cookiejar.MozillaCookieJar()

# 从文件中读取cookie到对象中
cookie_obj.load(filename, ignore_discard=True, ignore_expires=True)

# 初始化处理对象,此时的cookie_obj对象是带了文件中保存的COOKIE的
handler = request.HTTPCookieProcessor(cookie_obj)

opener = request.build_opener(handler)
req = request.Request(request_url, headers=headers)
response = opener.open(req)
print(response.read().decode('utf-8'))

下一节学习通过cookie模拟登录