【爬虫学习笔记04】使用cookie类操作
由于我们访问页面时,cookie都会由浏览器自动加入包发送给服务器端,以便检验身份信息,故cookie操作也是一大重点。当然我们可以像发送User-Agent那样,将cookie手动加入header中,不过这不便于我们每次重新启动程序,因为这样每次都得从浏览器端拷贝一份cookie过来用。【再写另一个脚本程序实现拷贝功能不就好啦(
咳咳,以上为学习cookie操作的必要性,接下来是实际操作
python3中,有个神奇的库叫做http,这个库里有个神奇的模块叫做cookiejar,这个神奇的模块底下有个神奇的函数有堆神奇的函数可以用来操作cookie
首先引用入需要的库
1 2 3 |
from urllib import request as r from urllib import parse as p from http import cookiejar as co |
然后定义一个cookiejar实例出来【这个地方的神仙操作我实在没搞懂,就抄代码了
1 |
cookie = co.CookieJar() |
接着定义handler处理器
1 |
handler = r.HTTPCookieProcessor(cookie) |
再定义opener(打开器?
1 |
opener = r.build_opener(handler) |
最后只要经过获取一次cookie操作,我们再使用opener就可以猥琐为所欲为了
不保存cookie的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from urllib import request as r from urllib import parse as p from http import cookiejar as co cookiejar = co.CookieJar() # handler = r.HTTPCookieProcessor(cookiejar) handler = r.ProxyHandler({}) opener = r.build_opener(handler) header = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36', } #在这个网站站请求一个cookie,值为{'freeform':'dafda'} req = r.Request('http://httpbin.org/cookies/set?freeform=dafda',headers=header) test = opener.open(req) #随后我们查询一下这个网站是否有接受到我们的cookie req1 = r.Request('http://httpbin.org/cookies',headers=header) test = opener.open(req1) print(test.read().decode('utf-8')) |
结果如下:
第二次访问该网站时,该网站并没有接收到我们的cookie信息
保存cookie版本的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from urllib import request as r from urllib import parse as p from http import cookiejar as co cookiejar = co.CookieJar() handler = r.HTTPCookieProcessor(cookiejar) # handler = r.ProxyHandler({}) opener = r.build_opener(handler) header = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36', } #在这个网站站请求一个cookie,值为{'freeform':'dafda'} req = r.Request('http://httpbin.org/cookies/set?freeform=dafda',headers=header) test = opener.open(req) #随后我们查询一下这个网站是否有接受到我们的cookie req1 = r.Request('http://httpbin.org/cookies',headers=header) test = opener.open(req1) print(test.read().decode('utf-8')) |
这里我只修改了一句代码,即定义handler那句,但是结果就不一样了,当我们请求获取cookie后,再次访问该网站时,该网站显示有接收到cookie值,结果如图:
故代码是有效用的。
还有个问题,假如程序有可能随时中断,但是再次请求cookie会很麻烦,这种情况下为了不因为反复请求登陆而被封IP,可以考虑把cookie值存在文件中,以便继续运行程序时使用【说是这么说,其实我觉得存起来意义好像不大
这是一个我也不知道原理的操作,官方文档里解释得也不清楚,所以就背代码先
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from urllib import request as r , parse as p from http import cookiejar as co header = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' } cookie = co.MozillaCookieJar('cookie.txt') handler = r.HTTPCookieProcessor(cookie) opener = r.build_opener(handler) req = r.Request('http://httpbin.org/cookies/set?freeform=dafda',headers=header) rep = opener.open(req) cookie.save(ignore_discard=True) print(rep.read()) |
这么写以后,目录下就会出现一个cookie.txt,里面存放着cookie
运行打印结果如下
上面是保存操作,读取操作的代码更加短小精悍
1 2 3 4 5 6 7 |
from urllib import request as r , parse as p from http import cookiejar as co cookie = co.MozillaCookieJar('cookie.txt') cookie.load(ignore_discard=True) # print(cookie) for text in cookie: print(text) |
运行结果如下:
至此
学习过程中也许会遇到很多看不懂的东西,但是无碍于继续学习,以前学c++也会看不懂很多概念,但是用着用着某天会突然释然,所以并不需要太在意这些小部分。