基于selenium实现自动填写问卷星的问卷调查

这篇具有很好参考价值的文章主要介绍了基于selenium实现自动填写问卷星的问卷调查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

你是否还在为学校天天发的问卷调查而苦恼?

你是否还在为天天填写朋友的问卷调查而苦恼?

你是否还在为没人帮你填写问卷调查而苦恼?

废话不多说,直接上解决方案:

没用用过selenium的小朋友记得先安装配置一下:谷歌浏览器驱动的安装及selenium的安装与使用 - 知乎

 防止有人不看参数说明,再写一遍:

url         为问卷地址参数,

answers     为答案参数
    用列表存放答案,比如如果有3题,第一题多选,第二题单选,第三题多选
    [
        [1, 2], 
        [2], 
        [2, 3]
    ]
    意思就是第一题选A,B     第二题选B      第三题选B,C

select      为模式选择参数,默认为2
    1: 自主模式,根据自己填写的answer进行填写问卷
    2: 随机模式,通过random生成随机数进行填写问卷

flag        为bool类型参数,默认为False
    值为True: 无头模式,即不显示浏览器
    值为False:   正常模式 

注意:由于时间有限,目前我只做了单选和多选这两类选择题的自动填写,后续有时间的话会继续更新其他类型的题;

实现思路都大差不差,大家也可以参考代码自己更新


2023年11月29日 20:51第一次更新

多了如下几种题型:

 type=1

问卷网脚本,爬虫,selenium,python,爬虫

 type=5问卷网脚本,爬虫,selenium,python,爬虫 

type=6

问卷网脚本,爬虫,selenium,python,爬虫

type=9

问卷网脚本,爬虫,selenium,python,爬虫

2023年12月5日第二次更新 

更新了答案参数用法,由列表改为字典,更加人性化,操作更加简单,可以自己选择题目填写答案。

'''
url         为问卷地址参数,
answers     为答案参数
    用字典存放答案,比如如果有3题,第一题多选,第二题填空,第三题单选
    {
        1: [2, 4],
        2: "无建议",
        3: 3, 
    }
    意思就是第一题选B,D     第二题填无建议      第三题选C

select      为模式选择参数,默认为2
    1: 自主模式,根据自己填写的answer进行填写问卷
    2: 随机模式,通过random生成随机数进行填写问卷

flag        为bool类型参数,默认为False
    值为True: 无头模式,即不显示浏览器
    值为False:   正常模式 
'''

当填写问卷提交过快时,会有反爬,这次更新解决了三种反爬:

  1. 对话框确认验证
  2. 智能检测按钮验证
  3. 滑块验证

可以根据输入指定填写次数

 下面直接上代码:文章来源地址https://www.toymoban.com/news/detail-760853.html

import random
import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions, ActionChains

'''
url         为问卷地址参数,
answers     为答案参数
    用字典存放答案,比如如果有3题,第一题多选,第二题填空,第三题单选
    {
        1: [2, 4],
        2: "无建议",
        3: 3, 
    }
    意思就是第一题选B,D     第二题填无建议      第三题选C

select      为模式选择参数,默认为2
    1: 自主模式,根据自己填写的answer进行填写问卷
    2: 随机模式,通过random生成随机数进行填写问卷

flag        为bool类型参数,默认为False
    值为True: 无头模式,即不显示浏览器
    值为False:   正常模式 
'''


