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


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

    在进行我们的爬虫实验前,我们先要了解我们浏览器是如何工作的。关于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')
    好了,本次实验到此结束,欢迎一起学习更多知识!
  • 相关阅读:
    自定义TextInput中displayAsPassword的字符
    C#序列化与反序列化代码记录
    解决Discuz!NT"Code: 100, Message: 指定..."问题
    如何在asp.net项目开发的验证码图片和打印中区别0和O(零和字母O)
    "淘宝开放平台"可以成为程序员的摇钱树吗?
    Discuz!NT与asp.net整合集成实例教程
    最震撼的大片《2012》世界末日 电影 高画质 超DVD版清晰效果 在线视频播
    划时代的感人大片!《机器人总动员》(WALL.E) 在线播放
    从数据库某表转换并导入数据到另一表
    界面原型设计工具选择报告
  • 原文地址:https://www.cnblogs.com/Toring/p/6628275.html
Copyright © 2020-2023  润新知