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

所有需要的工具库:

import urllib

import requests

import xlrd

import json

import re

import time

import os

import operator

from aip import AipOcr

from selenium import webdriver

from PIL import Image

具体实现:

一、提取姓名身份证信息并获取下载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.path

data_list.append(open_one_pdf('你的文件目录\' + file))

else:

pass

with 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_source

except:

source = ''

if '找出成绩单中的标志性信息,如学校等' not in source:

print('验证码获取不正确,请重新执行一次\n 失败id{}已保存至fail.json'.format(i))

fail.append(i)

driver.close()

continue

# 筛选成绩

score_one = re.findall('(.*?)', 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 += 1

print("".center(60, '='))

print(i['name'] + '\t\t' + i['score'][0])

os.system('pause')

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

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

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

  1. python爬取抖音用户数据_python批量爬取下载抖音视频

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

  2. python怎么批量爬取图片_python批量爬取网络图片

    上篇通过python爬取了一篇网络小说,初步了解了爬虫的四步流程,本文稍微扩展一点,试着从网页中爬取出多个图片,具体来看看: 我们今天试着从下面图1的网页上将所有图片都爬取出来,放在一个指定的文件夹里 ...

  3. python爬取图片_python批量爬取网络图片

    上篇通过python爬取了一篇网络小说,初步了解了爬虫的四步流程,本文稍微扩展一点,试着从网页中爬取出多个图片,具体来看看: 我们今天试着从下面图1的网页上将所有图片都爬取出来,放在一个指定的文件夹里 ...

  4. python批量评论_python批量爬取京东手机评论信息及星级

    本科生在读,如有问题欢迎指正 爬取京东评论信息:评论信息是动态加载的,所以在商品详情页不能直接爬取评论. 下面以一款手机为例,详细介绍python批量爬取京东评论. 找到评论区域 image.png ...

  5. Python爬虫学习,批量爬取下载抖音视频

    这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙 项目源码展示 ''' 注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料, ...

  6. python 批量爬取四级成绩单

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

  7. 给小白的python爬虫入门之批量爬取别样网的视频素材

    网络爬虫,听起来很神秘,其实也不过如此,简单来说,只要网站开放了端口即用户能访问这个网站,那么无论这个网站的反爬机制做的有多么好,只要你的技术够,总会有机会破解它. 换句话说,不是你的网站很安全,而是 ...

  8. python websocket爬虫_Python如何爬取实时变化的WebSocket数据

    一.前言 作为一名爬虫工程师,在工作中常常会遇到爬取实时数据的需求,比如体育赛事实时数据.股市实时数据或币圈实时变化的数据.如下图: Web 领域中,用于实现数据'实时'更新的手段有轮询和 WebSo ...

  9. python xpath循环_Python爬虫 爬取北京二手房数据

    点击蓝字"python教程"关注我们哟! 前言 Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及 ...

最新文章

  1. Python实战 | 送亲戚,送长辈,月饼可视化大屏来帮忙!
  2. Android开发--SharedPreferences初步介绍
  3. Java打印菱形(空格菱形)(星星之间有空格)
  4. composer查看当前镜像取消_Docker image镜像常用命令
  5. 工作285:判断绑定逻辑
  6. es6删除数组某项_es6删除数组元素或者对象元素的方法介绍(代码)
  7. centos 卸载docker_linux系统Docker安装及卸载
  8. java JDK设置环境变量
  9. ASP.NET2.0 ReportingServices,报表灵魂的收割者(一)【月儿原创】
  10. 疯狂游戏-研发一面-校招面经
  11. ORACLE归档日志详解
  12. linux查看当前网卡网速,Linux环境编程:获取网卡的实时网速
  13. STM32F4的基础介绍
  14. 【Mysql】InnoDB 中的 B+ 树索引
  15. 10Wqps评论中台,如何架构?B站是这么做的!!!
  16. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之Finding Unexpected Intents
  17. 使用原生JavaScript改变DOM元素面试题
  18. 用php和mysql开发招聘网站
  19. 一种通俗易懂的PWM的解释
  20. 前端网络——get和post的区别

热门文章

  1. no cortex-m sw device found 问题解决
  2. D语言介绍(可能很多朋友还没听说过)
  3. 互联网日报 | iPhone 12系列手机正式发布;盒马入局火锅市场;东风汽车A股IPO申请获受理...
  4. ubuntu 下安装 matplotlib 报错 numpy tornado pyparsing freetye png 依赖没有
  5. c# 读取Excel,并批量插入到数据库
  6. 【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.12 文本、图片
  7. 股票入门——新手如何根据公司财报选择股票?
  8. 【光伏】基于战争策略算法WSO优化光伏模型附matlab代码
  9. cs224w(图机器学习)2021冬季课程学习笔记20 Advanced Topics on GNNs
  10. 李开复创新工厂超级详细面经(附答案)