某学堂的课件只能一分钟一分钟的挂学时,大概2分钟向服务器发送一起请求,工具是requests,现在分享遇到的问题并解决办法,但是不分享思路,不分享代码
1、第一次遇到'Content-Type': 'multipart/form-data; boundary=xxxxxxxxxxxxxxxxxxxxxxxxx'的数据类型
这是在视频开始后,每2分钟请求一次视频遇到的,这个请求也是增加学时用的,是必须要先完成的事情。
遇到这种数据类型,上传的表单数据是files
[Python] 纯文本查看 复制代码 rep_continue=requests.post(url_continue,headers=header_continue,files=params)
设置的表单数据必须是这种结构
[Python] 纯文本查看 复制代码 from collections import OrderedDict
params=OrderedDict([("recordId", (None, str(recordId))),
("position", (None, str(120*num_position))),
('timeOutConfirm', (None, 'false'))])
请求头必须把“Content-Type”这一键值删掉或注释掉
[Python] 纯文本查看 复制代码 header_continue={
'Host': 'degree.qingshuxuetang.com',
'Connection': 'keep-alive',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
'Accept': 'application/json',
#'Content-Type': 'multipart/form-data',#必须注释掉
'X-Requested-With': 'XMLHttpRequest',
'sec-ch-ua-mobile': '?0',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',
'sec-ch-ua-platform': "Windows",
'Origin': 'https://degree.qingshuxuetang.com',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cookie': cookie,
'Referer': eachCourse['courseUrl']+'&cw_nodeId=kcjs_1_1&category=kcjs'
}
2、分数不是刷到一定课时后及时给的,所以判断刷没刷完的话,只能把规定刷到的分数换算成时间
第一步:获取该课程通过分数,并换算成学时
第二步:获取目前刷了多少学时
第三步:进行比较,刷够了就跳下一门
小问题很快解决了
3、登录验证码
该学堂的验证码是以加/减法进行验证的,一开始想需要人工进行验证,最后想到的是,只要识别到加/减法的前后两个数,那也有50%的概率能蒙对
所以先用ddddocr进行识别,大多数识别是5个数字或4个数字,最后的“=?”识别出来必然是2,如上图识别出来后47342
那就简单了
[Python] 纯文本查看 复制代码 try:
if len(code)==5:
number_one=int(code[0]+code[1])
number_two=int(code[2]+code[3])
combine_code=number_one+number_two
elif len(code)==4:
number_one=int(code[0]+code[1])
number_two=int(code[2])
combine_code=number_one+number_two
else:
print(str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))+' '+str(username)+' '+eachCourse['courseName']+' 识别不了验证码,等待3秒重新获取')
time.sleep(3)
continue
except:
continue
我蒙的是加法
在识别验证码之前还有一个小问题,就是验证码图片的下载,因为图片在浏览器可以正常打开,地址开头是“data:image/png”,所以需要将图片地址进行base64解码成二进制才能进行下载
[Asm] 纯文本查看 复制代码 import base64
url_codejpg=base64.urlsafe_b64decode(url_codejpg)
4、多进程multiprocessing(抛弃多线程threading)
之前用多线程,部分线程运行到一半就突然停止了,改用multiprocessing,用法和threading差不多,听说使用multiprocessing时耗费CPU,但是进程不会戛然而止
唯一需要解决的问题就是多进程之间的信息共享,我用了multiprocessing的Manager
[Asm] 纯文本查看 复制代码 dic_user = Manager().dict()
我设置了一个字典,暂时保存各进程下的用户数据和新获取的数据
但是我又又遇到了问题,字典好像不能进行二级存储,比如
[Python] 纯文本查看 复制代码 dic_user['一级']['二级']='二级的数据储存不了'
后来查了一下才知道要写完整,比如
[Python] 纯文本查看 复制代码 dic_user[username]={'cookie':cookie,'所有课程地址':list_allCourse}
这样可以完整保存数据,就是有点不习惯,所以有时候会迷糊
5、效果
凌晨4点5个号开始挂课时
一直到早上9点多,已经有2个号完成了,在挂其他3个号
结尾:
还想用异步来着,还没看太懂,欢迎懂得老师给点建议或者哪里可以学习 |