什么是cooker:
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等。
参数的意义:
NAME: cookie的名字
VALURE: cookie的值
Exoires: cookie的过期时间
Path: cookie作用的路径
Domain: cookie作用的域名
SECURE: 是否只在https协议下期起作用
方法一:首先要获取登入后的cooker信息。
1 from urllib import request
5 huang_url = ''
6
7 headers = {
8 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
9 'cookie': '使用自己的cooker号'
10 }
11
12 req = request.Request(url=huang_url, headers=headers)
13 reqs = request.urlopen(req)
14 with open('bokeyuan.html', 'w', encoding='utf-8') as fp:
15 # write函数必须写入一个str 的数据类型
16 # reqs.read() 读取的是一个bytes书籍类型
17 # bytes -> decode -> str 类型之间的转换
18 # str -> encode -> bytes
19 fp.write(reqs.read().decode('utf-8'))
每次访问都要获取cookie的页面从浏览器中复制cookie比较麻烦,在Python处理cookie,一般是通过 http.cookiejar 模块 和 urllib 模块的HTTPCookieProcessor 处理器类一起使用。http.cookiejar 模块主要作用是提供用于储存cookie的对象。而 HTTPCookieProcessor 处理器主要作用是处理这些Cookie对象,并构建handle对象。
http.cookiejar模块:
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
- LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。
方法二:
1 # 访问的大鹏主页:http://www.renren.com/880151247/profile
2 # 网站的登入页: http://www.renren.com/PLogin.do
3
4 from urllib import request, parse
5 from http.cookiejar import CookieJar
6
7
8 # 登入
9 # 1.1 创建一个cookiejar对象
10 cookiejar = CookieJar()
11 # 1.2 使用cookiejar创建一个 HTTPCookieProcess对象
12 handler = request.HTTPCookieProcessor(cookiejar)
13 # 1.3 使用上一步创建的headler创建一个opener
14 opener = request.build_opener(handler)
15
16
17
18 # 1.4 使用opener发送登入请求(用户名和密码)
19 headlers = {
20 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
21 }
22 data = {
23 'email': '970138074@qq.com',
24 'password': 'pythonspider'
25 }
26 login_url = 'http://www.renren.com/PLogin.do'
27 req = request.Request(url=login_url, headers=headlers, data=parse.urlencode(data).encode('utf-8'))
28 opener.open(req)
29
30
31
32 # 2.访问个人主页
33 # 需要访问的个人主页
34 zhuye_url = 'http://www.renren.com/880151247/profile'
35 # 获取个人主页的时候不要重新构建opener
36 # 而是应使用之前的 opener,因为之前的opener已经包含需要的cookie信息
37 req = request.Request(url=zhuye_url, headers=headlers)
38 reqs = opener.open(req)
39 with open('zhuye.html', 'w', encoding='utf-8') as fp:
40 fp.write(reqs.read().decode('utf-8'))
整理成函数类型:
# 访问的大鹏主页:http://www.renren.com/880151247/profile
# 网站的登入页: http://www.renren.com/PLogin.do
from urllib import request, parse
from http.cookiejar import CookieJar
# 1.4 使用opener发送登入请求(用户名和密码)
headlers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
# 1.登入
def get_opener():
'''获取opener'''
# 1.1 创建一个cookiejar对象
cookiejar = CookieJar()
# 1.2 使用cookiejar创建一个 HTTPCookieProcess对象
handler = request.HTTPCookieProcessor(cookiejar)
# 1.3 使用上一步创建的headler创建一个opener
opener = request.build_opener(handler)
return opener
def login_renren(opener):
'''登入人人网'''
data = {
'email': '970138074@qq.com',
'password': 'pythonspider'
}
login_url = 'http://www.renren.com/PLogin.do'
req = request.Request(url=login_url, headers=headlers, data=parse.urlencode(data).encode('utf-8'))
opener.open(req)
# 2.访问个人主页
def fanhui_profile(opener):
'''返回个人主页'''
# 需要访问的个人主页
zhuye_url = 'http://www.renren.com/880151247/profile'
# 获取个人主页的时候不要重新构建opener
# 而是应使用之前的 opener,因为之前的opener已经包含需要的cookie信息
req = request.Request(url=zhuye_url, headers=headlers)
reqs = opener.open(req)
with open('zhuye.html', 'w', encoding='utf-8') as fp:
fp.write(reqs.read().decode('utf-8'))
if __name__ == '__main__':
opener = get_opener()
login_renren(opener)
fanhui_profile(opener)
保存cookie到本地:
保存cookie到本地,可以使用cookiejar 的save 方法, 并且需要指定一个文件名:
1 from urllib import request
2 from http.cookiejar import MozillaCookieJar
3
4 # 1. 创建cookie.txt 文件
5 cookiejar = MozillaCookieJar('cookie.txt')
6 # 2. headler 创建headler
7 cookiejar.load(ignore_discard=True) # 加载cookie 信息
8 headler = request.HTTPCookieProcessor(cookiejar)
9 # 3. 创建opener
10 opener = request.build_opener(headler)
11
12 # 向网页发请求
13 # opener.open('http://httpbin.org/cookies/set?course=abc')
14 opener.open('http://httpbin.org/cookies')
15 for cookie in cookiejar:
16 print(cookie)
17 # cookiejar.save(ignore_discard=True)
18 # ignore_discard=True 时表示保存过期cookie信息
现在执行的是加载cookiejar.load()
注释的是创建cookie文件的