python网络爬虫模拟登陆爬取绩点(使用requests库)

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

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

下面开始详解代码:python

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目前咱们已经得到了足够的信息终于能够向服务器提交数据了cookie

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的初学者没有意识到这一点)jsp

这以后你就能够经过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来处理数据,这里就不写了。第一次写模拟登陆的爬虫,在最后成功的时候心里仍是有点小激动的。但愿我写的这篇教程对你们都有帮助。post

相关文章
相关标签/搜索