用Python实现问卷星自动填写(超详细!!!)

news2024/11/27 14:40:23

用Python实现问卷星自动填写(超详细!!!)

  • 前言
  • 一、配置环境
    • 1.1安装依赖
    • 1.2安装驱动
  • 二、实战处理
    • 2.1、引入库函数
    • 2.2、程序所需函数详解
      • (1)自定义单选函数
      • (2)自定义多选函数
      • (3)自定义填空函数
      • (4)自定义智能验证函数
      • (5)自定义滑块验证函数
      • (6)自定义屏幕滚动函数
      • (7)主函数
  • 三、项目整体代码
  • 四、项目修改及扩展
  • 五、总结

前言

(Ps:废话部分可跳过 )相信大家一定都有被问卷给折磨的时候,尤其去求别人填问卷的时候,如果是内向的小伙伴就一定很苦恼了,那么有没有一种工具可以帮助我们去自动填写问卷以达到问卷不求人的东西呢!答案是肯定的,我们都知道python是门很强大的语言,在自动化、人工智能、数据分析等领域有着举足轻重的作用,所以在这里我们选择用python来实现。

一、配置环境

1.1安装依赖

①这里我们需要用到python的库函数——selenium库,这是帮助我们去爬取网页信息和处理网页的重要工具。也是我们本次实现程序所用到的库,直接在选择好的环境下执行
pip install selenium。
②我们还需要用到pyautogui库函数去模拟人手点击或拖拽来进行智能验证,也是在对应的环境执行
pip install pyautogui。

pip install selenium
pip install pyautogui

1.2安装驱动

执行本次程序是在谷歌浏览器下完成的,所以在此之前请下载谷歌浏览器(谷歌浏览器下载地址)。
下好浏览器就可以去下载驱动了,在这之前我们还需做一步,打开已经安装好的谷歌浏览器,查看自己的浏览器版本。
点击设置
在这里插入图片描述
到这里我们就可以下载谷歌驱动了(Chrome驱动链接),点击进去找到对应的版本号,如果没有对应的版本号下载接近的一个即可,如下版本里面没有我的111.0.5563.65的版本,我们下载111.0.0.5563.64的即可(Ps:如果发现在后面打不开驱动出现错误,换一个驱动再试一下,因为这里有些人是要小一点的版本可以,有些人是大一点的版本可以)。
在这里插入图片描述
下载好是一个压缩吧,解压完成后是一个.exe文件,可以放在任意的一个文件夹,只要能找到即可,我这里选择的是放在安装好的谷歌浏览器文件夹下。
在这里插入图片描述

二、实战处理

2.1、引入库函数

这里我们引入所要用到的库函数及对应的包

from selenium.webdriver.common.by import By  # 没有selenium库的(请在所用的环境下pip install selenium)
from selenium import webdriver  #selenium库
import random  # 用于产生随机数
import time  # 用于延时
import pyautogui  # 用于模拟人手

2.2、程序所需函数详解

(1)自定义单选函数

当问卷中有单选就可以直接查询到问卷中的所有单选进行自动答题。

def danxuan(driver):
    # 找到所有标签(定位问题)这里是单选
    dan = driver.find_elements_by_css_selector('#div1 > div.ui-controlgroup.column1')
    for answer in dan:
        ans = answer.find_elements_by_css_selector('.ui-radio')#对应的绝对子标签
        random.choice(ans).click()  # 找到标签并点击
        time.sleep(random.randint(0, 1))

(2)自定义多选函数

寻找问卷中第几题是多选,就可自动去答多选中的题。

def duoxuan(driver):
    #这里是多选题,找到所有多选的标签
    duo = driver.find_elements_by_css_selector('#div2 > div.ui-controlgroup.column1')
    for answer in duo:
        ans = answer.find_elements_by_css_selector('.ui-checkbox')#对应的绝对子标签
        #随机填几次
        for i in range(1, 7):#这里的7可以改成5,10,12
            random.choice(ans).click()#找到标签并点击
        time.sleep(random.randint(0, 1))

(3)自定义填空函数

需要自己去定义第几题是填空并填上自己想要填写的内容。
如果要修改可这样改,例子:index里的数量一定要对应answer里的数量,index的名字可以跟answer不一样
index = [“1”, “2”, “B”, “D”]
answer = {“1”: “python真的好用!”, “2”: “这个测试很成功!”, “B”: “填空题随机填写文本”,“D”: “随便填写!”}

