Python3实现自动查询成绩(主要使用的包有Tesseract-OCR、PIL、execjs、pytesseract、BeautifulSoup)...

 

前提:本文仅作为技术训练,不可利用技术做非法的事。


 

某考试的成绩查询页面如下:查询成绩需要的数据有准考证号或者身份证、考生姓名、验证码。现在使用python来实现自动查询指定人员的考试成绩(不知道准考证号的前提下)。主要使用的包有Tesseract-OCR、PIL、execjs、pytesseract、BeautifulSoup

查询页面:

 

入围名单:

 包的功能介绍:

  • execjs:由于查询成绩参数加密后发送给服务器,这里使用调用原网站的加密函数加密查询字符串。
  • BeautifulSoup:建立爬取的网页的文档树。
  • PIL:中的Image函数读取下载下来的验证码图片,实例化后传给Tesseract-OCR识别。
  • Tesseract-OCR:读取图片验证码,识别图片中的数字(主要其中有图片的训练集)。
  • pytesseract:tesseract_cmd来初始化Tesseract-OCR,然后使用image_to_data()方法识别图片中的数字,该方法接受Image实例化后的图片对象为参数。

 

第一步:安装环境

 主要介绍Tesseract-OCR安装,其他包可通过pip+包名自行安装。

安装完成后将Tesseract-OCR添加进path环境变量;然后新建环境变量TESSDATA_PREFIX:安装目录\Tesseract-OCR\tessdata。然后重启计算机。

cmd输入tesseract显示如下则安装成功:


 

