模拟网站登录,操作等(模拟学生管理系统)
学生党,苦逼的要做勤工俭学,每天都需要在学校的学生管理系统提交,苦逼的程序员表示不愿意每天都自己去点击,果断写个脚本搞定之~
抓取网站,模拟登录等可以参考链接:http://www.crifan.com/files/doc/docbook/web_scrape_emulate_login/release/html/web_scrape_emulate_login.html
首先分析管理系统,抓包,分析
首先抓取登录
可以看到服务器使用session_id去认证的,这里就需要post用户名密码,然后设置本地cookie就可以了
提交带cookie数据包可参考链接:http://hi.baidu.com/zhuangzebo/item/da8ab9c13cea204aa8ba9457
Session学习可参考:
http://blogread.cn/it/article/4319
这里提交的data是字典形式的,需要注意编码(就是因为这个编码问题,搞了一天才OK)
接着抓取提交报告的地方
从这里可以看出,提交的时候需要带上我们上次提交的cookie
这里提交的data是一个包含字典的列表,具体提交的时候需要注意格式,具体内容在程序中体现
源码:(已经替换敏感字符)
1 #filename:post_name_list1.py 2 #-*-coding:UTF-8-*- 3 4 import urllib,urllib2,httplib,cookielib,sys,time 5 6 HttpClient1=None 7 HttpClient2=None 8 cj='' 9 10 #----------获取当前文件系统的编码--------- 11 type=sys.getfilesystemencoding() 12 data1={ 13 "LoginName" : "00000", 14 "Password" : "313212313132132132", 15 "UniversityCode" : "123131", 16 "LoginWay" : "Number" 17 } 18 19 #for key in data1: 20 # print "%s,%s"%(key,data1[key]) 21 22 #-------设置urllib2的Http功能对象--------- 23 cj=cookielib.CookieJar() 24 opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 25 urllib2.install_opener(opener) 26 27 params1 = urllib.urlencode({"data":"%s"%(data1)}) 28 headers = {"Content-type": "application/x-www-form-urlencoded", 29 "Accept": "application/json, text/javascript, */*; q=0.01", 30 "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0", 31 "Referer":" http://localhost/index.html", 32 "Connection":"keep-alive" 33 } 34 35 #----------这里是提交post数据包的两种方式,一个可以带cookie------- 36 37 #httpClient = httplib.HTTPConnection("localhost", 80) 38 #httpClient.request("POST", "/Rbac/Login", params1, headers) 39 40 HttpClient1=urllib2.Request("http://localhost/Rbac/Login",params1,headers=headers) 41 response1=urllib2.urlopen(HttpClient1) 42 #response = httpClient.getresponse() 43 #print response.status 44 #print response.reason 45 #print response1.read() 46 #print response.getheaders() #获取头信息 47 ''' 48 if response.getheader('Set-Cookie')!="": 49 cj=response.getheader('Set-Cookie').split(';')[0] 50 headers['Cookie']=cj 51 print response.getheader('Date').split(';') 52 print cj 53 else: 54 print "get no cookie" 55 ''' 56 57 print "当前cookie:" 58 for cookie in cj: 59 print cookie 60 61 ####列表中Note为中文的时候会出错,主要是因为下面urlencode函数%s的原因,暂时没找到办法修改 62 ####但是当data2为字典时就可以,那个不需要%s输出 63 data2=[ 64 {"Chief":{"Id":"000000000"},"Student":{"Id":"111111111"},"State":"0","Note":""}, 65 {"Chief":{"Id":"000000000"},"Student":{"Id":"222222222"},"State":"1","Note":"实习"}, 66 ] 67 #这里date只是随便写个例子 68 #for x in data2: 69 # print x 70 date=time.strftime("%Y-%m-%d",time.localtime(time.time())) 71 print "提交日期:%s"%date 72 params2 = urllib.urlencode({"Data":data2,"Date":"%s"%date,"GenderCode":"0","ClassId":""}) 73 74 #httpClient = httplib.HTTPConnection("localhost", 80,timeout=30) 75 #httpClient.request("POST", "/Report/SubmitReport?uid=0000000&rid=312312312312321", params2, headers) 76 #response = httpClient.getresponse() 77 78 HttpClient2=urllib2.Request("http://localhost/Report/SubmitReport?uid=000000000&rid=1132132123132132",params2,headers=headers) 79 response2=urllib2.urlopen(HttpClient2) 80 81 #--------以当前系统的编码方式输出----------- 82 print "提交结果:" 83 print response2.read().decode('UTF-8').encode(type) 84 85 #----------关闭连接------------ 86 if (response1 or response2): 87 response1.close() 88 response2.close()
总结:
- 学到了两种post提交数据包的方式
- 分析cookie和session的认证方式,和提交方式
- 更加深入的理解了列表,字典
- 认识到了文件编码和字符串编码的重要性
- 接着就是学会了坚持,这个小程序我写了3天,也分析了好久,确实坚持下来能学到很多东西。