转载

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

前言:随说学校教务提供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 

下面开始详解代码:

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等。

他是这个样子的:

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

点击start开始记录,stop停止。clear清屏。

(2)

好了我们进入网页打开HttpFox 点击start

输入账户 密码 点击登录

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

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

选中第一条我们可以在下面的信息里面看到她的各种信息

有Headers,cookies,query string,POST data,content

我们提交的数据就在POST DATA中

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

我们将其处理成字典模式的数据存在上面的data中并最终

传给request中的data

(3)

下面是一个重要的问题我们要把我们的表单提交给谁呢。这是最重要的(我不会告诉你我一开始用的网页是错误的已致

很久都没有成功,都是泪啊)让我在登录界面右键查看源码 crtl F 查找action

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

你会在action后面跟一个网址。这个action其实就是绑定界面中

那个登录按钮。点击登录后表单就是提交到这个网址的

随意ok复制这个网址。当然你的补全她的主机名字

比如交大的就是

http://202.115.67.50/servlet/UserLoginSQLAction

(4)

大家可以看到我还有一个hea的字典变量

这个是干啥的?他就是提交headers的

在POST的提交项目中有一个就是headers

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

大家可以看到这里面有很多类型,我只是提交了其中的两个

一个是“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来处理数据,这里就不写了。第一次写模拟登录的爬虫,在最后成功的时候内心还是有点小激动的。希望我写的这篇教程对大家都有帮助。

正文到此结束
Loading...