def tiankong(driver, num):
    #填空函数
    #这里是所需要问题的标签汇总,例如有四个要答的问题,下面的answer的ABC数量需要跟index里面的数量相等
    index = ["A", "B", "C"]
    # 自定义要回答的答案
    answer = {"A": "python真的好用!", "B": "这个测试很成功!", "C": "填空题随机填写文本"}
    driver.find_element(by=By.CSS_SELECTOR, value=f'#q{num}')\
        .send_keys(answer.get(index[random.randint(0, len(index)-1)]))

(4)自定义智能验证函数

当出现智能验证的时候,用自定义的这个函数可以帮我们解决。

def renzheng(driver):
    # 智能验证,找到智能认证的标签
    bth = driver.find_element_by_css_selector(
        '#layui-layer1 > div.layui-layer-btn.layui-layer-btn- > a.layui-layer-btn0')
    bth.click()#点击
    time.sleep(1)
    rectBottom = driver.find_element_by_css_selector('#rectBottom') #提交按钮
    rectBottom.click() #点击
    time.sleep(5)

(5)自定义滑块验证函数

当填写问卷次数过多,这时智能验证之后还会出现滑块验证,这时候就需要滑块验证函数帮我们解决。

def huakuai():
    # 当次数多了的时候就会出现滑块,这里是模拟人手解决滑块拖动
    pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
    time.sleep(1)
    pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒
    time.sleep(1)
    pyautogui.click(random.randint(652, 667), random.randint(793, 795))#让鼠标点击x,y处
    time.sleep(1)
    pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
    time.sleep(1)
    pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒

(6)自定义屏幕滚动函数

当问卷中的题数量多的时候,由于答题过快,屏幕没有滑动,这时会被检测出是机器人,就会提交失败,所以我们还需要一个自定义屏幕滑动函数来帮我们解决屏幕滚动问题。

def gundong(driver, distance): #用于屏幕滚动
	#测算出最大的距离根据电脑屏幕分辨率而异,一般填写400到800,800是最大滑动距离
    js = "var q=document.documentElement.scrollTop=" + str(distance)    
    driver.execute_script(js)
    time.sleep(0.5)

(7)主函数

