Python实现问卷星调查问卷自动填写

文章目录

  • 前言
  • 一、配置环境
    • 1.1 下载依赖selenium
    • 1.2 安装chrome驱动
    • 1.3 引入库
  • 二、简易版快速上手教程
    • 1.自定义变量
    • 2.自定以函数
    • 3 主函数编写
  • 三 逐步解析
    • 1 基础代码
    • 2 实现步骤
  • 四 代码
  • 总结


前言

如何使用python实现对问卷的自动填写提交任务并且还能解决智能验证问题。


一、配置环境

1.1 下载依赖selenium

selenium是一款网页爬虫重要的工具。

1.2 安装chrome驱动

这里需要准备chrome浏览器以及对应的驱动。需要注意的是驱动的版本需要和chrome保持一致。
chrome浏览器版自行查看本机安装版本。
在这里插入图片描述

chrome驱动下载链接 chrome驱动链接找到对应版本的驱动。
在这里插入图片描述
下载后将安装包解压(解压后为.exe文件)在自定义任意文件夹即可。

1.3 引入库

from selenium import webdriver
import numpy as np
import time
from selenium.webdriver.common.by import By

二、简易版快速上手教程

这部分的目的主要是快速上手应用到自己的问卷当中,如果该部分出现问题,那么可能是问卷星版本不同,默认的XPATH不同导致的,所以可以跳至 三 从原理进行根据自身情况量身打造。

1.自定义变量

代码如下(示例):
url = 'https://www.wjx.cn/vm/tMNr1Ba.aspx' # 问卷链接
path = r"E:\\chorme_qd\\chromedriver_win32\\chromedriver.exe" #前面下载的chrome驱动链接

2.自定以函数

定义选择方式。这里选择对多选题和单选题的选择方式为随机选取。

def selection(a): #随机选择 输入参数为任意个数str(xpath) 返回值为某一随机str(xpath)n = len(a)num = np.random.randint(1,n)for i in range(1,n+1,1):if(i==num):return a[num-1]def delay_roll(driver, t=0.5, distance=200): #延时+屏幕滚动global roll_distanceroll_distance = roll_distance + distancejs="var q=document.documentElement.scrollTop=" + str(roll_distance)    #下拉像素(800是基于最顶端测算的距离)driver.execute_script(js)time.sleep(t)def duoxuan(driver, num, nums): #多选题 num:题号  nums:选项个数xx = []for i in range(1, nums+1):xpath = '//*[@id="div' + str(num) +  '"]/div[2]/div[' + str(i) + "]/span/a"xx.append(xpath)n = len(xx)num = np.random.randint(2, n)ids = set(np.random.randint(0,n-1,num))for i in ids:time.sleep(1)driver.find_element(By.XPATH, xx[i]).click()delay_roll(driver, 0.5, 200) #延时0.5s,滚动200长度def danxuan(driver, num, nums): #单选题 num:题号 nums:选项数量  driver:网页读取类xx = []for i in range(1, nums+1):xpath = '//*[@id="div' + str(num) +  '"]/div[2]/div[' + str(i) + "]/span/a"xx.append(xpath)driver.find_element(By.XPATH, selection(xx)).click()delay_roll(driver, 0.5, 200) #延时0.5s,滚动200长度def tiankong(driver, num, text): #填空 num: 题号 text:内容driver.find_element(By.XPATH, '//*[@id="q' + num + '"]').send_keys(str(text))delay_roll(driver)
这里如果使用的当前版本最新的问卷,为了简易快速上手,全部采用默认值封装成函数。
下面编写主函数就非常简单易懂易上手。

3 主函数编写

def autoWrite(num):for i in range(num):print("正在执行操作......")# 给出所需的url和option参数url_survey = (url)  # 根据需要填写url#防止被浏览器识别为脚本option = webdriver.ChromeOptions()option.add_experimental_option('excludeSwitches', ['enable-automation'])option.add_experimental_option('useAutomationExtension', False)driver = webdriver.Chrome(executable_path=path, options=option)driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',{'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})driver.get(url_survey)time.sleep(0.2)#第一题 单选danxuan(driver, 1, 4)  #题号为1,有4个选项#第二题 填空 tiankong(driver, 2, "test") #题号为2,填写内容为:”test“#第三题 多选题duoxuan(driver, 3, 7) #题号为3,7个选项#第四题 样例的问卷中该单选题这个单选题选是的话还要继续填内容,没做这个,所以为了跑通测试选择否就行了。driver.find_element(By.XPATH, '//*[@id="div4"]/div[2]/div[2]/span/a').click()time.sleep(1)#点击提交driver.find_element(By.XPATH, '//*[@id="ctlNext"]').click()print('第'+str(i)+'次填写成功')time.sleep(1)# 模拟点击智能验证按钮# 先点确认try:driver.find_element(By.XPATH,'//*[@id="layui-layer1"]/div[3]/a[1]').click()time.sleep(1)except:pass# 再点智能验证提示框,进行智能验证try:driver.find_element(By.XPATH, '//*[@id="SM_BTN_WRAPPER_1"]').click()time.sleep(3)except:passprint("end")driver.quit()time.sleep(2)

