网页抓取 加密html(快捷模拟登录抓取目标网页做出准备(图).7 )
优采云 发布时间: 2022-01-20 17:01网页抓取 加密html(快捷模拟登录抓取目标网页做出准备(图).7
)
Cookie,是指存储在用户本地终端上用于识别用户身份和进行会话跟踪的一些数据(通常是加密的)。
比如有些网站需要登录才能得到你想要的信息。如果不登录,则只能使用旅游模式。然后我们可以使用 Urllib2 库来保存我们之前登录过的 cookie。加载cookie得到我们想要的页面,然后爬取。了解cookies主要是为我们快速模拟登录和抓取目标网页做准备。
我在上一篇文章中使用了 urlopen() 函数来打开网页进行抓取。这只是一个简单的 Python 网页打开器,它的参数只有 urlopen(url, data, timeout),这三个参数不足以让我们获取登陆页面的 cookie。这时候我们将使用另一个 Opener - CookieJar。
cookielib 也是 Python 中爬虫的一个重要模块。可以结合 urllib2 来抓取想要的内容。该模块的CookieJar类的对象可以捕获cookie并在后续的连接请求中重新发送,从而实现我们需要的模拟登录功能。
这里特别说明,cookielib是py2.7自带的模块,不需要重新安装。如果要查看自己的模块,可以查看Python目录下的Lib文件夹,里面收录了所有已安装的。模块。一开始没有想到,在pycharm中没有找到cookielib,使用快速安装后报错:Could't find index page for 'Cookielib' (可能是拼写错误?)
在那之后,我记得它是否带有它。没想到跑到lib文件夹里面才发现,折腾了半个小时各种折腾~~
我们来介绍一下这个模块,这个模块的主要对象是CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
它们的关系: CookieJar -- 派生 --> FileCookieJar -- 派生 --> MozillaCookieJar 和 LWPCookieJar 的主要用法,下面我们也会讲到。 urllib2.urlopen() 函数不支持身份验证、cookie 或其他高级 HTTP 函数。要支持这些功能,必须使用build_opener()函数(可以用来让python程序模拟浏览器访问,你懂的~)函数来创建自定义的Opener对象。
1、首先我们获取网站的cookies
例子:
#coding=utf-8 import cookielib import urllib2 mycookie = cookielib.CookieJar() #声明一个CookieJar的类对象保存cookie(注意CookieJar的大小写问题) handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2库中的HTTPCookieProcessor来声明一个处理cookie的处理器 opener = urllib2.build_opener(handler) #利用handler来构造opener,opener的用法和urlopen()类似 response = opener.open("http://www.baidu.com") #opener返回的一个应答对象response for item in my.cookie: print"name="+item.name print"value="+item.value
结果:
name=BAIDUIDvalue=73BD718962A6EA0DAD4CB9578A08FDD0:FG=1name=BIDUPSIDvalue=73BD718962A6EA0DAD4CB9578A08FDD0name=H_PS_PSSIDvalue=1450_19035_21122_17001_21454_21409_21394_21377_21526_21189_21398name=PSTMvalue=1478834132name=BDSVRTMvalue=0name=BD_HOMEvalue=0
这为我们提供了最简单的 cookie。
2、保存 cookie 到文件
上面我们得到了cookie,下面我们学习如何保存cookie。这里我们使用它的子类 MozillaCookieJar 来保存 cookie
例子:
这个例子可以通过简单变形上面的例子得到,使用MozillaCookiJar,CookieJar的一个子类,为什么?我们试试把MozillaCookiJar换成CookieJar,可以看懂下图:
CookieJar不保存save属性~
在
save()方法:ignore_discard表示即使cookie会被丢弃也要保存,ignore_expires表示如果cookie已经存在于文件中,覆盖原文件并写入,这里,我们将这两个都设置为True。运行后cookies会保存到cookie.txt文件中,我们查看一下内容:
这样我们成功保存了我们想要的cookie
3、从文件中获取cookies并访问
#coding=utf-8import urllib2import cookielibimport urllib #第一步先给出账户密码网址准备模拟登录postdata = urllib.urlencode({ 'stuid': '1605122162', 'pwd': 'xxxxxxxxx'#密码这里就不泄漏啦,嘿嘿嘿})loginUrl = 'http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp'# 登录教务系统的URL,成绩查询网址 # 第二步模拟登陆并保存登录的cookiefilename = 'cookie.txt' #创建文本保存cookiemycookie = cookielib.MozillaCookieJar(filename) # 声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(mycookie)) #定义这个opener,对象是cookieresult = opener.open(loginUrl, postdata)mycookie.save(ignore_discard=True, ignore_expires=True)# 保存cookie到cookie.txt中 # 第三步利用cookie请求访问另一个网址,教务系统总址gradeUrl = 'http://ids.xidian.edu.cn/authserver/login?service' #只要是帐号密码一样的网址就可以, 请求访问成绩查询网址result = opener.open(gradeUrl)print result.read()