前言:
第一篇,分析青果教务管理系统登陆模块,理清思路
第二篇,使用常规的python常用库 requests来实现模拟登陆
第三篇,使用scrapy来实现模拟登陆
目的在于了解模拟登陆网站的要点和方法,了解http请求的一些知识。
(1)scrapy模拟登陆
依然按照上一篇的思路,我们编写代码即可。这里我就不啰嗦了。就放下spider 的代码
# -*- coding: utf-8 -*-from _mysql import resultimport scrapyimport reimport randomimport timefrom PIL import Imagefrom md5tools import md5_encryptclass AynueduSpider(scrapy.Spider):name = 'aynuedu'allowed_domains = ['jwglxt.']start_urls = ['http://jwglxt./']VIEWSTATE = ''#处理第一次请求,提取登陆需要的额外参数def parse(self, response):#拿到cookieheaders = response.headersnewheaders = dict(headers)#设置referernewheaders['Referer'] = 'http://jwglxt./'yield scrapy.Request(url="http://jwglxt./_data/home_login.aspx",callback=self.parse_loginurl,method='GET',headers=newheaders)def parse_loginurl(self,response):"""访问登陆的网址,拿到额外的参数:param response::return:"""headers = response.headersnewheaders = dict(headers)# 设置referernewheaders['Referer'] = 'http://jwglxt./_data/home_login.aspx'newheaders['Accept']='image/webp,image/apng,image/*,*/*;q=0.8'#使用正则表达式获取数据self.VIEWSTATE = re.search(r'<input type="hidden" name="__VIEWSTATE" value="(.*)"', response.text).group(1)print self.VIEWSTATEurl = "http://jwglxt./sys/ValidateCode.aspx?t=" + str(random.randint(0, 999))yield scrapy.Request(url=url, callback=self.parse_yzmurl,method='GET', headers=newheaders)def parse_yzmurl(self,response):"""获取验证码:param response::return:"""with open("yzm.jpg","wb") as f:f.write(response.body)time.sleep(1)#打开该验证码im = Image.open('yzm.jpg')im.show()yzm = raw_input("please input yzm:")#print yzmprint self.VIEWSTATEusername = str(raw_input("please input username:"))print usernamepasswd = str(raw_input("please input passwd:"))print passwd# username = "xxx"# passwd = "xxx"# 密码加密passwd_jiami = md5_encrypt((username + md5_encrypt(passwd)[0:30].upper() + '10479'))[0:30].upper()# 验证码加密yzm_jiami = md5_encrypt((md5_encrypt(yzm.upper())[0:30].upper() + '10479'))[0:30].upper()url = 'http://jwglxt./_data/home_login.aspx'login_data = {'__VIEWSTATE': self.VIEWSTATE,'pcInfo': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36undefined5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 SN:NULL','typeName': 'ѧ��','dsdsdsdsdxcxdfgfg': passwd_jiami,'fgfggfdgtyuuyyuuckjg': yzm_jiami,'Sel_Type': 'STU','txt_asmcdefsddsd': username,'txt_pewerwedsdfsdff': '','txt_sdertfgsadscxcadsads': '',}login_headers = {'Referer': 'http://jwglxt./_data/home_login.aspx','Origin': 'http://jwglxt.',}# 发送请求参数,并调用指定回调函数处理#yield scrapy.Request(url=url, callback=self.parse_login,method='POST', headers=login_headers,)yield scrapy.FormRequest(url=url,formdata=login_data,headers=login_headers,callback=self.parse_login,method="POST")def parse_login(self,response):""":param response::return:"""url = "http://jwglxt./xsxj/Stu_MyInfo_RPT.aspx"getinfoheaders = {'Referer': 'http://jwglxt./xsxj/Stu_MyInfo.aspx',}yield scrapy.Request(url=url,headers=getinfoheaders,callback=self.show_info)def show_info(self,response):print response.text
几点说明:
这里使用了PIL ,用来打开保存好的验证码。
这里代码并没有出现cookie,这是scrapy 已经做好的,我们只需要改变需要变化的请求头即可。
其中post 请求,使用这样的方式。
scrapy.FormRequest(url=url,formdata=login_data,headers=login_headers,callback=self.parse_login,method="POST")
(2)总结
到这里这个例子基本完成,还有许多改进的地方,比如验证码的处理,我们在第一篇中介绍的三种方式。比如我们可以不加密账号密码的情况下登陆。等等
这个例子并不是来说明怎么登陆青果教务系统的网站,这不是重点。重点是在于青果教务系统的登陆模块,是爬虫经常遇到的登陆情况。
(1)登陆模块需要定制的请求头比如 referer ,Origin ,当然修改 user-agent 才很关键。
(2)常规的验证码,一般登陆都需要。
(3)登陆需要额外的参数,我们就可以使用正则或者xpath 将这些额外参数直接动态获取。
(4)前台对密码和验证码进行了加密处理。其实我们完全也可以直接拿正常加密后的值,直接模拟登陆,但这样就不能多个用户操作。
所以我们拿这个例子,可以作为一个整合的例子。
源码:/gengzi/simulatelogin
码字不易,给个赞吧。