使用本文爬取成绩大致有几个步骤:1、提取表格(或其他格式文件——含有姓名,身份证等信息)中的数据,为进行准考证爬取做准备。2、下载准考证文件并提取出准考证和姓名信息。3、根据得到信息进行数据分析和存储。

所有需要的工具库:

import urllib
import requests
import xlrd
import json
import re
import time
import os
import operatorfrom aip import AipOcr
from selenium import webdriver
from PIL import Image

  

  

准考证下载网址:http://cet-bm.neea.edu.cn/Home/QuickPrintTestTicket

使用查分数网址:http://cet.neea.edu.cn/cet/

具体实现:

一、提取姓名身份证信息并获取下载url关键信息

# 创建session访问对象
session = requests.session()
session.headers = {'打开对应网站http://cet-bm.neea.edu.cn/Home/QuickPrintTestTicket,复制cookies,必需!!!'}# 得到身份证和姓名信息# 返回一个包含名字和id的列表
def get_name_id():xls_data = xlrd.open_workbook(r'你的表格.xls')tables = xls_data.sheets()[0]for i in range('范围'):rows = tables.row_values(i)id = rows[7]# 对中文进行了url编码处理name = urllib.parse.quote(rows[5])yield [name, id]list_info = get_name_id()# 经过观察发现下载链接中只有一个sid参数有变化,所以我们下面筛选出sid参数并保存# 需要手动到网站上点一个验证码, 时间大概在一分钟
# 到时后可能会有变动,请根据具体情况修改
yzm = '验证码'# 存储最终数据
data = []for i in list_info:# 参数provinceCode是省份编码,请根据具体情况及时修改# 另参数这里我没有用字典形式传入,所以中文转化成了url形式的res = session.post('http://cet-bm.neea.edu.cn/Home/ToQuickPrintTestTicket',data='Name={}&verificationCode={}&provinceCode=34&IDNumber={}&IDTypeCode=1'.format(i[0], yzm, i[1]))# 处理数据 以便存储txt = res.content.decode('utf8')txt = txt.replace('\\', '')sid_one = re.findall("SID\":\"(.*?)\",", txt)[0]name_ = urllib.parse.unquote(i[0])data.append({'name': name_, 'sid': sid_one})with open("sid.json", 'w') as f:f.write(json.dumps(data))

  至此,我们得到了下载地址

二、下载文件并读取

with open('sid.json', 'r') as f:sid = json.loads(f.read())# 下载地址列表
urls = []
for i in sid:url = 'http://cet-bm.neea.edu.cn/Home/DownTestTicket?SID={}'.format(i['sid'])urls.append([url, i['name']])for i in urls:response = requests.get(i[0])# 这里注意保存格式一定要写对!!!# 不然是很头疼的一件事with open(r'pdf\{}.zip'.format(i[1]), 'wb') as f:f.write(response.content)print('success')

  这一步我们下载了准考证文件,注意最好创建一个新文件夹保存下载的文件,另外,前一篇写到的批量解压文件又用到了,自己修改一下即可

  下面一段代码我们分析准考证号信息并另存为json文件

# 打开pdf文件并读取,网上很容易找到,这里也只做采用
def open_one_pdf(url):# 定义变量接收我们所需的数据admission_ticket_number = []name = []#  文件对象pd_file = open(url, 'rb')#  pdf文件解析对象parser = PDFParser(pd_file)# print(parser)#  pdf文档对象document = PDFDocument()parser.set_document(document)document.set_parser(parser)#  初始化文档密码document.initialize()if document.is_extractable:print(True)else:raise PDFTextExtractionNotAllowed#  存储文档资源src = PDFResourceManager()#  设备对象device = PDFPageAggregator(src, laparams=LAParams())#  解释器对象inter = PDFPageInterpreter(src, device)pages = document.get_pages()# 总文本str_total = ''for page in pages:inter.process_page(page)layout = device.get_result()for x in layout:if isinstance(x, LTTextBoxHorizontal):str_total += str(x.get_text())# 提取所需数据admission_ticket_number.append(re.findall('准考证号:(.*?)\n', str_total, re.S)[0])name.append(re.findall('姓名:(.*?)\n', str_total, re.S)[0])return {'admission_ticket_number': admission_ticket_number, 'name': name}# 存储所有爬取对象的信息
data_list = []for file in os.listdir('你的文件目录'):if file.endswith('.pdf'):# 斜杠别删了,这里没有使用os.pathdata_list.append(open_one_pdf('你的文件目录\' + file))else:passwith open('admission_num.json', 'w') as f:f.write(json.dumps(data_list))

  到这里,我们得到了准考证信息

