BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #1725同步于 2014/7/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

[心得] 爬北邮研究生个人成绩

zq602316498
2014/7/20镜像同步36 回复
也来一个。。。 #!/usr/bin/env python #coding=utf-8 import urllib2 import urllib import re import pytesser import StringIO import Image import cookielib import chardet import time class ScoreCrawl(object): def __init__(self , username = "******" ,password='******'): self.username = username self.password = password self.loginUrl ='http://yjxt.bupt.edu.cn/UserLogin.aspx?exit=1' self.imageUrl ='http://yjxt.bupt.edu.cn/Public/ValidateCode.aspx?image=1052561647' self.scoreUrl ='http://yjxt.bupt.edu.cn/Gstudent/Course/StudentScoreQuery.aspx?EID=l0RCAjrC!60Alnrcjky12Ad6vU4OJDrqYylAGKDjRFO3OCFxhesOvg==&UID='+username self.cookieJar = cookielib.CookieJar() httpHandler = urllib2.HTTPHandler(debuglevel=1) httpsHandler = urllib2.HTTPSHandler(debuglevel=1) self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar),httpHandler, httpsHandler) self.scores=[] def getImageCodeAndCookie(self): try: im = self.opener.open(self.imageUrl).read() #获取验证码和cookies值 img_buffer = StringIO.StringIO(im) img = Image.open(img_buffer) textcode = pytesser.image_to_string(img) print 'Cookies:' for item in self.cookieJar: if item.name =='ASP.NET_SessionId': self.sessionId = item.value print ' Name = '+item.name print ' Value = '+item.value print 'ImageCode=',textcode return textcode except Exception as e: print 'Failed to get imagecode!', e return '' def login(self): postdata ={ 'UserName':self.username, 'PassWord':self.password, 'drpLoginType':1, 'ScriptManager1':'UpdatePanel2|btLogin', '__EVENTTARGET':'btLogin', '__VIEWSTATE':'''/wEPDwULLTE3MzIzNjYwNjMPZBYCAgMPZBYGAg0PZBYCZg9kFgICAQ8PFgIeCEltYWdlVXJsBSp+L1B1YmxpYy9WYWxpZGF0ZUNvZGUuYXNweD9pbWFnZT0xOTg4NjIyMjlkZAIRD2QWAmYPZBYCAgEPEGRkFgFmZAIVD2QWAmYPZBYCAgEPDxYCHgtOYXZpZ2F0ZVVybAUtfi9QdWJsaWMvRW1haWxHZXRQYXNzd2QuYXNweD9FSUQ9VHVyOHZadXVYa3M9ZGQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFDVZhbGlkYXRlSW1hZ2U=''', '__EVENTVALIDATION':'/wEdAApk+MhPeRcW7LbXAbrLM7jrR1LBKX1P1xh290RQyTesRQa+ROBMEf7egV772v+RsRJUvPovksJgUuQnp+WD/+4LQKymBEaZgVw9rfDiAaM1opWKhJheoUmouOqQCzlwTSNWlQTw3DcvmMLY3PAqFoA+uFSTy5ozCEG4XBxL/Ykep0cgC/Irwlr9d8VObb8MnYO0GRqRfbdgDIW2dtIsr6rb', '__ASYNCPOST':'true' } code = self.getImageCodeAndCookie() postdata['ValidateCode']=code[:4] print 'postdata:',postdata postdata=urllib.urlencode(postdata) # POST的数据 myRequest = urllib2.Request(url = self.loginUrl,data = postdata) myRequest.add_header('Accept','*/*') # myRequest.add_header('Content-Length','792') myRequest.add_header('Accept-Encoding','gzip,deflate,sdch') myRequest.add_header('Accept-Language','zh-CN,zh;q=0.8') myRequest.add_header('Cache-Control','no-cache') myRequest.add_header('Connection','keep-alive') myRequest.add_header('Content-Type','application/x-www-form-urlencoded; charset=UTF-8') # myRequest.add_header('Cookie:LoginType','LoginType=1; ASP.NET_SessionId='+ self.sessionId) myRequest.add_header('Host','yjxt.bupt.edu.cn') myRequest.add_header('Origin','http://yjxt.bupt.edu.cn') myRequest.add_header('Referer','http://yjxt.bupt.edu.cn/UserLogin.aspx?exit=1') myRequest.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 UBrowser/1.0.739.0 Safari/537.36') myRequest.add_header('X-MicrosoftAjax','Delta=true') myRequest.add_header('X-Requested-With','XMLHttpRequest') result = self.opener.open(myRequest).read() print result def getScores(self): scorePage = self.opener.open(self.scoreUrl).read() #统一编码格式 charset = chardet.detect(scorePage) charset = charset['encoding'] if charset !='utf-8' and charset !='UTF-8': scorePage = scorePage.decode('gb2312' , 'ignore').encode("utf-8") unicodePage = scorePage.decode('utf-8') pattern = re.compile('<td align="center">(\d*?)</td><td align="center">(.*?)</td><td align="center">(\d*?)</td><td align="center">(\d*?)</td><td align="center">(\d*?)</td><td align="center">(\d*?)</td><td align="center">(\d*?)</td><td align="center">(\d*?)</td><td align="center" nowrap="nowrap">(.*?)</td><td align="center" nowrap="nowrap">(.*?)</td><td align="center">&nbsp;</td>') scores = pattern.findall(unicodePage) for eachScore in scores: score={} score['classNo']=eachScore[0] score['className']=eachScore[1] score['classHours']=eachScore[2] score['credit']=eachScore[3] score['term']=eachScore[4] score['final']=eachScore[5] score['complex']=eachScore[6] score['rank']=eachScore[7] score['family']=eachScore[8] score['attribute']=eachScore[9] self.scores.append(score) def showScores(self): print '*'*200 print '%30s%35s%32s%32s%32s%32s%32s%32s%30s%30s' % ('课程编号','课程名称','学时','学分','学期','期末','综合成绩','班级排名','类别','属性') for e in self.scores: print '%-30s%-35s%-32s%-32s%-32s%-32s%-32s%-32s%-30s%-30s' % (e['classNo'],e['className'],e['classHours'],e['credit'],e['term'],e['final'],e['complex'],e['rank'],e['family'],e['attribute']) def main(): scoreCrawl = ScoreCrawl() scoreCrawl.login() scoreCrawl.getScores() scoreCrawl.showScores() print '------'*20 if __name__ == '__main__': main()
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
melot机器人#1 · 2014/7/20
myRequest = urllib2.Request(url = self.loginUrl,data = postdata) 学长,我问一下,如果在这个请求中,如果data的值不确定的话,可以用类似于通配符之类的来传值吗
Chon机器人#2 · 2014/7/20
通配符? 【 在 melot 的大作中提到: 】 : myRequest = urllib2.Request(url = self.loginUrl,data = postdata) : : 学长,我问一下,如果在这个请求中,如果data的值不确定的话,可以用类似于通配符之类的来传值吗 : ................... 发自「贵邮」
melot机器人#3 · 2014/7/20
额,不要介意,我是小白,可能我的表达不清楚 换种说法: Request URL:http://club.jd.com/productpage/p-1099153-s-0-t-3-p-0.html?callback=jsonp1405818301033&_=1405821832770 在这个URL里,后半部分可不可以写成类似 callback=jsonp*&_=* 这样的写法 【 在 melot 的大作中提到: 】 : myRequest = urllib2.Request(url = self.loginUrl,data = postdata) : 学长,我问一下,如果在这个请求中,如果data的值不确定的话,可以用类似于通配符之类的来传值吗
zq602316498机器人#4 · 2014/7/20
【 在 melot 的大作中提到: 】 : myRequest = urllib2.Request(url = self.loginUrl,data = postdata) : 学长,我问一下,如果在这个请求中,如果data的值不确定的话,可以用类似于通配符之类的来传值吗 值不确定? 这个postdata里面的只有用户名密码是需要自己修改的 其余的_VIEWSTATE只是后台生成的表示用来代替平时需要用hidden隐藏的标签的,其实不用更改
melot机器人#5 · 2014/7/20
这个例子呢 Request URL:http://club.jd.com/productpage/p-1099153-s-0-t-3-p-0.html?callback=jsonp1405818301033&_=1405821832770 在这个URL里,后半部分可不可以写成类似 callback=jsonp*&_=* 这样的写法 【 在 zq602316498 的大作中提到: 】 : 值不确定? : 这个postdata里面的只有用户名密码是需要自己修改的 : 其余的_VIEWSTATE只是后台生成的表示用来代替平时需要用hidden隐藏的标签的,其实不用更改
zq602316498机器人#6 · 2014/7/20
【 在 melot 的大作中提到: 】 : 这个例子呢 : Request URL:http://club.jd.com/productpage/p-1099153-s-0-t-3-p-0.html?callback=jsonp1405818301033&_=1405821832770 : 在这个URL里,后半部分可不可以写成类似 callback=jsonp*&_=* 这样的写法 哦哦 这个就得使用get方式提交了呢 直接和url拼一块就行了
melot机器人#7 · 2014/7/20
我知道是用get方法,但是后面那些数字是不确定的,这个该怎么办 【 在 zq602316498 的大作中提到: 】 : 哦哦 : 这个就得使用get方式提交了呢 : 直接和url拼一块就行了
zq602316498机器人#8 · 2014/7/20
【 在 melot 的大作中提到: 】 : 我知道是用get方法,但是后面那些数字是不确定的,这个该怎么办 如果是服务器动态生成的参数的话,可以用正则表达式,或xpath等提取出来就可以了。 如果是需要自己输入的话,就不用说了吧
melot机器人#9 · 2014/7/20
嗯,是服务器动态生成的,如果用正则表达式的话,?后面是不是可以写成: callback='jsonp\d++'&_='\d++' (莫见怪,我是小白)