在这部分,实际需要修改的呢就是以下这部分了:

		#第一题 单选danxuan(driver, 1, 4)  #题号为1,有4个选项#第二题 填空 tiankong(driver, 2, "test") #题号为2,填写内容为:”test“#第三题 多选题duoxuan(driver, 3, 7) #题号为3,7个选项

在默认你使用的问卷版本跟作者一样的话就可以只需要修改autoWrite中的以上部分的代码即可。
逻辑很简单,按照问卷排版格式,一条一条编写下来即可。比如上述三条代码的对应关系如下:
在这里插入图片描述

三 逐步解析

该部分将从原理出发来讲解如何编写全部代码。

1 基础代码

该部分作用还是选择题的选择策略自定义。

def selection(*a): #单选题 输入参数为任意个数str(xpath) 返回值为某一随机str(xpath)global flagn = len(a)num = np.random.randint(1,n)for i in range(1,n+1,1):if(i==num):flag = numreturn a[num-1]
def duoxuan(driver, a): #随机数生成n = len(a)num = np.random.randint(2, n)ids = set(np.random.randint(0,n-1,num))for i in ids:time.sleep(1)driver.find_element(By.XPATH, a[i]).click()
def delay_roll(driver, t, distance): #延时+滑动global roll_distanceroll_distance = roll_distance + distancejs="var q=document.documentElement.scrollTop=" + str(roll_distance)    #下拉像素(800是基于最顶端测算的距离)driver.execute_script(js)time.sleep(t)

2 实现步骤

对于选择的原理就是找到题中各个选项的XPATH地址即可。
首先、在问卷网页中按F12进入检查界面。
在这里插入图片描述
元素中通过一层一层的查找到id=divQuestion即找到了我们的问卷区域。
在这里插入图片描述
在该层下罗列了所以题目的信息元素。
在这里插入图片描述
顺着层级关系我们就能够找到对应的选项的位置在哪。
在这里插入图片描述
右键选中该部分,复制XPath则获取到了对应模块的按钮地址,比如该模块为
//*[@id=“div1”]/div[2]/div[1]/div
而我们就可以通过以下方法来使用他:

driver.find_element(By.XPATH, '//*[@id="div1"]/div[2]/div[1]/div').click()

以上表示click点击该部分的意思。

基于 以上内容 基本上所有的模块都是可以通过这个方法找到他的XPath进行调用。
对于填空使用如下方法:

driver.find_element(By.XPATH, '//*[@id="q2"]').send_keys('text')

不同模块的XPath格式不同。

四 代码

最后附上二 三 部分的代码
二:

