python爬虫模拟登录(二)----重庆理工大学数字化校园

模拟登录重庆理工大学数字化校园

同理登录豆瓣,重理工数字化校园登录过程也较简单,所以不多解释

前期工作同样是在浏览器登录后通过工具获取提交的那些数据表单,然后在源代码中找到这些数据项,并通过正则表达式将他们提取出来,在写程序过程同样遇到了几个问题:
1、cookie的获取失败,因为自己获取cookie时的逻辑或者是对库方法的不熟悉导致的
2、ip代理的实效导致url error无法访问到地址

将问题解决掉啦,这就很舒服,下面直接上源码

# login_i_cqut.py
# coding: utf-8
# 登录重庆理工大学数字化校园

import urlparse
import urllib
import urllib2
import cookielib
import re
import webbrowser

class CQUT:
    def __init__(self, username, password):
        self.loginUrl = 'http://i.cqut.edu.cn/zfca/login'
        self.username = username
        self.password = password
        self.cookies = cookielib.CookieJar()
        self.headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Host': 'i.cqut.edu.cn',
            'Referer': 'http://i.cqut.edu.cn/zfca/login',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0',
            'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': '221'
        }
        self.postData = {
            'useValidateCode': '',
            'isremenberme': '',
            'ip': '',
            'username': self.username,
            'password': self.password,
            'losetime': '30',
            'lt': '',
            '_eventId': 'submit',
            'submit1': ''
            # j_captcha_response 验证码
        }

    # 登录主程序
    def login(self):
        self.EnableCookieAndProxy()  # 使用代理和cookie
        useValidateCode, isremenberme, ip, yzmUrl, lt = self.getData()    # 获取表单提交数据

        self.postData['useValidateCode'] = useValidateCode
        self.postData['isremenberme'] = isremenberme
        self.postData['ip'] = ip
        self.postData['lt'] = lt

        # 如果需要输入验证码
        if yzmUrl:
            webbrowser.open_new_tab(yzmUrl)   # 打开验证码图片
            # 手动输入验证码
            yzm = raw_input("请输入浏览器显示的验证码: ")
            self.postData['j_captcha_response'] = yzm
        data = urllib.urlencode(self.postData)
        print data
        result = urllib2.urlopen(self.loginUrl, data)
        print result.read().decode('gbk')

    # 使用代理和添加cookie
    def EnableCookieAndProxy(self):
        # 添加cookie
        cookieSupport = urllib2.HTTPCookieProcessor(self.cookies)
        # 添加代理
        proxySupport = urllib2.ProxyHandler({'http': '124.88.67.54:80'})  # 使用代理
        opener = urllib2.build_opener(proxySupport, cookieSupport, urllib2.HTTPHandler)
        urllib2.install_opener(opener)  # 构建对应的opener

    def getData(self):
        print self.loginUrl
        page = urllib2.urlopen(self.loginUrl).read().decode('gbk')
        print "first cookie:"
        for i in self.cookies:
            print i.name, '=', i.value

        print page
        pattern = re.compile('<input.*?id="useValidateCode".*?value="(.*?)".*?<input.*?id="isremenberme".*?value="(.*?)".*?<input.*?id="ip".*?value="(.*?)".*?<div.*?id="yzm" style="(.*?)">.*?<input.*?id="j_captcha_response".*?<img.*?src="(.*?)".*?>.*?<input type="hidden" name="lt" value="(.*?)"', re.S)
        #                                                   1 useValidateCode                                   2 isremenberme                       3 ip                         4 判断有误验证码                                               5 验证码链接                                       6 lt

        res = re.search(pattern, page)

        # res.group(4) 判断是否有验证码 res.group(5) 验证码链接, res.group(6) lt
        if "display" in res.group(4):    # 如果没有验证码
            yzmUrl = None
        # 验证码链接补充完整
        else:
            yzmUrl = urlparse.urljoin(self.loginUrl, res.group(5))
        print yzmUrl, "lt:", res.group(6).strip()
        return res.group(1).strip(), res.group(2).strip(), res.group(3).strip(), yzmUrl, res.group(6).strip()

#测试代码
cqut = CQUT("这是学号", "这是密码")
cqut.login()

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值