python多线程填写体温(一次可填写10+位)(升级至尊版)

继上次教程: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()

你可能感兴趣的:(自动化,python,自动填写体温,python,selenium,time,random,多线程)