金龙一卡通登陆爬取数据 免验证码 多线程 学生卡 CAUC

import requests
import re
from requests.auth import HTTPDigestAuth
from bs4 import BeautifulSoup
from struct import *
import random
import os
from PIL import Image
import math
import operator
from functools import reduce
import time
import io
import hashlib
import threading

class Ecard():
    # 程序初始化
    def __init__(self, name, psd):
        self.fee=0
        self.name = name
        self.passwd = psd
        self.s = requests.session()
        self.s.headers = {
            ‘User-Agent‘: ‘Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)‘,
            ‘Host‘: ‘ecard.cauc.edu.cn‘,
        }
        self.s.auth=HTTPDigestAuth("ylli1_15", "[email protected]")
        r = self.s.get("http://ecard.cauc.edu.cn/homeLogin.action", )
    # 得到密码键盘并且生成字典
    def getmy(self):
        r = self.s.get("http://ecard.cauc.edu.cn/getpasswdPhoto.action", )
        im = Image.open(io.BytesIO(r.content))
        imgry = im.convert(‘L‘)
        threshold = 118
        table = []
        for i in range(256):
            if i < threshold:
                table.append(0)
            else:
                table.append(1)
        out = imgry.point(table, ‘1‘)
        l = []
        for n in range(4):
            for m in range(3):
                t = out.crop((10 + 36 * m, 36 + 36 * n, 10 + 23 + 36 * m, 36 + 23 + 36 * n))
                # print n,m
                # t.save(str(n)+str(m)+".png")
                l.append(hashlib.md5(t.tobytes()).hexdigest())
        k = {‘1a5ab29e791b7759bf9f51da27af49fb‘: ‘7‘, ‘60d6fa3d848c9fc74347c3d7c9e86d5c‘: ‘0‘,
             ‘5860f6a18a4355bcbdb3b7f1c7d80787‘: ‘6‘, ‘5a68148875a7001a054bf1ab95c06126‘: ‘9‘,
             ‘e800012a5b5043b554076633bb161347‘: ‘5‘, ‘7e8010bb279a1bdc42174acc32b1d151‘: ‘3‘,
             ‘69e286508b8baed0a291fcf316867414‘: ‘8‘, ‘55ab3b7bb08dedb8f98ce7c72626e3b7‘: ‘1‘,
             ‘2e5103732bd2fa2f86498da3d655e1cc‘: ‘2‘, ‘34272c5cf72623e66dc362c666520cc4‘: ‘4‘,
             ‘d4f9349ba354b26bb4f9aacb4f0ad346‘: ‘C‘, ‘ddf37cebd7e30de1a1b605d895e1f5b6‘: ‘X‘}
        new_l = [‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘C‘, ‘X‘]
        l = map(lambda x: k[x], l)
        # {‘C‘: ‘C‘, ‘X‘: ‘X‘, ‘1‘: ‘2‘, ‘0‘: ‘7‘, ‘3‘: ‘0‘, ‘2‘: ‘6‘, ‘5‘: ‘1‘, ‘4‘: ‘4‘, ‘7‘: ‘8‘, ‘6‘: ‘9‘, ‘9‘: ‘5‘, ‘8‘: ‘3‘}
        keys_map = dict(zip(l, new_l))
        return keys_map
    # 获取验证码,可能是我见过的最弱智的验证码了, 居然根据随机数生成,随机数固定,验证码固定
    def get_check_pic(self):
        self.s.get("http://ecard.cauc.edu.cn/getCheckpic.action?rand=" + str(random.uniform(0, 1)),
                   )
    # 组装数据
    def get_data(self):
        passwdn = ""
        b = self.getmy()
        for i in self.passwd:
            passwdn += str(b[i])
        self.data = {
            "imageField.x": "20",
            "imageField.y": "12",
            "loginType": "2",
            "name": self.name,
            "passwd": str(passwdn),
            "rand": ‘0000‘,
            "userType": "1",
        }

    # 登入主页面
    def login(self):
        self.get_check_pic()
        self.get_data()
        print(self.data)
        url = ‘http://ecard.cauc.edu.cn/loginstudent.action‘
        r = self.s.post(url, data=self.data)
    #获取个人信息
    def get_per_data(self):
        r = self.s.get("http://ecard.cauc.edu.cn/accountcardUser.action", data=self.data, )  # 信息页面
        soup = BeautifulSoup(‘‘.join(r.text))
        i = soup.find_all("td", attrs={"class", "neiwen"})
        account = soup.find_all("div", attrs={"align": "left"})
        self.account = account[1].string
        print(self.account)
        print(i[46].string)
    #获取当日流水
    def get_tday_data(self):
        self.data = {
            "account": self.account,
            "inputObject": "all",
            "Submit": "+%C8%B7+%B6%A8+",
        }
        # session.get("http://ecard.cauc.edu.cn/accounttodayTrjn.action",auth=HTTPDigestAuth("ylli1_15","[email protected]"))
        r = self.s.post("http://ecard.cauc.edu.cn/accounttodatTrjnObject.action", data=self.data,)  # 当日流水
        print(r.text)
    #获取间隔时间内的流水情况
    def get_mday_data(self):
        # 获取页面
        r = self.s.post("http://ecard.cauc.edu.cn/accounthisTrjn.action", data=self.data,)
        url=self.get_re_url(r)
        # 提交第一次账号
        r = self.s.post("http://ecard.cauc.edu.cn" + url, data=self.data, )
        url=self.get_re_url(r)
        # 提交日期
        self.data = {
            "inputEndDate": "20170930",
            "inputStartDate": "20170801",
        }
        r = self.s.post("http://ecard.cauc.edu.cn" + url, data=self.data, )
        url=self.get_re_url(r)
        r = self.s.post("http://ecard.cauc.edu.cn/accounthisTrjn.action" + url,)
        soup = BeautifulSoup(‘‘.join(r.text))
        content = soup.find_all("td", attrs={"align:center"})
        r.encoding = "gb2312"
        print(r.text)
        #计算出总页数
        exp = re.compile("&nbsp;&nbsp;.(\d{1,2}).*&nbsp.*\d")
        PageCount = int(exp.findall(r.text)[0])
        return PageCount
    def get_single_page(self,i):
        print(‘开始了‘,i)
        self.data = {
            "pageNum": i
        }
        r = self.s.post("http://ecard.cauc.edu.cn/accountconsubBrows.action", data=self.data,)
        if(not re.findall(‘table‘,r.text)):self.get_single_page(i)
        with open(‘page‘+str(i)+‘.txt‘,‘w‘) as f:
            f.write(r.text)
        soup = BeautifulSoup(‘‘.join(r.text))
        content = soup.find_all("tr", attrs={"class": re.compile("^listbg")})
        print(time.time())
        lock.acquire()
        for j in content:
            fee_ = float(j.find_all("td")[6].string)
            if (fee_ < 0):
                self.fee += fee_
        lock.release()
    #获取跳转网址
    def get_re_url(self,r):
        # 操作正在进行获取查询url
        soup = BeautifulSoup(‘‘.join(r.text))
        con = soup.find_all("form")[0]
        exp = re.compile(‘action="(.*)"\sid‘)
        url = exp.findall(str(con))[0]
        return url
    #挂失
    def card_lock(self):
        # 挂失
        self.data = {
            "account": self.account,
        }
        r = session.post("http://ecard.cauc.edu.cn/accountDoLoss.action", data=self.data, )
        r.encoding = "gb2312"
        r = session.post("http://ecard.cauc.edu.cn/accountReportingloss.action", data=self.data,)

        r.encoding = "gb2312"
