1.背景:
某ECUST高校的教务处网站现在查成绩需要验证码了。但是家长登陆的窗口还没有使用验证码,用这个漏子来爬去一下教务处的成绩:
2.工具:
Google chorme浏览器
Python 3.6.0
requests 库
PyQuery 库
lxml 库(代码中并未用到,只是因为PyQuery库调用了lxml库,姑且列入进来吧)
3.解决方法:
3.1寻找教务处家长查询的地址
直接利用chorme查看,的到地址为
url0="http://inquiry.ecust.edu.cn/ecustedu/K_StudentQuery/K_PatriarchQueryLogin.aspx"
3.2利用chorme开发者工具查看网页要求(requests)的内容,并构造python字典。
登陆后,在chorme中按F12键进入开发者模式,选中network项,即可查看
红框即为要构造的字典,构造字典D1
3.3寻找成绩储存网址,利用chorme找到储存成绩信息的标签
很容易找到,储存成绩的地址为:
url1="http://inquiry.ecust.edu.cn/ecustedu/K_StudentQuery/K_BigScoreTableDetail.aspx?key=1"
利用chorme开发者模式的Elements选项找到成绩储存的位置,这里有个小技巧,鼠标放在Elements的位置上的时候,对应的网页内容会有阴影,很好用!具体内容看图
3.4编写爬虫,利用PyQuery解析网页
import requests as rq
from pyquery import PyQuery as pq
def main(username,userID):
D1={
'__EVENTTARGET':'',
'__EVENTARGUMENT':'',
'__VIEWSTATE':'/wEPDwUKMTUwODM3MTQ2Nw9kFgICAQ9kFgICCQ8PFgQeBFRleHRlHgdWaXNpYmxlaGRkZGO0jC0dS0YidkgEu6HHtZzJ4QnM',
'TxtStudentId':username,
'TxtSFZH':userID,
'BtnLogin':'登录',
'__EVENTVALIDATION':'/wEWBALtgYX0DwK/ycb4AQLU6rEHAuLjh4YMJ/uMbOy0/fn0UeHoB5DIxlisz08='
}#这里的登陆信息及时上文的到的D1,csdn的代码块这么长的字符串可能不支持,复制的时候注意下
url0="http://inquiry.ecust.edu.cn/ecustedu/K_StudentQuery/K_PatriarchQueryLogin.aspx"
url1="http://inquiry.ecust.edu.cn/ecustedu/K_StudentQuery/K_BigScoreTableDetail.aspx?key=1"
s=rq.session()#新建session会话对象,session常用来保持登陆内容
r1=s.post(url0,data=D1)#给url0,传递D1内的内容。
r2=s.get(url1)#返回爬url1的网页html块
pages=r2.text#抓取爬下来的html页面
doc=pq(pages)#新建一个pq解析对象
k=doc('table').filter("#objDataGrid").find('tr')#找到标签为id="obj.."的table中的名为'tr'的标签的内容,k现在是许多个tr标签,需要用循环处理k
N=[]#新建空列表
for eachitem in k:
N.append(pq(eachitem).text().split())#split 分隔带空格的字符串,N是一个二维List
return N
if __name__ == "__main__":
username=input('请输入学号:')
userid=input('请输入身份证号:')
N=main(username,userid)
for i in N:#纯粹为了打印的好看一点hhh
for j in range(0,7):
print(i[j]+'\t',end='')
print('')#
4.总结
1.session 保持登陆的爬虫
2.chorme开发者工具配合pq解析html网页厉害的不要不要的