from selenium import webdriver
import numpy as np
import time
from selenium.webdriver.common.by import By# option = webdriver.ChromeOptions()
# option.add_argument('headless')
url = 'https://www.wjx.cn/vm/tMNr1Ba.aspx'
path = r"E:\\chorme_qd\\chromedriver_win32\\chromedriver.exe"
roll_distance = 0
def selection(a): #单选题 输入参数为任意个数str(xpath) 返回值为某一随机str(xpath)n = len(a)num = np.random.randint(1,n)for i in range(1,n+1,1):if(i==num):return a[num-1]
def delay_roll(driver, t=0.5, distance=200): #延时+屏幕滚动global roll_distanceroll_distance = roll_distance + distancejs="var q=document.documentElement.scrollTop=" + str(roll_distance)    #下拉像素(800是基于最顶端测算的距离)driver.execute_script(js)time.sleep(t)
def duoxuan(driver, num, nums): #多选题 num:题号  nums:选项个数xx = []for i in range(1, nums+1):xpath = '//*[@id="div' + str(num) +  '"]/div[2]/div[' + str(i) + "]/span/a"xx.append(xpath)n = len(xx)num = np.random.randint(2, n)ids = set(np.random.randint(0,n-1,num))for i in ids:time.sleep(1)driver.find_element(By.XPATH, xx[i]).click()
def danxuan(driver, num, nums): #传入 num:题号 nums:选项数量  driver:网页读取类xx = []for i in range(1, nums+1):xpath = '//*[@id="div' + str(num) +  '"]/div[2]/div[' + str(i) + "]/span/a"xx.append(xpath)driver.find_element(By.XPATH, selection(xx)).click()delay_roll(driver, 0.5, 200) #延时0.5s,滚动200长度
def tiankong(driver, num, text): #num: 题号 text:内容driver.find_element(By.XPATH, '//*[@id="q' + str(num) + '"]').send_keys(str(text))delay_roll(driver)
def autoWrite(num):global roll_distancefor i in range(num):roll_distance = 0print("正在执行操作......")# 给出所需的url和option参数url_survey = (url)  # 根据需要填写url#防止被浏览器识别为脚本option = webdriver.ChromeOptions()option.add_experimental_option('excludeSwitches', ['enable-automation'])option.add_experimental_option('useAutomationExtension', False)driver = webdriver.Chrome(executable_path=path, options=option)driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',{'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})driver.get(url_survey)time.sleep(0.2)#第一题 单选danxuan(driver, 1, 4)  #题号为1,有4个选项#第二题 填空 tiankong(driver, 2, "test") #题号为2,填写内容为:”test“#第三题 多选题duoxuan(driver, 3, 7) #题号为3,7个选项#第四题 样例的问卷中该单选题这个单选题选是的话还要继续填内容,没做这个,所以为了跑通测试选择否就行了。driver.find_element(By.XPATH, '//*[@id="div4"]/div[2]/div[2]/span/a').click()time.sleep(1)#点击提交driver.find_element(By.XPATH, '//*[@id="ctlNext"]').click()print('第'+str(i)+'次填写成功')time.sleep(1)# 模拟点击智能验证按钮# 先点确认try:driver.find_element(By.XPATH,'//*[@id="layui-layer1"]/div[3]/a[1]').click()time.sleep(1)except:pass# 再点智能验证提示框,进行智能验证try:driver.find_element(By.XPATH, '//*[@id="SM_BTN_WRAPPER_1"]').click()time.sleep(3)except:passprint("end")driver.quit()time.sleep(2)
autoWrite(3)

三:

from selenium import webdriver
import numpy as np
import time
from selenium.webdriver.common.by import By# option = webdriver.ChromeOptions()
# option.add_argument('headless')
url = 'https://www.wjx.cn/vm/tMNr1Ba.aspx'
path = r"E:\\chorme_qd\\chromedriver_win32\\chromedriver.exe"
roll_distance = 0
def selection(a): #单选题 输入参数为任意个数str(xpath) 返回值为某一随机str(xpath)n = len(a)num = np.random.randint(1,n)for i in range(1,n+1,1):if(i==num):return a[num-1]
def delay_roll(driver, t=0.5, distance=200): #延时+屏幕滚动global roll_distanceroll_distance = roll_distance + distancejs="var q=document.documentElement.scrollTop=" + str(roll_distance)    #下拉像素(800是基于最顶端测算的距离)driver.execute_script(js)time.sleep(t)
def duoxuan(driver, xx): #多选题 num:题号  nums:选项个数n = len(xx)num = np.random.randint(2, n)ids = set(np.random.randint(0,n-1,num))for i in ids:time.sleep(1)driver.find_element(By.XPATH, xx[i]).click()
def autoWrite(num):global roll_distancefor i in range(num):roll_distance = 0print("正在执行操作......")# 给出所需的url和option参数url_survey = (url)  # 根据需要填写url#防止被浏览器识别为脚本option = webdriver.ChromeOptions()option.add_experimental_option('excludeSwitches', ['enable-automation'])option.add_experimental_option('useAutomationExtension', False)driver = webdriver.Chrome(executable_path=path, options=option)driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',{'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})driver.get(url_survey)time.sleep(0.2)#第一题driver.find_element(By.XPATH, selection('//*[@id="div1"]/div[2]/div[1]/span/a','//*[@id="div1"]/div[2]/div[2]/span/a','//*[@id="div1"]/div[2]/div[3]/span/a','//*[@id="div1"]/div[2]/div[4]/span/a')).click()# driver.find_element(By.XPATH, '//*[@id="q2"]').send_keys('money')js="var q=document.documentElement.scrollTop=400"  driver.execute_script(js)   #第二题//*[@id="q2"]time.sleep(1)driver.find_element(By.XPATH, '//*[@id="q2"]').send_keys('money')js="var q=document.documentElement.scrollTop=200"    #下拉像素(800是基于最顶端测算的距离)driver.execute_script(js)        #执行下拉像素操作#第三题time.sleep(1)duoxuan(driver, ('//*[@id="div3"]/div[2]/div[1]/span/a','//*[@id="div3"]/div[2]/div[2]/span/a','//*[@id="div3"]/div[2]/div[3]/span/a','//*[@id="div3"]/div[2]/div[4]/span/a','//*[@id="div3"]/div[2]/div[5]/span/a','//*[@id="div3"]/div[2]/div[6]/span/a','//*[@id="div3"]/div[2]/div[7]/span/a'))#第四题js="var q=document.documentElement.scrollTop=400"    #下拉像素(800是基于最顶端测算的距离)driver.execute_script(js)        #执行下拉像素操作time.sleep(1)driver.find_element(By.XPATH, '//*[@id="div4"]/div[2]/div[2]/span/a').click()time.sleep(1)driver.find_element(By.XPATH, '//*[@id="ctlNext"]').click()print('第'+str(i)+'次填写成功')time.sleep(2)# 模拟点击智能验证按钮# 先点确认//*[@id="layui-layer1"]/div[3]/a[1] //*[@id="SM_BTN_WRAPPER_1"]try:driver.find_element(By.XPATH,'//*[@id="layui-layer1"]/div[3]/a[1]').click()time.sleep(1)except:passtry:driver.find_element(By.XPATH, '//*[@id="SM_BTN_WRAPPER_1"]').click()time.sleep(3)except:pass# 再点智能验证提示框,进行智能验证# driver.find_element(By.XPATH,"//div[@id='captcha']").click()print("end")driver.quit()time.sleep(2)
autoWrite(3)

