Python项目模拟登录学校正方教务系统抓取课程表。

  1. 本人最近偶然遇到python这门语言,发现这门语言在数据抓取文成非常不错。研究了两天实现了一个小项目,当然中间也参考了许多博客.下面我把我自己的经历给大家分享一下。如果自己学校的教务系统也是这个公司的。可以试试。如何是其它的。也可以根据这个思路去试试。
  2. 项目环境,首先chrome浏览器,python2.7,IDE是eclipse
    3.1. 首先分析模拟登录过程。我们首先打开chrome浏览器,打开学校教务系统登录界面。按F12打开抓包页面,按正常情况下登录。把学校给暴露了。。
    学校界面
    3.2首先分析数据提交地址,红线处就是我们请求数据界面的地址。”http://172.18.254.101/default2.aspx
    这里写图片描述
    3.3.分析提交数据,红线圈的数据就是要提交的数据。第一个我也不知道,后面分别是学号,密码,验证码,还有一个Button1是登录按钮,空值就行。可能会想到第一个数据如何得到,我们猜测可能在登录界面的html页面中。来看
    可见第一个数据在登录界面html中,我们模拟登录时把这个数据提出来。就行了。
    分析第一个数据从何而来
    这里写图片描述
    3.4当然这个教务系统肯定不会这么弱。当然有验证码了。下面来看看验证码的处理。这里我们采用的是得到验证码的图片人工进行处理。主要是自动识别我还不会。不然我一定分享给大家。还是在抓包工具中分析。得到验证码地址 “http://172.18.254.101/CheckCode.aspx
    这里写图片描述
    3.5进入到主界面。记住url=”http://172.18.254.101/xs_main.aspx?xh=201416010428”,后面有用。先不管为什么。
    这里写图片描述
    3.6进入课表界面。得到课表页面的url,红线部分。
    这里写图片描述
    4.不多说。上代码。
#-*-coding:utf-8-*-
import os
import re
from lxml import etree
import requests
import sys
from bs4 import BeautifulSoup
#设置编码
reload(sys)
#初始参数,自己输入的学号,密码。
studentnumber = ""
password = ""
#访问教务系统,前面分析过了,提交数据时要用这个值。先得到__VIEWSTATE的值。
s = requests.session()
url = "http://172.18.254.101/default2.aspx"
response = s.get(url)
selector = etree.HTML(response.content)
__VIEWSTATE = selector.xpath('//*[@id="form1"]/input/@value')[0]
#获取验证码并下载到本地
imgUrl = "http://172.18.254.101/CheckCode.aspx?"
imgresponse = s.get(imgUrl, stream=True)
print s.cookies
image = imgresponse.content
DstDir = os.getcwd()+"\\"
print("保存验证码到:"+DstDir+"code.jpg"+"\n")
try:
    with open(DstDir+"code.jpg" ,"wb") as jpg:
        jpg.write(image)
except IOError:
    print("IO Error\n")
finally:
    jpg.close
#手动输入验证码
code = raw_input("验证码是")
#构建post数据
data = {
"__VIEWSTATE":__VIEWSTATE,
"txtUserName":studentnumber,
"TextBox2":password,
"txtSecretCode":code,
"Button1":"",
}
#提交表头,里面的参数是电脑各浏览器的信息。模拟成是浏览器去访问网页。
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36",
}
#登陆教务系统
response = s.post(url,data=data,headers=headers)
print "成功进入"

#得到登录信息,个人感觉有点多余。
def getInfor(response,xpath):
    content = response.content.decode('gb2312') #网页源码是gb2312要先解码
    selector = etree.HTML(content)
    infor = selector.xpath(xpath)[0]
    return infor
#获取学生基本信息
text = getInfor(response,'//*[@id="xhxm"]/text()')
text = text.replace(" ","")
print text



#获取课表,kburl是课表页面url,为什么有个Referer参数,这个参数代表你是从哪里来的。就是登录后的主界面参数。这个一定要有。
kburl = "http://172.18.254.101/xskbcx.aspx?xh=201416010428&xm=%C0%D7%CB%AE%D3%E3&gnmkdm=N121603"
headers = {
"Referer":"http://172.18.254.101/xs_main.aspx?xh=201416010428",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36",
 }
response = s.get(kburl,headers=headers)
#html代表访问课表页面返回的结果就是课表。下面做的就是解析这个html页面。
html = response.content.decode("gb2312")
selector=etree.HTML(html)
content = selector.xpath('//*[@id="Table1"]/tr/td/text()')
for each in content:
   print each

5.得到结果
这里写图片描述
6.总结:这个小项目我遇到的最大的障碍就是最后的解析页面得到结果。按照正常处理查看元素的xpath 课程的xpath应该是”//[@id=”Table1”]/tbody/tr[3]/td[3]”可就是为空,最后查了好多资料。最后在知乎上得到的结果。是说这个chrome浏览器对表格的处理会多加tbody,去掉就行了。最后就变成了”//[@id=”Table1”]/tr/td/text()”
6.改进地方,验证码的自动处理。还有就是得到页面的url应该是动态生成的。我这里直接根据我得到的地址复制过来了。其实应该是个字符串来动态生成。”http://172.18.254.101/xskbcx.aspx?xh=201416010428&xm=%C0%D7%CB%AE%D3%E3&gnmkdm=N121603“xh后面是学号xm后面是姓名。

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wending-Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值