打印英语四六级准考证
注意点:
1.你必须具备一个能知道自己身份的资料
2.你还需要有第三方的验证码接口,其实不贵,1元可以500次,直接搜快识别注册就可以了
3.使用ip代理(不推荐,这是不合法的),当你爬到某次数时,会限制你爬取。(这还在学)
下面上代码:
import base64
import json
import time # 计算耗费时间
import pymysql # 连接数据库,由于我把数据存在数据库里面的
import requests
from selenium import webdriver
# 就是点提交的时候判断是否有弹框出现
def isElementExist():
flag = True
try:
driver.find_element_by_css_selector('body > div.panel.window.panel-htop.messager-window')
return flag
except:
flag = False
return flag
# 第三方验证码API接口,我这里用的是快识别的接口,我觉得接近99.8%的正确率
def base64_api(uname, pwd, img, typeid):
with open(img, 'rb') as f:
base64_data = base64.b64encode(f.read())
b64 = base64_data.decode()
data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
if result['success']:
return result["data"]["result"]
else:
return result["message"]
return ""
# 具体逻辑代码
def input_content(key,cname):
time.sleep(3)
# 选择省份按钮
driver.find_element_by_css_selector('#selProvince > option:nth-child(18)').click()
time.sleep(2)
# 选择身份证类别按钮
driver.find_element_by_css_selector('#selIDType > option:nth-child(2)').click()
time.sleep(3)
# 自动填写身份证
driver.find_element_by_css_selector('#txtIDNumber').send_keys(key)
time.sleep(1)
# 自动填写米子按钮
driver.find_element_by_css_selector('#txtName').send_keys(cname)
# 截取图片
img_label = driver.find_element_by_css_selector('#vcodeImg')
time.sleep(2)
# 截图保存本地,并发送给第三方。
img_label.screenshot('yanzhengma.png')
# 获得验证码
result = base64_api(uname='你的快识别用户名', pwd='你的跨识别密码', img='验证码保存的路径在哪', typeid=3)
# 发送验证码
time.sleep(1)
# 填写第三方发送的验证码
driver.find_element_by_css_selector('#txtVerificationCode').send_keys(result)
# 点击登录按钮
time.sleep(4)
driver.find_element_by_css_selector('#ibtnLogin').click()
# 这里看是否有弹框,因为点击提交时,有可会有错误,验证码错误,或者给同学没有报名,所以必须判断
result = isElementExist()
print(result)
# 为真有弹框弹出
if result:
# 点击弹框里面的内容
a = driver.find_element_by_css_selector('body > div.panel.window.panel-htop.messager-window > div.messager-body.panel-body.panel-body-noborder.window-body > div:nth-child(2)').text
# 把验证错误的记录下来,并保存到文件中,以便查看
if a== '验证码错误':
with open('c.txt', mode='a', encoding='utf-8') as f:
f.write(str(cname))
f.write(str(key))
print('================================',a , key, cname)
# 点击弹框的确定按钮
driver.find_element_by_css_selector(
'body > div.panel.window.panel-htop.messager-window > div.dialog-button.messager-button > a').click()
# 点击首页按钮
driver.find_element_by_css_selector('#nav > div > ul > li:nth-child(2) > a').click()
time.sleep(2)
# 点击快速进入准考证按钮
driver.implicitly_wait(5)
driver.find_element_by_css_selector('#main_l > a.c_hei.cet_banner06').click()
else:
time.sleep(2)
# 点击下载pdf按钮
driver.find_element_by_css_selector('tbody > tr > td:nth-child(2) > a').click()
time.sleep(6)
# 首页按钮
driver.find_element_by_css_selector('#nav > div > ul > li:nth-child(2) > a').click()
time.sleep(2)
# 进入按钮
# 智能等待时间
driver.implicitly_wait(5)
driver.find_element_by_css_selector('#main_l > a.c_hei.cet_banner06').click()
# 连接我自己的数据库
def connect_db():
db = pymysql.connect(host='localhost',
user='root',
password='数据库密码',
database='数据库名称',
port=3306,
charset='utf8')
cursor = db.cursor()
cursor.execute('select sname,carid from dangzhibu where cid not like "2016%"')
db.commit()
# 返回所有的结果
result = cursor.fetchall()
cursor.close()
db.close()
return result
lis = list(connect_db()) # 连接数据库返回的结果
# 返回一个浏览器对象
driver = webdriver.Edge('C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver.exe')
driver.get('http://cet-bm.neea.edu.cn/Home/QuickPrintTestTicket')
# 浏览器最大化
driver.maximize_window()
# 遍历所有数据库查询到的信息
# 如果没有数据库,可以直接调用input_content(身份证号,名字),不需要数据库
for i in lis:
input_content(i[1],i[0])
time.sleep(5)
总结:再写这个的时候还是遇见一些问题,比如怎么判断弹框是否出现,还有休眠时间的设置,这些都是一个很大的问题,特别是休眠时间需要把握,如果快了,按钮没有出来就需要点,结果就报错了。这个也可以用多线程,但是尽量不要用。