Python爬虫技术(一)--模拟登录

最近对网络爬虫比较感兴趣,正巧遇上学习Python阶段,因而准备用这把加农炮来实现个人网络爬虫学习之路。本次学习就由我所在学校的教务系统做为实验对象,哇咔咔,尽情的血虐教务系统吧!(不过好像暴露个人身份了,不要紧,技术为尊)。html

在进行咱们的爬虫实验前,咱们先要了解咱们浏览器是如何工做的。关于HTTP等协议的工做流程我就不推荐各类繁杂的书籍博客了,古人说的好,纸上得来终觉浅,绝知此事要躬行。咱们能够对浏览器进行抓包观察流程嘛!来,翠花,上酸菜!
此次咱们要用的是火狐浏览器以及firebug插件,没有插件的能够在火狐应用商店下载。一切准备就绪,就能够开干了。首先,咱们在浏览器输入登录页面地址,按F12键打开firebug。(看看咱们学校的拉面女神仍是颇有味道的......)
接下来咱们添上用户名和密码,并观察HTML文件,观察表单如何提交。这时有一个小技巧,咱们能够Ctrl+F键查找post关键字定位到表单代码:

咱们能够看到除了学号和密码以外,还有五项隐藏表单项。这里我能够说明,除了lt是一个随机字符串外,其余几个均为定值。咱们先登录一下看看有什么变化。

咱们能够看到post信息一共有8项,这八项咱们以前都在HTML文件中看到过了。再继续看一看头信息中都有什么内容呢。

这个时候咱们就能够封装数据包来模拟登录了。模拟登录最主要的是什么呢?就是咱们用代码来模拟浏览器的动做。首先咱们去定义一个头信息。头信息内容就按照咱们浏览器中获得的封装。这里有一个很重要的项 Referer,是反爬虫技术所设立的。该项为了证实你是从正确网页登录,而不是随便从哪旮旯跳过来,还有User-Agent项也很重要,代表了咱们的身份是一个浏览器,而不是其余玩意儿。其他的估计能够精简,有兴趣的能够试一下。
#构造头部信息
    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')
好了,本次实验到此结束,欢迎一块儿学习更多知识!
相关文章
相关标签/搜索