使用python实现问卷星自动答题功能——基础篇

题主在学习的过程中,老是有人来让填问卷星,就觉得人填的很麻烦,于是就自己动手写了一个python脚本来实现自动填写问卷星

1.首先我们得学会使用python里面的一个库,selenium,这个库是用来专门面对浏览器的一个库,可以在浏览器里面实现很多的操作(有的时候爬虫也是通过它来实现的。)安装的方法很简单,直接使用cmd,pip install selenium 安装即可(这里不再演示,不会pip的小伙伴可以去百度找找哦)
2.首先就是库的导入阶段,在这里面为了保持我们使用函数的时候不会太过的长,比如.xxxx.xxx的出现,所以我们只使用selenium里面的一个小的库就行了,我们这里使用的是webdriver,使用这个就可以完成我们的工作了。
from selenium import webdriver
import random

解析:这里面的第一行是主要的库,使用random这个库主要是为了实现随机选择的问题。因为我们所做的题目里面是有选择题的,我们使用random这个库来实现在多个选项里面选一个的方法。

3.进入代码正题,首先我们的目的就是实现自动填写问卷星,我们先要打开浏览器,并进入到我们想要填题目的界面。
driver = webdriver.Chrome()
driver.get('https://www.wjx.cn/jq/22452252.aspx')  
input()

附:这个地方注意,直接运行的话是会报错的,因为各个浏览器都是需要驱动的,像大家看了代码之后肯定都发现了,题主所使用的是谷歌浏览器,因为调用的是Chrome这个函数,我们就需要一个浏览器工具来帮我们打开浏览器。首先我们先下载一个插件,由于题主使用的是谷歌浏览器,所以下载的是谷歌浏览器的插件。怕小伙伴找不到,所以在这里贴一个链接:
谷歌浏览器工具链接
找到自己的谷歌浏览器版本下载就可以啦。谷歌浏览器的查看方式为:打开浏览器->…->设置->关于Chrome:
在这里插入图片描述
下载对于的工具后,解压,打开放在Python的目录下面,如下图所示:

在这里插入图片描述
把这个exe放在python的目录下面,就可以实现打开浏览器的功能了(上面代码里面的input是没有用的,作用是为了让浏览器不会关闭的太快,可以看到效果)。

4.进行标签的分析,相信大家都已经打开了浏览器,但是也只是进到了界面,但是咱还得运行,所以我们来对标签进行分析

在这里插入图片描述
我们可以看到,我们的每个题目,都位于一个div标签里面,所以我们先定位到每个标签。使用get函数,获得对应的标签。

from selenium import webdriver
import random
driver = webdriver.Chrome()
driver.get('https://www.wjx.cn/jq/22452252.aspx')  
answers = driver.find_elements_by_css_selector('.div_question')

想看效果的童鞋,可以printf一下,就可以看到结果了。

5.进行了标签的划分之后,就到了填题目的时候了,这个时候我们采用一个循环,拿出之前我们所找到的题目,然后并进行作答(使用random来进行随机选取答案),由于避免过程太多,在这里把如何做填空题的方法也写在这里了。
from selenium import webdriver
import random
driver = webdriver.Chrome()
driver.get('https://www.wjx.cn/jq/22452252.aspx')  
answers = driver.find_elements_by_css_selector('.div_question')
for answer in answers:
    try:
        ####先滑到标签再去点击
        driver.execute_script("arguments[0].scrollIntoView();",answer)
        ### 找到标签
        ans=answer.find_elements_by_css_selector('li')
        if not ans:
            text=answer.find_element_by_css_selector('textarea')
            text.send_keys('没有')
            continue
        lsans=random.choice(ans)
        lsans.click()
    except Exception as e:
        print(e)

解释:首先我们获得了answer之后,我们得避免一些问题导致我们的代码出现红字,于是我们使用try来避免报错(这个原因是,有些题目我们不能作答,但是使用死的代码会发生卡死的现象。)举个简单的例子,当我们遇到一个分叉的时候,比如有的题目,你选了否就会答第五题,选了是就会答第六题,这样子虽然我们会获取到五和六的题目的div,但是却不能两者都答,如果不使用try的话,会导致代码报错不能运行,我们使用try这样子就可以保持即使这题答不了,也只会把异常抛出,然后我们依然会往后做(这样子就从另一个角度来解决了分叉的问题)。

因为问卷星肯定不是只有几题的,肯定是有很多道题的,所以我们要滑动浏览器(因为我们使用的点击只是模仿人的操作,人肯定是不能到自己看不到的地方答题的)使用driver.execute_script(“arguments[0].scrollIntoView();”,answer)来进行浏览器的滑动
然后我们发现,我们所有的题目的回答的选项的标签都在li标签里面,所以我们找到li标签。ans=answer.find_elements_by_css_selector(‘li’)
然后这里我们处理另外一个问题,填空题的问题,我们首先打开填空题的标签

在这里插入图片描述
发现填空题的标签为textarea,所以我们单独为他补一个if,专门用来对付填空题,if不是li标签,我们就来寻找到textarea,然后填入没有,这里面的text.send_keys(‘没有’)就是起到填空的功能,然后如果不是填空题的话,我们就使用random函数的choice来随机产生一个结果,进行选择,这里的lsans.click()是起到点击选项的作用。