总结

参考博客:https://blog.csdn.net/DexiangPeng/article/details/121451375
本文基于问卷演示了如何进行爬虫,对网页内容进行解析,只用作技术学习交流,勿用在其他不当用途上、一起提升网页操作相关的能力。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac 软件出现「意外退出」及「打不开」解决方法

解决方法 方法其实有很多种,这里介绍常用的几种 终端法需先安装Xcode或Apple命令行工具 如未装Xcode可以使用下列命令安装Apple命令行工具(如安装有Xcode可忽略) xcode-select --install 1.终端法 sudo codesign --force --deep --sign -…

postman能正常打开但不显示窗口

1.最近使用postman偶尔出现以下问题 postman在任务栏能正常打开,如下图,使用AltTab也能看到,但是窗口就是显示不了 2.解决方案 将鼠标放在任务栏上,使用快捷键Alt空格,弹出小窗口,然后点击弹框中的最大化…

MPAndroidChart的HorizontalBarChart数值显示不全问题

现在使用的版本是:v3.1.0 方案一: private HorizontalBarChart hor_bar_chart; hor_bar_chart(HorizontalBarChart) findViewById(R.id.hor_barchart); YAxis leftYAxishor_bar_chart.getAxisLeft(); // 设置y轴边距,解决数值过大显示不全问…

解决 echarts 图中 tooltip 文本内容太长导致显示不全