class WenJuanXing:
    def __init__(self, url, answers, select=2, flag=False):
        # 初始化变量
        self.driver = None
        self.url = url
        self.answers = answers
        self.select = select
        # 初始化浏览器驱动
        self.options = ChromeOptions()
        self.options.headless = flag
        self.options.add_experimental_option('excludeSwitches', ['enable-automation'])
        self.options.add_experimental_option('useAutomationExtension', False)

    def parse(self):
        divs = self.driver.find_elements(By.CSS_SELECTOR, '.field.ui-field-contain')  # 拿到所有的问题
        for div in divs:
            div_num = divs.index(div) + 1  # 题号
            div_type = int(div.get_attribute('type'))  # 问题类型

            if div_type == 1:  # 填空题
                question = div.find_element(By.CSS_SELECTOR, 'input')
                if self.select == 1:
                    question.send_keys(self.answers[div_num])
                else:
                    input_type = question.get_attribute('type')
                    if input_type == "text":
                        question.send_keys("无建议")

                    elif input_type == "tel":
                        question.send_keys("18")

            if div_type == 3:  # 单选题
                checks = div.find_elements(By.CSS_SELECTOR, '.ui-radio')  # 拿到所有的选项
                if self.select == 1:  # 模式1:自主模式
                    checks[self.answers[div_num] - 1].click()
                else:  # 模式2:随机模式
                    check_num = len(checks)  # 选项数目
                    ans = random.randint(1, check_num)  # 随机生成答案
                    checks[ans - 1].click()

            if div_type == 4:  # 多选题
                checks = div.find_elements(By.CSS_SELECTOR, '.ui-checkbox')  # 拿到所有选项
                if self.select == 1:  # 模式1:自主模式
                    for ans in self.answers[div_num]:
                        checks[ans - 1].click()
                else:  # 模式2:随机模式
                    check_num = len(checks)  # 选项数目
                    num = random.randint(1, check_num)  # 随机生成选项数
                    ansArr = []  # 随机生成的答案数组
                    for i in range(num):
                        c = random.randint(1, check_num)  # 随机生成答案
                        if c not in ansArr:
                            ansArr.append(c)
                    for ans in ansArr:  # 根据随机数组里的答案进行选择
                        checks[ans - 1].click()

            if div_type == 5:
                lis = div.find_elements(By.CSS_SELECTOR, '.onscore>li')
                if self.select == 1:
                    lis[answers[div_num] - 1].click()
                else:
                    lis_num = len(lis)
                    ans = random.randint(1, lis_num)
                    lis[ans - 1].click()

            if div_type == 6:
                trs = div.find_elements(By.CSS_SELECTOR, 'tr[tp="d"]')
                for tr in trs:
                    tds = tr.find_elements(By.CSS_SELECTOR, 'td>a')
                    if self.select == 1:
                        tr_index = trs.index(tr)
                        tds[self.answers[div_num][tr_index] - 1].click()
                    else:
                        td_num = len(tds)
                        ans = random.randint(1, td_num)  # 随机生成答案
                        tds[ans - 1].click()

            if div_type == 9:
                questions = div.find_elements(By.CSS_SELECTOR, 'input')
                for question in questions:
                    if self.select == 1:
                        que_index = questions.index(question)
                        question.send_keys(self.answers[div_num][que_index])
                    else:
                        input_type = question.get_attribute('type')
                        inputmode = question.get_attribute('inputmode')
                        if input_type == "text":
                            if inputmode == "decimal":
                                min_num = int(question.get_attribute('min'))
                                max_num = int(question.get_attribute('max'))
                                ans = random.randint(min_num, max_num)
                                question.send_keys(ans)

            print(f'第{div_num}题已做完')
        self.driver.find_element(By.CSS_SELECTOR, '#ctlNext').click()  # 提交
        # 验证
        self.verify()
        print('提交成功')

    def verify(self):
        try:
            self.driver.find_element(By.CSS_SELECTOR, '#layui-layer1 .layui-layer-btn0').click()
            time.sleep(1)
            print('点击对话框确认验证')
        except:
            print('没有对话框验证')
        try:
            self.driver.find_element(By.CSS_SELECTOR, '#rectMask').click()
            time.sleep(3)
            print('有智能检测按钮验证')
        except:
            print('没有智能检测按钮验证')
            # 滑块验证
        try:
            slider = self.driver.find_element(By.XPATH, '//*[@id="nc_1__scale_text"]/span')
            if str(slider.text).startswith("请按住滑块"):
                width = slider.size.get('width')
                ActionChains(self.driver).drag_and_drop_by_offset(slider, width, 0).perform()
                print('滑块验证')
        except:
            print('没有滑块验证')

    def run(self):
        # 启动浏览器跳转到答题页面
        self.driver = webdriver.Chrome(options=self.options)
        self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
                            Object.defineProperty(navigator, 'webdriver', {
                              get: () => undefined
                            })
                          """
        })
        self.driver.get(self.url)
        self.driver.implicitly_wait(5)
        self.driver.maximize_window()  # 最大化浏览器窗口
        # 做题
        self.parse()
        # 阻塞和关闭
        # time.sleep(1)
        # input()
        self.driver.close()


if __name__ == '__main__':
    url = '问卷url'
    answers = {
        1: [2, 4],  # 1
        2: [2, 5],  # 2
        3: 3,  # 3·
        4: [1, 3, 5],  # 4
        5: [1, 2, 4],  # 5
        6: 2,  # 6·
        7: 3,  # 7·
        8: [4, 5],  # 8
        9: 1,  # 9·
        10: 2,  # 10·
        11: [2, 4, 5],  # 11
        12: [1, 3, 4],  # 12
        13: [1, 4, 5],  # 13
        14: [1, 2, 5],  # 14
        15: 1  # 15·
    }

    select = 2
    flag = False
    wenjuan = WenJuanXing(url, answers, select=select, flag=False)
    # wenjuan.run()
    num = int(input('请输入你要提交的次数'))
    for i in range(num):
        print(f'===============第{i+1}次==================')
        wenjuan.run()

到了这里,关于基于selenium实现自动填写问卷星的问卷调查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    (Ps: 废话部分可跳过 )相信大家一定都有被问卷给折磨的时候,尤其去求别人填问卷的时候,如果是内向的小伙伴就一定很苦恼了,那么有没有一种工具可以帮助我们去自动填写问卷以达到问卷不求人的东西呢!答案是肯定的,我们都知道python是门很强大的语言,在自动化

    2023年04月21日
    浏览(22)
  • 89基于java的在线调查问卷系统设计与实现(含配套lun文,可参考做毕设)

    本章节给大家带来一个基于java在线调查问卷系统设计与实现,可适用于基于java在线校园调查问卷,基于java校园问卷调查系统,java问卷调查系统,校园在线问卷调查,校园在线调查问卷系统设计,调查问卷管理系统,基于Javaweb实现在线调查问卷系统,网上调查问卷系统,网

    2024年02月08日
    浏览(30)
  • 仿造问卷星--开发一套调查问卷设计工具(3/3)--完整流程

    1,定义一个结果的对象: id,name和questions分别对应问卷id,问卷名称和问卷题目。 2,结果赋值 用户点击生成问卷按钮时, 分别从id和name文本框中获取值 --赋值给resultObj 将上节课拿到的question赋值给刚刚定义的对象: 打印输出结果: json结果: 3,pretty-print-json的使用 引入

    2023年04月11日
    浏览(37)
  • 仿造问卷星--开发一套调查问卷设计工具(1/3)--完整流程

    一,开发前的准备 第一步,初始化项目 创建package.json 首先,新建一个空文件夹项目,在空文件上按shift键同时鼠标右击,打开命令终端窗口 第二步,安装项目依赖 Parcel 快速部署工具,官网:https://parceljs.org/docs/ Parcel是一款极速零配置WEB应用打包工具,快速、几乎零配置是

    2023年04月08日
    浏览(26)
  • 求免费好用的问卷调查平台!

    在当今信息时代,了解客户需求和市场趋势对企业的发展至关重要。而问卷调查是一种常见、有效的数据收集方式。本文将介绍一款 专业好用的问卷调查工具 ——Zoho Survey。我们将从功能特点、用户体验、数据分析和安全性四个方面来探讨它为用户带来的价值。 Zoho Survey提供

    2024年02月09日
    浏览(29)
  • 调查问卷平台哪家好?

    在如今的数字化时代,问卷调查已成为企业和组织了解顾客需求、员工满意度以及市场趋势的重要工具。然而,在众多的在线调查工具中, 为什么我们要选择Zoho Survey? 1、多种问卷题型: Zoho Survey提供丰富多样的问题类型,包括单选题、多选题、文本题、评分题等。用户可

    2024年02月11日
    浏览(28)
  • Temper monkey(油猴)实现问卷星填写

    // ==UserScript== // @name         问卷星3.0 // @namespace    http://tampermonkey.net/ // @version      0.1 // @description  try to take over the world! // @author       YYdny // @match        https://www.wjx.cn/vm/* // @icon         https://www.google.com/s2/favicons?sz=64domain=csdn.net // @grant        none // ==/UserScript== (

    2024年02月04日
    浏览(23)
  • 微信小程序调查问卷案例

           通过开发一个“调查问卷”的案例来掌握常用表单组件的使用,以及如何收集用户填写的表单信息提交给服务器和从服务器获取数据后显示在表单中。参考界面如图1所示。 步骤1 :新建一个微信小程序项目 步骤2 :在小程序项目的pages/index/index.json文件中设置导航栏

    2023年04月25日
    浏览(40)
  • 医院患者满意度调查问卷示例

    以下是一个简单的医院患者满意度调查问卷示例,供参考。请注意,实际的问卷可能需要根据医院的特定需求和目标进行定制。 个人信息(可选): 您的年龄: [填写您的年龄]岁 您的性别: [选择性别] 男性 / 女性 / 其他 1. 您在本次就诊中对医疗护理的满意度: 非常满意

    2024年02月01日
    浏览(36)
  • 调查问卷Type Form的集成

    Typeform是一家制作线上调查问卷的公司。 Muñoz 和 David Okuniev两人于2012年创作出一个更加动态、更具交互性的用户调查工具,每次只提一个问题,并且根据用户的回答为其呈现下一个问题,像和朋友间的对话一样,让用户在不知不觉中就完成了问卷。 Typeform将帮你获得有关产品

    2024年02月10日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包