继上次教程:https://blog.csdn.net/weixin_48368411/article/details/113740031
此篇博文主要针对具体的python代码,此次是升级版:多线程(电脑配置好的,网速ok的一次应该可以填10个以上,本人电脑不太行,不过一次6个左右没问题)填写体温,且体温取自己设定范围内的随机值(35.4,36.6)。
(完整代码在文章末尾,各位记得点点赞鼓励下孩子)
确定好目标功能后,下面就是具体实现方法步骤:
1,首先导入程序实现上述功能所需要的模块:
import time #时间模块
from selenium import webdriver # 谷歌驱动器模块
import random # 随机数模块
from multiprocessing import Pool # 多线程模块
2,使用time模块实现填写体温时的延时,主要是为了等待浏览器响应,否则填写时会报错,用一个函数封装。
def stop(number):
time.sleep(number)
3,利用random模块设置一个体温随机数,如下图范围为35.4,~36.6,也可以自行设置。(注意不要忘记下面的格式化format,这个主要是为了保留一位小数,uniform会返回一大串小数位)
**
def rands():
b = '{:.1f}'.format(random.uniform(35.4, 36.6))
return b
**
4,封装一个函数,利用selenium与体温填写网页交互:
(1)交互过程第一步首先得到填写体温的登陆首页:(注意函数的参数)
def write_tem(get_dict): #传入get_dict字典,与多线程有关,先不管
print(get_dict['classnum']+"正在自动填写体温") #get_dict['classnum']表示得到字典中的classnum:学号
driver = webdriver.Chrome() #驱动谷歌浏览器
login_url="https://web.sues.edu.cn" #登陆页面网址
driver.get(login_url) #驱动器驱动登陆页面网址,进入网址
(2)进入网址后,调用前面的演示函数stop(),可以传入参数2~4秒都可以,看自己网速。
stop(4)
driver.find_element_by_id("username").click() #通过查找id的方式找到网页中**”填写用户名“**的元素
driver.find_element_by_id("username").send_keys(get_dict['classnum']) #自动填写自己的classnum学号(get_dict['classnum'])
stop(1)
driver.find_element_by_id("password").click() #再找到密码填写的元素
driver.find_element_by_id("password").send_keys(get_dict['passage']) #自动填写自己的passage:密码(get_dict['passage'])
程序填写好登陆密码和账户后,再点击登陆按钮:
stop(1)
driver.find_element_by_class_name("login_btn").click()
(3)用程序登陆账号后,再进一步的得到体温填写的页面网址,
write_url="https://web.sues.edu.cn/web/LjIwNC4yMTUuMjE2LjIwOS4xNzA=/LjIxOS4yMTAuMjE0LjIwNC4xNTcuMTYzLjIwOC4xNzAuMTQ4LjE2Ny4yMTQuMTUxLjE2Ny45NS4xNTEuMTQ5LjE3NC4xMDMuMTUxLjE2NA==/default/work/shgcd/jkxxcj/jkxxcj.jsp"
driver.get(write_url) #进入具体的填写页面
(4)下面即是填写温度和提交的代码,其实就两个操作(1,定位到要填写的那个网页元素,2,在定位的这个元素上**click()**点击,要填写的元素用send_keys()在元素中写入内容。)
(driver.find_element_by_xpath/find_element_by_xpath/find_element_by_id等等几种其他的方法都可以))
stop(2)
driver.find_element_by_xpath("//div[@class='input-group']/input").click()
stop(2)
driver.find_element_by_xpath("//div[@class='input-group']/input").clear()
stop(2)
driver.find_element_by_xpath("//div[@class='input-group']/input").send_keys(rands())
stop(2)
driver.find_element_by_xpath("//div[@class='form-item text-center form-actions']/button[@class='btn btn-primary obtn']").click()
stop(2)
driver.close() #填写完毕后,自动关闭浏览器页面
print(get_dict['classnum']+"体温填写完毕")
`
5,多线程操作:
people = []
classnums = ['学号1','学号2','学号3','学号4'] #多个输入学号
passages = ['密码1','密码2','密码3','密码4',] #输入对应密码,位置不能乱放
for i in range(0,len(classnums),1):
classnum = classnums[i]
passage = passages[i]
get_dict = {
'classnum': classnum,
'passage': passage
}
people.append(get_dict) #将封装的账号信息加入到列表中
finally:调用多线程模块:
if __name__ == '__main__':
pool = Pool(processes=4)
#processes=4表示一次完成四次pool操作(一次填四个同学),可以自行设置线程个数
pool.map(write_tem, people)
#使用map方法,括号内有填写函数write_tem(实质为调用函数)
#以及people列表中的get_dict用户信息字典(作为参数传入write_tem()函数中)
pool.close()
pool.join()
总结:如果对以上函数方法比较熟悉的同学,可以很快理解程序含义,如果有不熟悉的方法可以百度,具体的查看其使用情况。
心得:代码就是这样,将一系列的小功能结合起来就能实现某一个比较实用的大功能,学习的时候,可以先简单了解部分,再在做大功能的时候,找到目的需求,一个个的用小的知识点构成,和建房子一样。而难的地方就是建房子的过程,怎么建才能达到目标?怎么才能利用好每一片瓦,每一块砖?…
完整代码如下:
import time
from selenium import webdriver
import random
from multiprocessing import Pool
people = []
classnums = ['学号1','学号2','学号3','学号4']
passages = ['密码1','密码2','密码3','密码4',]
for i in range(0,len(classnums),1):
classnum = classnums[i]
passage = passages[i]
get_dict = {
'classnum': classnum,
'passage': passage
}
people.append(get_dict)
def stop(number):
time.sleep(number)
def rands():
b = '{:.1f}'.format(random.uniform(35.4, 36.6))
return b
def write_tem(get_dict):
print(get_dict['classnum']+"正在自动填写体温")
driver = webdriver.Chrome()
login_url="https://web.sues.edu.cn"
driver.get(login_url)
stop(4)
driver.find_element_by_id("username").click()
driver.find_element_by_id("username").send_keys(get_dict['classnum'])
stop(1)
driver.find_element_by_id("password").click()
driver.find_element_by_id("password").send_keys(get_dict['passage'])
stop(1)
driver.find_element_by_class_name("login_btn").click()
write_url="https://web.sues.edu.cn/web/LjIwNC4yMTUuMjE2LjIwOS4xNzA=/LjIxOS4yMTAuMjE0LjIwNC4xNTcuMTYzLjIwOC4xNzAuMTQ4LjE2Ny4yMTQuMTUxLjE2Ny45NS4xNTEuMTQ5LjE3NC4xMDMuMTUxLjE2NA==/default/work/shgcd/jkxxcj/jkxxcj.jsp"
driver.get(write_url)
stop(2)
driver.find_element_by_xpath("//div[@class='input-group']/input").click()
stop(2)
driver.find_element_by_xpath("//div[@class='input-group']/input").clear()
stop(2)
driver.find_element_by_xpath("//div[@class='input-group']/input").send_keys(rands())
stop(2)
driver.find_element_by_xpath("//div[@class='form-item text-center form-actions']/button[@class='btn btn-primary obtn']").click()
stop(2)
driver.close()
print(get_dict['classnum']+"体温填写完毕")
if __name__ == '__main__':
pool = Pool(processes=2)
pool.map(write_tem, people)
pool.close()
pool.join()