前言:随说学校教务提供API读取成绩,但获得权限要申请。正好刚刚学习爬虫就自己来一下。
折腾了两天看了无数的教程。犯下了无数傻瓜的错误(下面会说到。折磨的我不要不要的)
废话不说了先上代码
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
下面开始详解代码:
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来处理数据,这里就不写了。第一次写模拟登录的爬虫,在最后成功的时候内心还是有点小激动的。希望我写的这篇教程对大家都有帮助。