python-爬虫-网络请求(三)

http.cookiejar

前面讲到的cookie的使用,我们首先使用的是浏览器登陆之后,将中间的cookie取出来,之后将其应用到代码中,实现代码请求的功能,但是显然这样并不是非常的完美,如果代码能够自动的获取到cookie并完成后续的工作会更加的完美

对于这个http.cookiejar,该模块主要的类有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。对于这四类的作用非别如下:
1、CookieJar:管理HTTP cookie值,存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象,整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失
2、FileCookieJar:从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中,filename是存储cookie的文件名,delayload为True时支持延迟访问文件,即只有在需要时才需读取文件或在文件中存储数据
3、MozillaCookieJar:从FileCookieJar派生而来,创建与Mozilla浏览器cookies.txt兼容的FileCookieJar实例
4、LWPCookieJar:从FileCookieJar派生而来,创建与libwww-per标准的Set-Cookie3文件格式兼容的FileCookieJar实例

除了上面说到的http.cookiejar以外,还需要使用到request.HTTPCookieProcessor
示例:

	from urllib import request
	from urllib import parse
	from http.cookiejar import CookieJar
	
	# 1、登陆
	# 1.1、创建一个cookiejar对象
	cookiejar = CookieJar()
	# 1.2、使用cookiejar创建一个HTTPCookieProcess对象
	handler = request.HTTPCookieProcessor(cookiejar)
	# 1.3、使用上一步创建的handler创建一个opener
	opener = request.build_opener(handler)
	
	# 1.4、使用opener发送登陆的请求
	headers = {
	    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
	}
	data = {
	    'email':'[email protected]',
	    'password':'xxx'
	}
	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)
	
	# 访问个人主页
	dapeng_url = 'http://www.renren.com/xxx/profile'
	# 获取个人主页的页面的时候,不要新建一个opener
	# 而应该使用之前的那个opener,因为之前的那个opener中间已经包含了登陆所需要的cookie信息
	req = request.Request(dapeng_url,headers=headers)
	resp = opener.open(req)
	with open('renren.html','w',encoding='utf-8') as fw:
	    fw.write(resp.read().decode('utf-8'))

对于上面的代码,看起来还是比较的乱,下面将其封装成不同的函数

	from urllib import request
	from urllib import parse
	from http.cookiejar import CookieJar
	
	headers = {
	        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
	    }
	
	def get_opener():
	    cookiejar = CookieJar()
	    handler = request.HTTPCookieProcessor(cookiejar)
	    opener = request.build_opener(handler)
	
	def login_renren(opener):
	    data = {
	        'email': '[email protected]',
	        'password': 'xxx'
	    }
	    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):
	    # 访问个人主页
	    dapeng_url = 'http://www.renren.com/xxx/profile'
	    # 获取个人主页的页面的时候,不要新建一个opener
	    # 而应该使用之前的那个opener,因为之前的那个opener中间已经包含了登陆所需要的cookie信息
	    req = request.Request(dapeng_url, headers=headers)
	    resp = opener.open(req)
	    with open('renren.html', 'w', encoding='utf-8') as fw:
	        fw.write(resp.read().decode('utf-8'))
	        
	if __name__ == '__main__':
	    opener = get_opener()
	    login_renren(opener)
	    visit_profile(opener)

保存cookie在本地

	from urllib import request
	from http.cookiejar import MozillaCookieJar
	
	cookiejar = MozillaCookieJar('cookie.txt')
	handler = request.HTTPCookieProcessor(cookiejar)
	opener = request.build_opener(handler)
	
	resp = opener.open('http://www.baidu.com')
	cookiejar.save()

这里需要了解到的是在实例化MozillaCookieJar时候,我们就能够传入需要最后将cookie保存到的文件名;如果在实例化的时候并没有写需要保存到哪个文件中间的话,在最后调用save方法的时候,也是可以将文件名放入其中的
将上面的命令执行完成之后,就能够得到如下的cookie.txt文件

# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit.

.baidu.com	TRUE	/	FALSE	3713864400	BAIDUID	AE67114AD42FA696B9C9139CD37B0806:FG=1
.baidu.com	TRUE	/	FALSE	3713864400	BIDUPSID	AE67114AD42FA696B9C9139CD37B0806
.baidu.com	TRUE	/	FALSE	3713864400	PSTM	1566380753

前面说到cookie是存在有生命周期的,如果超过这个时间,cookie就会消失
这里可以通过浏览器访问http://httpbin.org/cookies/set?course=hahaha,这样就会在浏览器中创建一个cookie的key是course,value是hahaha,但是当浏览器关闭的时候,这个cookie就会随之消失,代码中间也是一样,代码执行完成之后,cookie就会自动消失,这个时候如果想要将这个过期的cookie也保存在本地文件中间,就需要使用到参数ignore_discard=True了,如下面代码所示

	from urllib import request
	from http.cookiejar import MozillaCookieJar
	
	cookiejar = MozillaCookieJar('cookie.txt')
	handler = request.HTTPCookieProcessor(cookiejar)
	opener = request.build_opener(handler)
	
	resp = opener.open('http://httpbin.org/cookies/set?course=hahaha')
	cookiejar.save(ignore_discard=True)

此时查看cookie.txt文件,可以看到如下的内容

# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit.

httpbin.org	FALSE	/	FALSE		course	hahaha

可以看到,中间的course的值就是我们设置的hahaha
上面介绍到将一个cookie信息写入到一个文件中间,自然有存入就会有读取,将一个cookie信息读取出来的方式就是load方法

	from http.cookiejar import MozillaCookieJar
	
	cookiejar = MozillaCookieJar('cookie.txt')
	cookiejar.load(ignore_discard=True)
	for cookie in cookiejar:
	    print(cookie)

上面在load的时候一样使用到了ignore_discard的参数,表示忽略过期时间
打印出来的内容如下:

<Cookie course=hahaha for httpbin.org/>

可以看到,前面设置的course=hahaha就已经成功的读取出来了

你可能感兴趣的:(python网络爬虫)