if __name__ == ‘__main__‘:
    e = Ecard("", "")
    e.login()
    e.get_per_data()
    e.get_tday_data()
    count=e.get_mday_data()
    lock=threading.Lock()
    threads=[]
    for i in range(1,count+1):
        t=threading.Thread(target=e.get_single_page,args=(i,))
        t.start()
时间: 2024-10-27 18:38:09

金龙一卡通登陆爬取数据 免验证码 多线程 学生卡 CAUC的相关文章

使用Post方法模拟登陆爬取网页(转)

使用Post方法模拟登陆爬取网页 最近弄爬虫,遇到的一个问题就是如何使用post方法模拟登陆爬取网页.下面是极简版的代码: import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; impo

php curl模拟登陆抓取数据

最近由于项目的需要,需要做数据抓取,也就是用的curl相关的函数库,在这之前还真心没有接触过这么高大上的东西,然后从刚开始到今天才研究curl算是第四天了,写这篇博客记录一下这几天的一个过程,在使用curl模拟登陆抓取数据过程中需要注意的一些事项,以及介绍一款支持跨平台(windows.linux.mac)的抓包软件 charles(这个软件是收费的,但是你不花钱也可以使用) ,想要尽快上手,必须要去熟悉两个东西:http协议.curl的相关参数选项的作用 一.介绍curl 这是curl的维基百

