最近对网络爬虫比较感兴趣,正巧遇上学习Python阶段,因而准备用这把加农炮来实现个人网络爬虫学习之路。本次学习就由我所在学校的教务系统做为实验对象,哇咔咔,尽情的血虐教务系统吧!(不过好像暴露个人身份了,不要紧,技术为尊)。html
#构造头部信息 head = { 'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Encoding' : 'gzip,deflate', 'Accept-Language' : 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Host' : 'ids.chd.edu.cn', 'Connection' : 'keep-alive', #反爬虫技术,这个说明咱们是从这个网页进入的 'Referer' : 'http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal', 'Upgrade-Insecure-Requests' : '1', #假装浏览器 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0' }接着,咱们来定义一个post,post中有一个lt项,咱们以前看到了,是以前的登陆页面中的一个表单值,这个是个随机值,咱们要想正确填写它,这就须要咱们先获得这个值,咱们这里先get页面内容,而后查找这个值
posturl = "http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal" #保存cookies,不保存cookie很危险,登录成功后不保存cookie服务器将不知道你已经登陆 #或者说服务器不知道你是你,就致使得到页面失败 s = requests.session() circle = s.get(posturl).text #查找lt字符串 #长大信息门户中有几个隐藏表单项,lt表单项为一个随机字符串 #其他几个均为固定字符串 #因此咱们必须先获得lt字符串 ltString = '<input type="hidden" name="lt" value=".*?"' ltAnswer = re.findall(ltString, circle) lt = ltAnswer[0].replace('<input type="hidden" name="lt" value="','') #这里必须转换为utf8格式,不然为Unicode格式,致使乱码失败 lt = lt.replace('"','').encode("utf-8")
#构造Post数据 postData = {'_eventId' : "submit", 'btn1' : "", 'dllt' : "userNamePasswordLogin", 'execution': "e1s1", 'lt' : lt, 'password' : "*******", 'rmShown' : "1", 'username' : "123456789", }接下来,就到了见证奇迹的时刻。咱们要表明浏览器向服务器发送数据了n(*≧▽≦*)n。一样,代码以下:
loginhtml = s.post(posturl,data=postData,headers=head) url2 = 'http://portal.chd.edu.cn' head2 = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0', 'Referer' : 'http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal'} scorehtml = s.get(url2,headers=head2) print scorehtml.text.decode('gbk','ignore')这时,咱们得到了登录成功后的页面。有的服务器有IP地址限制,须要不断更换IP地址,不过Python也给了咱们解决办法,关于这方面的知识你们有兴趣的能够百度,我就不给出具体信息了~~
# -*- coding: utf-8 -*- import requests import sys import urllib2 import re if __name__ == "__main__": ## 这段代码是用于解决中文报错的问题 reload(sys) sys.setdefaultencoding("utf8") posturl = "http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal" #保存cookies,不保存cookie很危险,登录成功后不保存cookie服务器将不知道你已经登陆 #或者说服务器不知道你是你,就致使得到页面失败 s = requests.session() circle = s.get(posturl).text #查找lt字符串 #长大信息门户中有几个隐藏表单项,lt表单项为一个随机字符串 #其他几个均为固定字符串 #因此咱们必须先获得lt字符串 ltString = '<input type="hidden" name="lt" value=".*?"' ltAnswer = re.findall(ltString, circle) lt = ltAnswer[0].replace('<input type="hidden" name="lt" value="','') #这里必须转为utf8格式,不然传过去的值为Unicode编码,致使乱码失败 lt = lt.replace('"','').encode("utf-8") #构造头部信息 head = { 'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Encoding' : 'gzip,deflate', 'Accept-Language' : 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Host' : 'ids.chd.edu.cn', 'Connection' : 'keep-alive', #反爬虫技术,这个说明咱们是从这个网页进入的 'Referer' : 'http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal', 'Upgrade-Insecure-Requests' : '1', #假装浏览器 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0' } #构造Post数据 postData = {'_eventId' : "submit", 'btn1' : "", 'dllt' : "userNamePasswordLogin", 'execution': "e1s1", 'lt' : lt, 'password' : "*******", 'rmShown' : "1", 'username' : "123456789", } loginhtml = s.post(posturl,data=postData,headers=head) url2 = 'http://portal.chd.edu.cn' head2 = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0', 'Referer' : 'http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal'} scorehtml = s.get(url2,headers=head2) print scorehtml.text.decode('gbk','ignore')好了,本次实验到此结束,欢迎一块儿学习更多知识!