6.到这里其实我们就已经大工完成了,但是我们要想实现快速的填写,我们还得进行浏览器的关闭(因为浏览器开一次只能填一次,所以可以让它自动关闭),然后我们在使用一个循环,进行不断的开关浏览器,即可实现不停的填写问卷。

完整的代码如下:

from selenium import webdriver
import random
driver = webdriver.Chrome()
driver.get('https://www.wjx.cn/jq/22452252.aspx') 
answers = driver.find_elements_by_css_selector('.div_question')
for i in range(5):
    for answer in answers:
        try:
            ####先滑到标签再去点击
            driver.execute_script("arguments[0].scrollIntoView();",answer)
            ### 找到标签
            ans=answer.find_elements_by_css_selector('li')
            if not ans:
                text=answer.find_element_by_css_selector('textarea')
                text.send_keys('没有')
                continue
            lsans=random.choice(ans)
            lsans.click()
        except Exception as e:
            print(e)
    am=driver.find_element_by_css_selector('#submit_button')
    am.click()     
    driver.quit()

附:这个地方,我们下面也是寻找,我们寻找一个id叫submit_button的id(这个id就是提交按钮的id,如下图所示)。寻找到之后,我们点击它,也就是am.click(),然后再关闭浏览器driver.quit(),然后上面的循环继续。题主在这里设置的是五次循环,想快速填写的可以设置的多一点。
在这里插入图片描述

由于运行效果太快了,不好截图,这里就不放运行的截图了,按照操作来的话,应该是可以完成自动填写的功能的。码字不易,走过路过,点个赞再走呗。

<think>好的,用户需要寻找一个用Python编写的问卷自动答题脚本的示例代码。首先,我得回顾一下用户提供的引用内容,看看有没有相关的代码示例或者实现方法。 根据引用[1]到[4],用户提供的参考内容中确实提到了使用PythonSelenium库来实现问卷自动填写。比如引用[3]详细提到了使用selenium的webdriver来操作浏览器,并且提到了导入库和基本步骤。引用[4]中的代码片段显示了填写次数和休眠时间,这可能是在循环中使用的。 接下来,我需要整理这些信息,构建一个示例代码。首先,要安装Selenium库,并且下载对应的浏览器驱动,比如ChromeDriver。然后,初始化webdriver,打问卷的链接。接下来,处理不同题型,比如单选题、多选题、下拉题和量表题。对于单选题,可以通过查找选项元素并随机点击;多选题可能需要选择多个选项,但要注意问卷可能有最多可选数量的限制。下拉题通常使用Select类来处理,而量表题可能需要找到对应的评分元素。 需要注意的是,问卷的页面结构可能会变化,因此元素定位的方法可能需要根据实际情况调整。比如,使用XPath或CSS选择器来定位具体的题目和选项。此外,处理验证码是一个挑战,可能需要额外的库或者手动干预,但示例代码中可能暂时不涉及这部分,或者建议在测试时关闭验证码。 另外,用户可能需要调整等待时间,使用显式等待(WebDriverWait)来确保元素加载完成,避免因页面加载延迟导致的错误。此外,随机选择选项可以模拟人类行为,避免被检测为自动化脚本。 最后,代码的结构应该包括初始化驱动、打网页、处理各题型、提交问卷以及关闭浏览器。同时,需要提醒用户遵守网站的使用规则,避免滥用自动化脚本。 现在,根据这些思路,整理出一个示例代码,并确保符合用户的要求:使用中文回答,正确使用LaTeX格式,生成相关问题,并在回答末尾添加引用标识。同时,检查是否有遗漏的部分,比如处理验证码或其他题型,可能需要进一步说明或建议用户参考更详细的教程。</think>以下是基于PythonSelenium问卷自动答题脚本示例代码,包含主要题型处理逻辑: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import random import time # 初始化浏览器驱动 driver = webdriver.Chrome() # 需提前安装对应版本ChromeDriver wait = WebDriverWait(driver, 10) def handle_single_choice(question_num): """处理单选题""" options = driver.find_elements(By.XPATH, f'//div[@id="div{question_num}"]//ul/li/a') random.choice(options).click() def handle_multiple_choice(question_num, max_select=3): """处理多选题""" options = driver.find_elements(By.XPATH, f'//div[@id="div{question_num}"]//ul/li/a') selected = random.sample(options, k=random.randint(1, max_select)) [opt.click() for opt in selected] def handle_dropdown(question_num): """处理下拉题""" select = Select(driver.find_element(By.ID, f'select{question_num}')) options = [opt.text for opt in select.options if opt.text] select.select_by_index(random.randint(1, len(options)-1)) # 跳过"请选择" def handle_scale(question_num, scale_max=5): """处理量表题""" xpath = f'//div[@id="div{question_num}"]//ul/li[{random.randint(1, scale_max)}]/a' driver.find_element(By.XPATH, xpath).click() def main(): try: driver.get("https://www.wjx.cn/vm/XXXXXXXX.aspx") # 替换为目标问卷URL # 等待页面加载完成 wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'div_question'))) # 处理各题型(需根据实际问卷结构调整题号) handle_single_choice(1) # 第1题单选题 handle_multiple_choice(2) # 第2题多选题 handle_dropdown(3) # 第3题下拉题 handle_scale(4) # 第4题量表题 # 提交问卷 submit_btn = driver.find_element(By.ID, 'submit_button') submit_btn.click() # 等待提交完成 time.sleep(5) finally: driver.quit() if __name__ == "__main__": main() ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值