问题: 使用 tooltip 的 extraCssText,高效方便 tooltip: {show:true,trigger: "axis",confine: true, // 文本太长自动换行extraCssText: white-space: normal; word-break: break-all;, // 文本太长自动换行效果:

CoordinatorLayout显示不全问题

问题一 <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"android:layout_width"match_parent"android:layout_height&…

在html中页面不全,网页显示不全,教您网页显示不全怎么办

当我们在电脑系统中使用IE浏览器浏览网页时&#xff0c;偶尔会出现是否只查看安全内容的提示&#xff0c;甚至有可能会出现页面显示不全的情况。一般遇到这种情况会选择继续查看网页内容&#xff0c;怎么去处理&#xff1f;下面&#xff0c;小编给大家介绍网页显示不全的解决步…

CSS问题:导航栏设置通栏后,放大页面背景显示不全

问题描述&#xff1a; 正常显示时&#xff1a;将网页放大到150%后&#xff1a; 解决办法&#xff1a; 当导航栏设置为width:100%或不给宽&#xff0c;是相当于当前文档流而言的&#xff0c;也就是浏览器窗口的大小。 此时假设浏览器窗口大小为1000px&#xff0c;那么这个通栏…

关于小程序 input 组件内容显示不全(显示的长度不满 input 宽度)问题

今天在做表单的提交&#xff0c;其中input框出现了一个诡异的问题&#xff0c;就是内容显示不全&#xff08;显示的长度不满 input 宽度&#xff09;&#xff0c;用前愆訾的文章解决&#xff0c;地址http://www.cnblogs.com/miu-key/p/7168933.html。感谢博主~ 转载自&#xff…

wkwebview html5页面,WKWebView h5 页面显示不全问题

WKWebView h5 页面显示不全问题 首先先来看一下效果图如下所示: 1.png 2.png 图 1 下面的分享按钮只显示出一点, 当时想出现这样的 bug 无外乎两点 1.h5 那边设备兼容问题 2.ios 这边显示问题, 问了 h5, 说是直接加载底部的 CSS 样式, 安卓那边显示 OK, 最后看了 h5 的代码也没…

html玩游戏显示不全,客户端登录界面显示不全解决办法

《新天堂II》客户端登录界面显示不全解决办法 在登录《新天堂II》游戏过程正&#xff0c;如果您出现客户端TCLS 界面显示不完全问题&#xff0c;请按照以下步骤设置&#xff0c;进行解决。 双击游戏图标后&#xff0c;出现登录界面显示不完全&#xff0c;如下图&#xff0c;玩家…

layUI的页面显示不全解决方法

在做项目时页面显示不全 可以在layui的css中直接改属性 layui-tab-item 找到这个属性&#xff0c;直接修改高度&#xff0c;如果是谷歌浏览器的话记得清缓存。 还有就是在嵌入时修改属性 <iframe scrolling"no" frameborder"0" src" " wid…

昆仑万维CEO方汉:AIGC以低成本达到80分水平,腰部工作者将大概率被淘汰 | 中国AIGC产业峰会...

丰色 发自 凹非寺量子位 | 公众号 QbitAI “如果人类的水平达不到80分&#xff0c;就会被AI淘汰。” 在中国AIGC产业峰会现场&#xff0c;昆仑万维CEO方汉抛出这样一个大胆预测。 在他看来&#xff0c;目前AIGC对存量知识的理解与表达已经达到80分的水平&#xff0c;行业从业者…

《扬帆优配》交易拥挤度达历史极值 当前A股TMT板块性价比几何?

上周&#xff0c;A股商场企稳&#xff0c;但盘面风格分歧再度加深&#xff1a;很多资金涌入以ChatGPT、数字经济为代表的TMT板块&#xff0c;而新能源以及前期强势的“中字头”种类都呈现了回调。兴业证券计算显现&#xff0c;3月24日&#xff0c;TMT及电子板块的商场成交金额占…

当初急吼吼冲进来的老王们,已经撤了……撤了……

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在“刘教链Pro”发表了《内参&#xff1a;为何要在31k对15k后悔莫及&#xff1f;》&#xff0c;欢迎关注公众号“刘教链Pro”并阅读。 * * * 坊间消息&#xff0c;几个月前高调带资5000万美刀入场、“all in” AI的王…

vx小程序下载使用

首先我们要知道他是干什么用的&#xff0c;首先如果你要学习一个东西就要知道它是干什么的&#xff0c;为什么要学习&#xff0c;自己能收获到什么&#xff01;好久没发帖子了&#xff0c;今天我们来学习一下微信小程序。 这是它的官网&#xff1a;微信开放文档&#xff0c; …

盲盒小程序,微擎小程序通用安装详细教程

盲盒小程序,微擎小程序通用安装详细教程 教程开始&#xff1a; 第一步&#xff1a;我们需要先准备微擎小程序模块应用&#xff0c;这里我们先去下载一下 www.httple.net 第二步&#xff1a;这时候我们需要把后端源码上传到网站目录addons文件然后解压 第三步&#xff1a;进入…

只要几步,微信小程序就能转为APP

在现代互联网的大背景下&#xff0c;拥有自身的APP对企业来讲已经成为了重要的发展步骤。开发自有的商业APP&#xff0c;不仅可以大力推动企业的品牌宣传&#xff0c;还能够满足电商需求&#xff0c;提升销售额。同时&#xff0c;也能够收集到相关用户的数据&#xff0c;以便进…

微信小程序开发工具下载安装

登录官方文档&#xff1a;https://developers.weixin.qq.com/doc/ 点击小程序进入小程序页面&#xff0c;然后点击开发再点击工具进入工具页面。 点击下载&#xff0c;下载稳定版。&#xff08;其他版本也可用&#xff0c;只是不稳定&#xff0c;建议下载稳定版&#xff09;