三、爬取成绩

# 百度api识别验证码
def deal_yzm():""" 你的 APPID AK SK """APP_ID = ''API_KEY = ''SECRET_KEY = ''client = AipOcr(APP_ID, API_KEY, SECRET_KEY)def get_file_content(filePath):with open(filePath, 'rb') as fp:return fp.read()url = r'yzm.png'image = get_file_content(url)""" 调用文字识别, 图片参数为本地图片 """x = client.basicAccurate(image)# 一天500次,一般情况足够使用# 设置时间间隔,减少出错率time.sleep(1)# 筛选 这里的条件是识别出的结果只有一个且长度为4,请自行修改if x['words_result_num'] == 1 and len(x['words_result'][0]['words'].replace(' ', '')) == 4:return x['words_result'][0]['words'].replace(' ', '')else:return 'none'# 保存验证码
# webdriver提取元素的路径可能会有变动,使用前请检查
def save_yzm(img):src_url = img.get_attribute('src')response = requests.get(src_url)with open('yzm.png', 'wb') as f:f.write(response.content)# 几次试验得到的结果,可能转为灰度更易识别I = Image.open('yzm.png')L = I.convert('1')L.save('yzm.png')# 保存失败和成功信息的列表
fail = []while True:# 加载准考证和姓名信息# 如果有失败记录文件则使用失败记录中的数据if os.path.exists('fail.json'):with open('fail.json', 'r') as f:data = json.loads(f.read())else:with open('admission_num.json', 'r') as f:data = json.loads(f.read())# 有分数记录则继续添加if os.path.exists('score.json'):with open('score.json', 'r') as f:score = json.loads(f.read())else:score = []# 遍历列表中的准考证和姓名信息for i in data:# 创建Chrome对象driver = webdriver.Chrome()# driver等待时间driver.implicitly_wait(3)number = i["admission_ticket_number"][0]name = i['name'][0]driver.get('http://cet.neea.edu.cn/cet/')# 获取元素btn_id = driver.find_element_by_xpath('//*[@id="zkzh"]')btn_name = driver.find_element_by_xpath('//*[@id="name"]')btn_yzm = driver.find_element_by_xpath('//*[@id="verify"]')btn_submit = driver.find_element_by_xpath('//*[@id="submitButton"]')btn_id.send_keys(number)btn_name.send_keys(name)btn_yzm.click()# 点击后验证码出现  # 等待加载time.sleep(1)img = driver.find_element_by_xpath('//*[@id="img_verifys"]')# 保存图片 得到验证码save_yzm(img)# 识别出的字符值value = deal_yzm()# 处理识别失败的情况,有一类加入了干扰线,不好识别# 这里选择刷新重复上传识别while value == 'none':img_change = driver.find_element_by_xpath('//*[@id="verifysStrDiv"]/a')img_change.click()time.sleep(1)save_yzm(img)value = deal_yzm()# 发送验证码并点击提交btn_yzm.send_keys(value)btn_submit.click()# 等待time.sleep(1)# 因为登陆失败会有alert弹窗,driver会有错误提示,会结束程序,所以使用错误处理try:source = driver.page_sourceexcept:source = ''if '找出成绩单中的标志性信息,如学校等' not in source:print('验证码获取不正确,请重新执行一次\n 失败id{}已保存至fail.json'.format(i))fail.append(i)driver.close()continue# 筛选成绩score_one = re.findall('<span id="s">(.*?)</span>', source, re.S)print({'name': i['name'][0], 'score': score_one})score.append({'name': i['name'][0], 'score': score})driver.close()with open('fail.json', 'w') as f:f.write(json.dumps(fail))with open('score.json', 'w') as f:f.write(json.dumps(score))if not fail:break

  至此已经做完了数据的爬取,下面进行数据分析:

with open('score.json', 'r')as f:data = json.loads(f.read())sorted_x = sorted(data, key=operator.itemgetter('score'))
flag = 1
for i in sorted_x:if i['score'][0] > '425' and flag == 1:flag += 1print("".center(60, '='))print(i['name'] + '\t\t' + i['score'][0])os.system('pause')

  打印排序后的成绩,在第一个大于425的数后面加一个横线,暂停

代码和文章结构可能有些不调理,存在许多不足,使用时请自行修改

转载于:https://www.cnblogs.com/ligaofeng/p/11442902.html

