Python爬虫基础之Cookie

时间:2021-12-11 06:44:11

一、Cookie会话

  简单地说,cookie就是存储在用户浏览器中的一小段文本文件。Cookies是纯文本形式,它们不包含任何可执行代码。一个Web页面或服务器告之浏览器来将这些信息存储并且基于一系列规则在之后的每个请求中都将该信息返回至服务器。当服务器收到浏览器请求附带的Cookie会话信息,会认为浏览器发出的请求是合法的,是经过身份验证的。否则,会拒绝浏览器的请求。

Python爬虫基础之Cookie

 

二、访问需要登录态Cookie的页面

1.使用opener.open()方式

 1 import urllib.request
2 import urllib.parse
3 import re
4 import http.cookiejar
5 import urllib.error
6
7 user_agent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4'
8 # 初始化headers
9 headers = {'User-Agent': user_agent}
10 url = 'http://passport.fenqile.com/auth/valid.json'
11 cookie_filename = 'cookie.txt'
12 cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
13 handler = urllib.request.HTTPCookieProcessor(cookie)
14 opener = urllib.request.build_opener(handler)
15
16 try:
17 # 登录分期乐
18 params = {'uin': '18312494183', 'passwd': '918e41b0e66ca43b8a45923de7d1148e', 'imgcode': '',
19 '_1': '6', '_2': '46888', '_3': '24624940', 'url': ''
20 }
21 data = urllib.parse.urlencode(params).encode(encoding='utf-8', errors='ignore')
22 request = urllib.request.Request(url, data=data, headers=headers, method='POST')
23 response = opener.open(request)
24 buff = response.read()
25 html = buff.decode('utf-8')
26 cookie.save(ignore_discard=True, ignore_expires=True) # 保存cookie到cookie.txt中
27 for item in cookie:
28 print('Name = ' + item.name)
29 print('Value = ' + item.value)
30 if re.search('ok', html):
31 print('login success')
32 # 访问需要登录态Cookie的页面
33 target_url = 'http://order.fenqile.com/order/list.html'
34 request = urllib.request.Request(target_url, headers=headers, method='GET')
35 response = opener.open(request)
36 print(response.read().decode('utf-8'))
37 else:
38 print('login fail')
39 except urllib.error.HTTPError as e:
40 print(e.reason)
41 except urllib.error.URLError as e:
42 print(e.reason)


现在我们来分析下以上的代码,怎么保存并把cookie传递到后续每个需要登录态的请求:

cookie_filename = 'cookie.txt'cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
cookie.save(ignore_discard=True, ignore_expires=True) 
引用http.cookiejar.MozillaCookieJar类声明一个FileCookieJar对象cookie,cookie可以用来把请求获取到的cookie会话信息保存到以cookie_filename命名的文件中,还可以在页面请求时从cookie文件中加
载会话信息并作为请求头参数Cookie。

handler = urllib.request.HTTPCookieProcessor(cookie) 

opener = urllib.request.build_opener(handler)

引用urllib.request.HTTPCookieProcessor类声明一个handler对象,用来处理http cookie会话信息,并把它作为参数传递给urllib.request.build_opener,设置成全局的http handler处理器,这样使用

opener.open()的请求都会带上之前保存的cookie会话信息。

 

2.使用urllib.request.urlopen()方式

 1 try:
2 # 登录分期乐
3 params = {'uin': '18312494183', 'passwd': '918e41b0e66ca43b8a45923de7d1148e', 'imgcode': '',
4 '_1': '6', '_2': '46888', '_3': '24624940', 'url': ''
5 }
6 data = urllib.parse.urlencode(params).encode(encoding='utf-8', errors='ignore')
7 request = urllib.request.Request(url, data=data, headers=headers, method='POST')
8 response = opener.open(request)
9 buff = response.read()
10 html = buff.decode('utf-8')
11 cookie.save(ignore_discard=True, ignore_expires=True) # 保存cookie到cookie.txt中
12 order_cookie = []
13 for item in cookie:
14 print('Name = ' + item.name)
15 print('Value = ' + item.value)
16 e = (item.name, item.value) # 转换为元祖,保存到列表中
17 order_cookie.append(item.name + '=' + item.value)
18
19 order_cookie = ';'.join(order_cookie) # 拼接成a=b;c=d;格式字符串
20 if re.search('ok', html):
21 print('login success')
22 # 访问需要登录态Cookie的页面
23 target_url = 'http://order.fenqile.com/order/list.html'
24 order_headers = {
25 'User-Agent': user_agent,
26 'Cookie': order_cookie # 请求头带上Cookie
27 }
28 request = urllib.request.Request(target_url, headers=order_headers, method='GET')
29 response = urllib.request.urlopen(request)
30 print(response.read().decode('utf-8'))
31 else:
32 print('login fail')
33 except urllib.error.HTTPError as e:
34 print(e.reason)
35 except urllib.error.URLError as e:
36 print(e.reason)

与opener.open()方式相比,通过urllib.request.urllib发送请求方式稍微复杂些,首先需要遍历返回的登录态的cookie,转换为元素并保存到列表orderlist里面,再通过字符串join(seq)方法拼接成字符串,最后以字典格式添加到请求头order_headers里面传递给

Request对象的参数headers赋值,调用urllib.request.urlopen()就能带上Cookie会话信息请求了,虽然步骤挺多,不过方法还是行得通的。