def zonghe(times):
    for i in range(0, times):
        # 初始配置,地址
        url_survey = 'https://www.wjx.cn/vm/hiQpVeR.aspx'
        option = webdriver.ChromeOptions()
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        option.add_experimental_option('useAutomationExtension', False)
        # 本地下载的谷歌浏览器地址
        option.binary_location = r'D:\Goole_Local\Google\Chrome\Application\chrome.exe'
        # 下载好的Chrome驱动的地址
        driver = webdriver.Chrome(r"D:\Goole_Local\Google\Chrome\Application\chromedriver.exe", options=option)
        driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                               {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
        # 启动要填写的地址
        driver.get(url_survey)
        danxuan(driver) #调用单选函数
        duoxuan(driver) #调用多选函数
        gundong(driver, 600)#调用滚动屏幕函数,如果不需要则注释掉
        #调用填空题函数,这个3代表的意思是第三题是填空题,如果有其他填空题需要去完成再调用tiankong(driver, num)即可
        #举例:第八题也是填空题,这时我们加上tiankong(driver, 8)
        tiankong(driver, 3)

        # 最后交卷点击提交
        #time.slee()函数是表示延时的意思,里面可以放固定值也可以放随机数,这里我放的是随机数。
        time.sleep(random.randint(0, 1))
        driver.find_element_by_css_selector('#ctlNext').click()#找到提交的css并点击
        time.sleep(4)

        renzheng(driver)#智能认证函数调用
        huakuai()#滑块函数调用
        print('已经提交了{}次问卷'.format(int(i) + int(1)))
        time.sleep(4)
        driver.quit()#停止

三、项目整体代码

from selenium.webdriver.common.by import By  # 没有selenium库的(请在所用的环境下pip install selenium)
from selenium import webdriver  #selenium库
import random  # 用于产生随机数
import time  # 用于延时
import pyautogui  # 用于模拟人手


def gundong(driver, distance): #延时+屏幕滚动
    js = "var q=document.documentElement.scrollTop=" + str(distance)    #下拉像素(800是基于最顶端测算的距离)
    driver.execute_script(js)
    time.sleep(0.5)

def danxuan(driver):
    # 找到所有标签(定位问题)这里是单选
    dan = driver.find_elements_by_css_selector('#div1 > div.ui-controlgroup.column1')
    for answer in dan:
        ans = answer.find_elements_by_css_selector('.ui-radio')#对应的绝对子标签
        random.choice(ans).click()  # 找到标签并点击
        time.sleep(random.randint(0, 1))

def duoxuan(driver):
    #这里是多选题,找到所有多选的标签
    duo = driver.find_elements_by_css_selector('#div2 > div.ui-controlgroup.column1')
    for answer in duo:
        ans = answer.find_elements_by_css_selector('.ui-checkbox')#对应的绝对子标签
        #随机填几次
        for i in range(1, 7):#这里的7可以改成5,10,12
            random.choice(ans).click()#找到标签并点击
        time.sleep(random.randint(0, 1))

def tiankong(driver, num):
    #填空函数
    #这里是所需要问题的标签汇总,例如有四个要答的问题,下面的answer的ABC数量需要跟index里面的数量相等
    index = ["A", "B", "C"]
    # 自定义要回答的答案
    answer = {"A": "python真的好用!", "B": "这个测试很成功!", "C": "填空题随机填写文本"}
    driver.find_element(by=By.CSS_SELECTOR, value=f'#q{num}')\
        .send_keys(answer.get(index[random.randint(0, len(index)-1)]))

def renzheng(driver):
    # 智能验证,找到智能认证的标签
    bth = driver.find_element_by_css_selector(
        '#layui-layer1 > div.layui-layer-btn.layui-layer-btn- > a.layui-layer-btn0')
    bth.click()#点击
    time.sleep(1)
    rectBottom = driver.find_element_by_css_selector('#rectBottom') #提交按钮
    rectBottom.click() #点击
    time.sleep(5)

def huakuai():
    # 当次数多了的时候就会出现滑块,这里是模拟人手解决滑块拖动
    pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
    time.sleep(1)
    pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒
    time.sleep(1)
    pyautogui.click(random.randint(652, 667), random.randint(793, 795))#让鼠标点击x,y处
    time.sleep(1)
    pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
    time.sleep(1)
    pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒

def zonghe(times):
    for i in range(0, times):
        # 初始配置,地址
        url_survey = 'https://www.wjx.cn/vm/hiQpVeR.aspx'
        option = webdriver.ChromeOptions()
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        option.add_experimental_option('useAutomationExtension', False)
        # 本地下载的谷歌浏览器地址
        option.binary_location = r'D:\Goole_Local\Google\Chrome\Application\chrome.exe'
        # 下载好的Chrome驱动的地址
        driver = webdriver.Chrome(r"D:\Goole_Local\Google\Chrome\Application\chromedriver.exe", options=option)
        driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                               {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
        # 启动要填写的地址
        driver.get(url_survey)
        danxuan(driver) #调用单选函数
        duoxuan(driver) #调用多选函数
        gundong(driver, 600)#调用滚动屏幕函数,如果不需要则注释掉
        tiankong(driver, 3)#调用填空题函数

        # 最后交卷点击提交
        time.sleep(random.randint(0, 1))
        driver.find_element_by_css_selector('#ctlNext').click()#找到提交的css并点击
        time.sleep(4)

        renzheng(driver)#智能认证函数调用
        huakuai()#滑块函数调用
        print('已经提交了{}次问卷'.format(int(i) + int(1)))
        time.sleep(4)
        driver.quit()#停止

if __name__ == "__main__":
    zonghe(2)#里面填写的数是表示要提交多少次问卷

四、项目修改及扩展

如果上面的代码发现跟自己问卷星对不上且无法打开怎么办,别慌!这里教你怎么修改代码
①这里我们用谷歌浏览器打开所需要填写的问卷星地址,然后用电脑上的F12打开开发者模式
在这里插入图片描述
②这里我们可以选用快捷键CTRL+SHIFT+C启动元素检查或者点击我下图标注的地方来进行选择到题号
在这里插入图片描述
③然后我们再查看选择题项的位置在哪里,然后我们就可以知道地方,再选择复制CSS地址就可以得到要修改的地方了
在这里插入图片描述
在这里插入图片描述
④复制完之后我们可以看到得到的是什么,这里得到的就是单选题的大标签

#div1 > div.ui-controlgroup.column1

再接着我们就可以看到各个小标签
在这里插入图片描述
⑤然后我们就可以修改我们的代码了

def danxuan(driver):
	'''
    找到所有标签(定位问题)这里是单选,注意我们使用的是find.elements_by_CSS_selector()
    这样得到的是一个列表,里面包含了所有的选择题,将我们得到的大标签填入如下
    再修改我们所需要选择的小标签,注意小标签填写的时候前面要加 .(点,如:.ui-radio)
    这是代表选择题的绝对路径,这样选择单选的时候就不会错误。
    '''
    dan = driver.find_elements_by_css_selector('#div1 > div.ui-controlgroup.column1')
    for answer in dan:
        ans = answer.find_elements_by_css_selector('.ui-radio')#对应的绝对子标签
        random.choice(ans).click()  # 找到标签并点击
        time.sleep(random.randint(0, 1))

多选题和填空题也是一样,看代码相信大家一定能看懂,这里就不过多展示了

这里用的是CSS的方式,其实在项目中可以选择ID查找,XPATH路径去查找都可以,博客里面也有很多资料,都万变不离其宗,找到对应的标签即可。

 driver.find_element_by_xpath('//*[@id="div1"]/div[2]/div[1]') 这是用XPATH得到的
 简单解释一下里面的值含义吧
 //*[@id="div1"]/div[2]/div[1]
 第一个div1表示的是第一题,第二个div[2]表示的是第二大部分是选择题,第三个div[1]表示的是选择第一个。
 那么你一定能看懂这个XPATH是什么意思  //*[@id="div2"]/div[2]/div[2]
 这里表示的是第二题选择题第二个。

五、总结

python的selenium库是个很重要的网页处理函数库,在处理动态网页上扮演者很重要的角色,一般我们所看到的网页都可以用里面对应方法来完成,只要理解到标签的含义,其实做这类的题是很简单的,这里就是想起前面那段时间填写问卷的时候,所以有感写下这篇文章和方法,但是实际上如果是去比赛的做市场调研之类的,还是不要用这种方式,毕竟真人的感觉选择和机器的随机选择出入还是很大的,在信度分析和效度分析很可能就会垮掉,创作不易,望各位看官给赞再走!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/577405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32的DHT11温湿度测量

目录 1.简介 2.主要参数 3.引脚说明 4.注意事项 5.单总线协议 6.数据格式 7.工作时序 8.分模块编写程序 1.简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠…

【数据分类】PNN数据分类 概率神经网络数据分类【Matlab代码#31】

文章目录 【可更换其他算法,获取资源请见文章第6节:资源获取】1. 模式识别之数据分类2. 概率神经网络(PNN)3. 基于PNN的数据分类步骤4. 部分代码展示5. 仿真结果展示6. 资源获取说明 【可更换其他算法,获取资源请见文章…

web基础与HTTP服务

web基础与HTTP服务 一、web基础1、域名1.域名概述2.域名的结构3.域名注册 2、网页与HTML1.网页概述网页分类动态网页语言编程语言如下 2.HTML概述HTML 基本标签Web概述 二、HTTP服务1、HTTP版本2、HTTP请求方法3、GET 和 POST 区别4、HTTP状态码1.HTTP常见状态码 5、HTTP 请求流…

关于安卓以及微软用户chatgpt上一篇文章如今第五点无法正常进入更新解决方法以及附加本地部署

目录 一、问题出现: 1、问题: 原因: 二、解决办法(本地部署chatgpt) 1、解决(国内网络使用真的chatgpt并非镜像)一次部署终生使用 第一步: ​编辑第二步: 三、实现结…

S32K144开发板

目录 一.S32K144开发板概述 二.产品技术和功能规格 三.开发环境 1.S32K144的开发环境主流是这么三种: 2.开发板Demo工程 四.S32K144开发板实物图 五、汽车大灯硬件架构 一.S32K144开发板概述 S32K14…

Linux (centos)中文乱码问题解决 及说明

首先要区别3个概 :编码集、字符集、字体 是完全不同的东西,我们要解决的是字符集问题。 当一个系统初始化完毕后,会生成一个 /usr/lib/locale/locale-archive 文件,这个是字符集二进制文件,是系统不同语言运行的核心&…

计算机网络四 网络层

网络层的作用 网络层是计算机网络中的一个重要层次,它的主要作用是实现不同网络之间的通信和数据传输。网络层通过将数据分组并添加路由信息,使得数据可以在不同的网络之间传输。 网络层功能 异构网络互连 异构网络互连是指将不同类型的网络连接起来…

C++ 学习 ::【基础篇:07】:C++ C11 标准中 关键字 auto 的基本介绍与使用

本系列 C 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C的三大特性等&#…

redis 五种数据类型简介

redis的五种数据类型是:1、string(字符串);2、hash(哈希);3、list(列表);4、set(集合);5、sort set (有序集合…

【初识 Docker | 中级篇】 Docker 安装 MySQL

文章目录 前言一、安装 docker1、安装docker2、安装docker-compose 二、mysql 单机安装1.创建mysql配置1.1.创建目录1.2.创建docker-compose.yml 2.启动mysql容器 三、mysql 主从复制安装1.主服务器容器配置1.1.修改my.cnf配置文件1.2.重启容器实例,创建同步用户 2.…

【 TensorFlow】URLError: <urlopen error no host given> 错误的 有效的解决方法

URLError: 错误的 有效的解决方法😎 前言🙌错误运行截图:解决方案流程图:运行成功截图 总结撒花💞 😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!&a…

opencv_c++学习(二十六)

一、ORB特征点 ORB特征点计算步骤: Step1:选择某个像素点作为中心点P,其像素值为I。 Step2:设置判定FAST角点(其方法比较两个像素之间的差值)的像素阈值,例如 T p 20 % ∗ I p T_p 20\%*I_p Tp​20%∗Ip​ Step3:比较中心点的像素值与半径为3的圆周上…

传统加密技术(恺撒+仿射)

1.Caesar cipher恺撒密码 是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。 加密对象:英文字母 密钥格式:k&#…

哈希表、unordered_map和unordered_set模拟

目录 哈希表 闭散列 开散列 unordered_map和unordered_set模拟 对开散列的哈希表改造 unordered_set模拟 unordered_map模拟 哈希表 哈希概念:通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该…

当下的程序员该如何面对复杂的就业坏境

已经2023年了,我们都知道现在开发趋向于年轻化,大部分都是90后、95后,毕竟,软件开发不像硬件开发一样,年限越高,相对来说越吃香。 31岁,前端工程师,工作经历8年,7年左右都在外包公司…

LAMP架构(Apache、Mysql、PHP服务的部署)

目录 一、LAMP架构 1.LAMP组件 二、编译安装Apache httpd服务 1.关闭防火墙,拉取软件包 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径 6.添加httpd系统服务 7.修改httpd 服务配置文件 8.浏览器访问验证 三、编译安装mysqld服务 1.…

java.lang.IllegalStateException: Failed to load ApplicationContext

问题描述 mvn clean install的时候报的如下异常: 紧接着又往下翻了一下日志还有一个这个错误 按正常来说通过可以取pom当中的properties标签的值呀。但是可以发现编译过后的application当中的值并没有被替换。 解决过程 (1)我先是将server.…

1:400 万中国土壤数据介绍

一、土壤数据在科研以及日常生产生活中具有重要性价值。以下是其主要方面: 农业生产:土壤数据对于农业生产至关重要。通过了解土壤的物理、化学和生物学特性,农民可以合理管理土壤,选择适合的作物和肥料,调整灌溉和排水…

yolov8_track追踪加分割(yolo目标检测+追踪+分割)

**这个仓库包含了最先进的多目标追踪器。其中一些基于运动信息,另一些则基于运动和外观描述。对于后者,最先进的ReID模型也会自动下载。目前支持的模型有:DeepOCSORT LightMBN、BoTSORT LightMBN、StrongSORT LightMBN、OCSORT和ByteTrack。 我们提供了如何将这个包与流行的…

【轻量化网络系列(4)】ShuffleNetV1论文超详细解读(翻译 +学习笔记+代码实现)

前言 前面我们学了MobileNetV1-3,从这篇开始我们学习ShuffleNet系列。ShuffleNet是Face(旷视)在2017年发布的一个高效率可以运行在手机等移动设备的网络结构,论文发表在CVRP2018上。这个新的轻量级网络使用了两个新的操作&#…