python 批量爬取四级成绩单相关推荐

  1. python四级成绩_python 批量爬取四级成绩单

    使用本文爬取成绩大致有几个步骤:1.提取表格(或其他格式文件--含有姓名,身份证等信息)中的数据,为进行准考证爬取做准备.2.下载准考证文件并提取出准考证和姓名信息.3.根据得到信息进行数据分析和存储 ...

  2. python自动搜索爬取下载文件-python批量爬取下载抖音视频

    本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...

  3. 疫情过去女朋友想去重庆玩,python批量爬取小猪短租重庆民宿信息

    疫情过去女朋友想去重庆玩,python批量爬取小猪短租重庆民宿信息 随着时间的流逝,在中国共产党的领导,全国人民的共同努力下,疫情逐渐受到了控制,逐渐好转,复工,开学有望.最近在和女朋友的闲聊当中得知 ...

  4. Python批量爬取王者荣耀英雄高清壁纸

    Python批量爬取王者荣耀英雄高清壁纸 文章目录 Python批量爬取王者荣耀英雄高清壁纸 前言 爬虫步骤 python代码实现 总结 前言 很多喜欢玩王者的朋友很希望把王者荣耀的英雄图片拿来做壁纸 ...

  5. python 批量爬取网易云音乐,java解密

    每天一点点,记录学习 python 批量爬取网易云音乐 网易云音乐,排行榜,右键,显示网页源代码,并不能找到任何一首歌的id,是因为java加密了 随便找一首id为1374061038的歌,在网页源代 ...

  6. python爬虫笔记(八) 实例3:用Python批量爬取全站小说【以书趣阁为例】

    1. 用Python批量爬取全站小说 爬取这个网站小说:http://www.shuquge.com/txt/89644/index.html 2. 爬取一本书 # -*- coding: utf-8 ...

  7. python webshell_使用 Python 批量爬取 WebShell

    使用 Python 批量爬取 WebShell 还在用爬虫爬一些简单的数据?太没意思了!我们来用爬虫爬 WebShell! 0. 引子 前些天访问一个平时经常访问的网站,意外的发现这个站出了问题,首页 ...

  8. 最新 用Python 批量爬取网上图片

    标题 最新 用Python 批量爬取网上美眉图片 故事是这样的:七月份给室友说,我要开始学习Python了.室友一脸懵,并问我Python是啥?确实对于我这个小城市来说Python之风还没有吹到我们这 ...

  9. Python批量爬取简历模板

    文章目录 前言 一.需求 二.分析 1. 查看网页源码(ctrl+u) 2.进一步分析 三.处理 四.运行效果 前言 为了更好的掌握数据处理的能力,因而开启Python网络爬虫系列小项目文章. 小项目 ...

最新文章

  1. 代码工具 | 数据清洗,试试这 8套Python代码
  2. activity中fragment 返回键不退出_优雅地处理加载中(loading),重试(retry)和无数据(empty)等...
  3. MySQL5.7在Ubuntu上的安装、配置与使用
  4. 为什么博图中放置按下按钮无反应_为什么点击按钮没反应呢?
  5. oracle pl/sql 包
  6. 蔚来明年推出Gemini 该系列保持高端定位?
  7. 项目开发中如何提升团队的战力?
  8. 详解CSS中:nth-child的用法
  9. C++语音识别接口快速入门(Microsoft Speech SDK)
  10. 三菱fx2n64mr说明书_可编程控制器FX2N-64MR-D手册三菱FX2N-64MR-D使用说明书 - 广州凌控...
  11. 已解决-Windows10没有windows照片查看器-Windows10打开照片是黑底的
  12. 计算机网络由通讯子网和什么组成,计算机网络由通信子网和什么子网组成
  13. matlab上机作业,matlab上机作业(数字信号处理)
  14. 单片机学习——存储器详解(程序存储器、片内RAM、拓展RAM、EEPROM)
  15. 完美解释:wenet-流式与非流式语音识别统一模型
  16. 夜明け前より瑠璃色な 攻略
  17. 【天光学术】信息管理论文:计算机信息管理应用于网络安全的策略(节选)
  18. Zoom天使投资人Jim Scheinman:Zoom的诞生始末
  19. 阿里云网站备案简单流程说明文档
  20. 喜讯|宏时数据获得CMMI3级认证!欢迎了解自研统一运维监控平台!

热门文章

  1. Axure RP9——【唱片旋转播放暂停效果】
  2. arm开发板使用fio测试磁盘读写速度
  3. 奈奎斯特准则的简洁证明
  4. springboot-过滤器与xxs攻击防御
  5. 工作找不到,闲在家写个js的连连看,打发无聊时间,
  6. W5500EVB通过上位机配置+固件升级
  7. Python 参数校验的进化
  8. xcode 4 制作静态库详解
  9. SpringBoot免费视频教程
  10. ARM微控制器-MCU基础及CPU运行过程(堆栈/中断/寄存器操作)