前言

随说学校教务提供API读取成绩,但获得权限要申请。正好刚刚学习爬虫就自己来一下。
折腾了两天看了无数的教程。犯下了无数傻瓜的错误(下面会说到。折磨的我不要不要的)
废话不说了先上代码

'''
想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!
'''
import requests
import sys
reload(sys)   
sys.setdefaultencoding('utf8')
hea = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36',
       'Referer'   : 'http://202.115.67.50/service/login.jsp'}
url = 'http://202.115.67.50/servlet/UserLoginSQLAction'
data ={  
    'url':"../usersys/index.jsp",
    'OperatingSystem':"",
    'Browser':"",
    'user_id':"XXXXXXXX",
    'password':"123456",
    'user_style':"modern",
    'user_type':"student",
    'btn1':""
    }
loginhtml = requests.post(url,data = data,headers = hea)
 
url2 = 'http://202.115.67.50/student/score/MyScorePoint.jsp?QueryScoreType=FromTerm&term_value=71&B3=%E6%89%A7%E8%A1%8C%E6%9F%A5%E8%AF%A2'
head1 = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'} 
scorehtml = requests.get(url2,cookies = loginhtml.cookies,headers=head1)
print loginhtml.text

下面开始详解代码:

1:编码格式问题

import requests
import sys
reload(sys)   
sys.setdefaultencoding('utf8')

这段代码是干什么的。这是一个更改python默认编码方式的方法,python 默认编码方式的方法是ascii编码 所以而我们从网上爬取的格式,以UTF-8为主。所以才用这种将python的默认代码改为
UTF-8.当然在requests库也有一些方法也可以做到,我们下面再说。

二:构造表单

hea = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 
Safari/537.36',
       'Referer'   : 'http://202.115.67.50/service/login.jsp'}
url = 'http://202.115.67.50/servlet/UserLoginSQLAction'
data ={  
    'url':"../usersys/index.jsp",
    'OperatingSystem':"",
    'Browser':"",
    'user_id':"XXXXXXXX",
    'password':"123456",
    'user_style':"modern",
    'user_type':"student",
    'btn1':""
    }
loginhtml = requests.post(url,data = data,headers = hea)

我们登录一个网站就是向这个网站的主机提交一个表单而HTML中提交表单用的是POST方法。request就有这个方法。好了有个方法我们怎么知道要提交什么内容呢?
(1)
这里推荐一款firefox的插件HttpFox:这是一款http协议分析插件,分析页面请求和响应的时间、内容、以及浏览器用到的COOKIE等。他是这个样子的:

点击start开始记录,stop停止。clear清屏。
(2)
好了我们进入网页打开HttpFox 点击start输入账户 密码 点击登录

这就是我们登录后的样子 HttpFox收到了很多数据可以很明显的看到第一条的方法就是POST

选中第一条我们可以在下面的信息里面看到她的各种信息
有Headers,cookies,query string,POST data,content
我们提交的数据就在POST DATA中

我们将其处理成字典模式的数据存在上面的data中并最终
传给request中的data
(3)
下面是一个重要的问题我们要把我们的表单提交给谁呢。这是最重要的(我不会告诉你我一开始用的网页是错误的已致很久都没有成功,都是泪啊)

让我在登录界面右键查看源码 crtl F 查找action

你会在action后面跟一个网址。这个action其实就是绑定界面中那个登录按钮。点击登录后表单就是提交到这个网址的
随意ok复制这个网址。当然你的补全她的主机名字比如交大的就是
http://202.115.67.50/servlet/UserLoginSQLAction
(4)
大家可以看到我还有一个hea的字典变量这个是干啥的?他就是提交headers的在POST的提交项目中有一个就是headers

大家可以看到这里面有很多类型,我只是提交了其中的两个
一个是“User-Agent”这个是用来将你的POST伪装成一个浏览器
主要说说第二个Referer 这个也是困扰了我很久,查阅无数的网页,最终还是在我的一个同学的帮助下才解决了。一开始我没有加这个key-value 因为网上的大部分爬虫都只是提交了“User-Agent”.后来添加了这一项后可以用了。上网搜了一下发现这是一种反爬虫技术。referer是你填写账户和密码的网址。服务器检查这一项看你是不是从那个网页登录过来的。

OK目前我们已经获得了足够的信息终于可以向服务器提交数据了

loginhtml = requests.post(url,data = data,headers = hea)

把刚刚构造好的数据传入函数 然后让我们POST吧。

重中之重:

网上大部分的request教程这句程序后面都跟了.text 或.content
例如:loginhtml = requests.post(url,data = data,headers = hea).text
此时你获得只是一个包含网页内容的字符串,如果此时你调用loginhtml.cookies就会说没有这个方法
(这个地方让我调了快一天。查了无数网,不过到是学会了很多其他东西,最终在看官方API的时候发现他后面怎么没有.text。一试可以,那真是泪流满面啊。唉原谅我这个python的初学者没有意识到这一点)

这之后你就可以通过loginhtml.cookies来获得服务器给你的cookies了
并在这之后通过cookies来获取登录界面的信息了

url2 = 'http://202.115.67.50/student/score/MyScorePoint.jsp?QueryScoreType=FromTerm&term_value=71&B3=%E6%89%A7%E8%A1%8C%E6%9F%A5%E8%AF%A2'
head1 = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 
Safari/537.36'} 
scorehtml = requests.get(url2,cookies = loginhtml.cookies,headers=head1)

登录后的网址一是可以通过看源代码,或是继续用HTTPfox监控。当你点击某个选项的时候就是发送一个GET请求,找到里面的网址加上就好,或者用火狐的查看框架信息也可以。
后记:获得网页之后就可以通过正则表达式或者Xpath来处理数据,这里就不写了。第一次写模拟登录的爬虫,在最后成功的时候内心还是有点小激动的。希望我写的这篇教程对大家都有帮助。


本文转载:CSDN博客