基于selenium实现自动化爬取数据

基于selenium实现自动化爬取数据 如果想具体查看selenium自动化模块的更多功能请看我的博客测试分类中有介绍 selenium 概念:基于浏览器自动化的模块 自动化:可以通过代码指定一系列的行为动作,然后将其作用到浏览器中. pip install selenium selenium和爬虫之间的关联 1.便捷的捕获到任意形式动态加载的数据(可见即可得) 2.实现模拟登录 谷歌驱动下载:http://chromedriver.storage.googleapis.com/index.ht

Java模拟新浪微博登陆抓取数据

前言:  兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先:  要想登陆新浪微博需要预登陆,即是将账号base64加密,密码rsa加密以及请求http://login.sina.com.cn/sso/prelogin.php链接获取一些登陆需要参数,返回的接送字符串如: {"retcode":0,"servertime":1487292003,&quo

【个人】爬虫实践,利用xpath方式爬取数据之爬取虾米音乐排行榜

实验网站:虾米音乐排行榜 网站地址:http://www.xiami.com/chart 难度系数:★☆☆☆☆ 依赖库:request.lxml的etree (安装lxml:pip install lxml) IDEA开发工具:PyCharm_2017.3 Python版本:Python3 期望结果:爬取出排行版歌名以及对应歌手 运行效果图: 音乐排行榜: 爬取数据结果图: 像这种简单的爬取就没必要使用Scrapy框架进行处理,是在有点大材小用,不过如果你刚开始学Scrapy的话,拿这些简单的练

借助Chrome和插件爬取数据

工具 Chrome浏览器 TamperMonkey ReRes Chrome浏览器 chrome浏览器是目前最受欢迎的浏览器,没有之一,它兼容大部分的w3c标准和ecma标准,对于前端工程师在开发过程中提供了devtools和插件等工具,非常方便使用.在爬取数据的过程中,最常用的应该是开发工具中的Element.Source和Network功能,分别查看DOM结构,源码和网络请求.同时,有很多基于Chrome浏览器的插件又给我们赋予了浏览器级别的能力,来处理数据. TamperMonkey Ta

web scraper——简单的爬取数据【二】

web scraper——安装[一] 在上文中我们已经安装好了web scraper现在我们来进行简单的爬取,就来爬取百度的实时热点吧. http://top.baidu.com/buzz?b=1&fr=20811 文本太长,大部分是图片,所以上下操作视频吧,视频爬取的是昵称不是百度热点数据 链接:https://pan.baidu.com/s/1W-8kGDznZZjoQIk1e6ikfQ提取码:3dj7 爬取步骤 创建站点 打开百度热点,ctrl+shit+i进入检测工具,打开web scr

使用HttpClient+Json解析器爬取数据并存入数据库

一.题目要求 说明:这里我只展示爬取数据的代码,将可视化结果与统计数据结合,实时显示当前最新数据只需将这篇博客代码和我那篇使用Echarts可视化数据库数据结合即可 二.思路 同学思路:我的大部分同学思路是使用HttpClient+Jsoup获取并解析目标页面的数据,然后调用Dao层中的方法将数据筛选并存入数据库中 我的思路:我直接使用了一个网上的一个最新疫情数据Json的目标网页,然后使用HttpClient获取该Json格式数据,然后使用Json解析器将 数据分离,然后调用Dao层中的方法将

python爬取数据被限制?一招教你伪造反爬技术!

1.Headers限制 这应该是最常见的,最基本的反爬虫手段,主要是初步判断你是否是真实的浏览器在操作. 这个一般很好解决,把浏览器中的Headers信息复制上去就OK了. 值得注意的是,很多网站只需要userAgent信息就可以通过,但是有的网站还需要验证一些其他的信息,比如知乎,有一些页面还需要 authorization 的信息.所以需要加哪些Headers,还需要尝试,可能还需要Referer.Accept-encoding等信息. 2.IP限制 限制IP也是很多网站反爬虫的初衷,有些人