第二步:登陆网站收集信息

 使用正确的账号信息登陆,收集header、cookies及其他信息(例如本次登陆就使用到加密的js)。

  • 加密js信息:(根据发送的查询字符串是否需要加密来决定是否添加
JSCode = r'''
/*
*(1).加密:
*  第一步:strEncode(data,firstKey,secondKey,thirdKey);
*(2).解密:
*  第一步:strDecode(data,firstKey,secondKey,thirdKey);
*/
/*
* encrypt the string to string made up of hex
* return the encrypted string
*/

中间内容略

/*end*/

'''
  • header相关信息
header = {
        'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Cookie': 'JSESSIONID=E9A7EF615C2A7FC0D99711C8697D158B',
        'Host': '***.***.***.***',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    }
  •  在python中可以使用如下方式调用js中的代码:
#装载
CTX = execjs.compile(JSCode)

#调用
CTX.call('函数名', '实参')

第三步:模拟登陆(考号+姓名+验证码)

为了将准考证号中隐藏的数字找出来,我们需要不断遍历。直到考号姓名对应。

这里的验证码在访问成绩页面时就产生了,所以需要所以使用requests.get(url1, headers=header)来将验证码下载到本地,然后识别出来,接着在模拟查询按钮动作 requests.get(url2, headers=header)

,将所有信息塞入查询字符串进行查询,由于是遍历查询,一旦循环产生的考号与已知的姓名匹配,就会返回结果,查询结束。

  • 模拟登陆,并返回查询结果req2.text
def get_content(number='201902300365', name='张三'):#填入一个正确的默认信息
    number = CTX.call('strEncode', number) #调用js加密数字,以下类同
    name = CTX.call('strEncode', name)
    url1 = 'http://***.***.***.***/2019****/register/image.jsp'
    header = null #
    while True:
        try:
            req1 = requests.get(url1, headers=header)
            img = req1.content
            with open('./yanzhengma.png', 'wb') as f:
                f.write(img)
            im = Image.open(r'D:\PycharmProjects\untitled1\yanzhengma.png')
            pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
            num = pytesseract.image_to_data(im) #识别验证码中的数字
            input_yznumber = num[-4:] #将结果的最后四位数字取出,即验证码

            yznumber = CTX.call('strEncode', input_yznumber)
            url2 = 'http://***.***.***.***/2019****/printInfo.do?activity=cjddy&number=' + number + '&name=' + name + '&yznumber=' + yznumber
            req2 = requests.get(url2, headers=header)
            req2.encoding = 'utf-8'
            break
        except socket.timeout as e:
            print('3:', e)
            time.sleep(random.choice(range(8, 15)))
        except socket.error as e:
            print('4:', e)
            time.sleep(random.choice(range(20, 60)))
        except http.client.BadStatusLine as e:
            print('5:', e)
            time.sleep(random.choice(range(30, 80)))
        except http.client.IncompleteRead as e:
            print('6:', e)
            time.sleep(random.choice(range(5, 15)))
    return req2.text
  • 使用BeautifulSoup遍历文档树:

 遍历文档树后查询指定dom(本例是div)下的内容:

def get_data(xml_data):
    bs = BeautifulSoup(xml_data, "html.parser")
    scores = bs.find_all('div', string=re.compile('2019')) #考号的前几位
    return scores
  • 启动程序,遍历查询
if __name__ == "__main__":
    for kc in range(3000, 4601): #考场号 范围可从0-9999 根据考号规则改变
        for zwh in range(0, 1000): #最大座位号是999
            if len(str(zwh)) == 1:
                number = '20190'+str(kc)+'00'+str(zwh)
            elif len(str(zwh)) == 2:
                number = '20190'+str(kc) + '0'+str(zwh)
            else:
                number = '20190'+str(kc) + str(zwh)
            print("number = ", number)
            zhunkaohao = get_data(get_content(number='20191' + str(zwh)+'173', name='焦作'))
            if zwh % 50 == 0:
                t_zhunkaohao=get_data(get_content(number='201902300365', name='张三')) #每50次返回一个正确结果,来确保查询正确性
                print("***************"+str(t_zuoweihao))
            if zhunkaohao != []:
                print(zhunkaohao)
                break #查询成功 跳出循环

 

由于涉密,这里就不附上源码了。

需要引入以下包:

# coding: utf-8
import socket
from bs4 import BeautifulSoup
import requests, random, time, http
import execjs
import re
import pytesseract
from PIL import Image

 

参考:

基于tesseract-OCR进行中文识别

加密js

转载于:https://www.cnblogs.com/hoaprox/p/11050228.html

### 回答1: tesseract-ocr-3.4.chi.rar是一个中文OCR(Optical Character Recognition)开源软件的压缩包,它是Tesseract OCR引擎的一个版本。Tesseract OCR引擎是一个被广泛应用于文字识别的工具,可以将印刷体文本转换为机器可读的文本形式。 这个版本的tesseract-ocr-3.4.chi.rar主要针对中文文本的识别和处理。通过使用这个软件包,用户可以将扫描的纸质文档、图像或其他形式的文本转换为可编辑的电子文档。这在各种应用中非常有用,比如自动化数据输入、文档分类、OCR字幕等。 该软件包中也包含了一些训练数据和字典,用于提高中文文字识别的准确性和适应性。它还提供了一些API和命令行工具,使得开发人员可以集成这个OCR引擎到自己的应用程序中。 用户需要先解压缩这个rar文件,并按照安装说明进行安装和配置,才能使用这个OCR引擎。安装完成后,用户可以使用提供的命令行工具或者调用API接口进行中文文字识别。用户还可以根据自己的需求进行定制和优化,比如增加字典、改进训练数据等。 总之,tesseract-ocr-3.4.chi.rar是一个非常有用的中文OCR工具,它能够帮助用户快速、准确地将中文文本转换为可编辑的电子文档,为各种应用提供便利和支持。 ### 回答2: tesseract-ocr-3.4.chi.rar是一个可执行程序和数据文件的压缩包。其中的"tesseract-ocr"是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以将图像中的文字转换为可编辑和可搜索的文本。而"3.4"代表了版本号,表明这是该引擎的第3.4版本。"chi"表示该版本是用于中文字符识别的。 在解压包中,可以找到一些必要的文件和文件夹。其中的可执行文件可以在命令行或终端中使用,让用户通过简单的命令来识别图像中的中文字符。数据文件包含了训练好的模型和字典,用于识别各种不同的中文字符。根据具体需要,用户可以根据自己的要求进行自定义配置和修改。 使用tesseract-ocr-3.4.chi.rar之前,首先需要安装和配置tesseract引擎。用户可以根据操作系统的不同,下载相应版本的tesseract引擎,并按照官方指南进行安装和配置。一旦安装完成,并且环境变量已正确配置,就可以使用该引擎进行中文字符识别。 tesseract-ocr-3.4.chi.rar的存在和使用让用户能够更方便地进行中文字符的识别工作,无论是个人还是在开发项目中。通过利用OCR技术,可以提高工作效率、提取文本信息并进行后续的自动化处理。这对于涉及大量的文本数据的场景,如扫描文档、图像处理、文字识别等,具有非常重要的作用。 ### 回答3: tesseract-ocr-3.4.chi.rar是一个中文字符的光学字符识别(OCR)引擎。Tesseract是一个广泛使用OCR引擎,可用于将印刷体字体的图像识别为文本。而tesseract-ocr-3.4.chi.rar则是Tesseract的中文语言数据包,使其能够识别中文字符。 这个数据包包含了训练Tesseract所需的中文字符图像和标签。利用这些数据,Tesseract可以学习中文字符的特征和模式,并能根据输入的中文图像识别出对应的文字。 使用tesseract-ocr-3.4.chi.rar,你可以在自己的应用程序中集成OCR功能,用于识别中文图像中的文字。你可以将图像输入到Tesseract引擎中,并获得相应的文字输出。 这个中文数据包提供了一种简便的方式来识别中文字符,因为它已经在训练过程中使用了大量的中文字符图像样本。这使Tesseract能够准确地识别出中文图像中的文字,从而帮助用户更高效地处理中文文字的识别需求。 总之,tesseract-ocr-3.4.chi.rar是一个用于中文OCR识别的数据包,为Tesseract提供了识别中文字符的能力。它可以帮助用户将中文图像转化为可编辑的文本,具有广泛的应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值