爬虫学习二(Cookie)

什么是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 = 'https://www.cnblogs.com/QQmini/'
 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 (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。

  • 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文件的

 

posted @ 2019-05-04 14:12  QQmini  阅读(422)  评论(0编辑  收藏  举报