python实现问卷星自动填写(可以跳过智能验证)

news2024/12/29 9:05:53

最近有一个社会实践需要做问卷调查,突发奇想搞一个自动化脚本,省事省米

1 下载依赖selenium

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

2  安装chrome驱动

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

chrome驱动下载链接 chrome驱动链接找到对应版本的驱动。 

 

下载后将安装包解压(解压后为.exe文件)在这个文件夹下 

 

  3 导入相关的包

from selenium import webdriver
import time
import random
from selenium.webdriver.common.by import By
import pyautogui

防止被识别为脚本

option = webdriver.ChromeOptions()
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        option.add_experimental_option('useAutomationExtension', False)

        browser = webdriver.Chrome(options=option)

        browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                                {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
        browser.maximize_window()  # 窗口最大化
        # 这行代码的作用是将webdriver这个属性置为undefined
        browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                            {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
                             })

        browser.get(url)
        time.sleep(2)

  

代码如下

# -*- coding: utf-8 -*- 
# @Time : 2023/1/26 11:34 
# @Author : wkk
# @File : Python自动化填问卷星.py
from selenium import webdriver
import time
import random
from selenium.webdriver.common.by import By
import pyautogui


def run(num, url):
    for i in range(num):
        option = webdriver.ChromeOptions()
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        option.add_experimental_option('useAutomationExtension', False)

        browser = webdriver.Chrome(options=option)

        browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                                {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
        browser.maximize_window()  # 窗口最大化
        # 这行代码的作用是将webdriver这个属性置为undefined
        browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                            {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
                             })

        browser.get(url)
        time.sleep(2)
        num1 = random.randint(1, 2)
        if browser.find_element(by=By.XPATH, value=f"//div[@for='q1_{num1}']"):
            browser.find_element(by=By.XPATH, value=f"//div[@for='q1_{num1}']").click()
        time.sleep(0.5)
        num2 = random.randint(1, 3)
        if browser.find_element(by=By.XPATH, value=f"//div[@for='q2_{num2}']"):
            browser.find_element(by=By.XPATH, value=f"//div[@for='q2_{num2}']").click()
        time.sleep(0.5)
        num3 = random.randint(1, 3)
        if browser.find_element(by=By.XPATH, value=f"//div[@for='q3_{num3}']"):
            browser.find_element(by=By.XPATH, value=f"//div[@for='q3_{num3}']").click()
        time.sleep(0.5)
        num4 = random.randint(1, 3)
        if browser.find_element(by=By.XPATH, value=f"//div[@for='q4_{num4}']"):
            browser.find_element(by=By.XPATH, value=f"//div[@for='q4_{num4}']").click()
        time.sleep(0.5)
        num5 = random.randint(1, 2)
        if browser.find_element(by=By.XPATH, value=f"//div[@for='q5_{num5}']"):
            browser.find_element(by=By.XPATH, value=f"//div[@for='q5_{num5}']").click()
        time.sleep(0.5)
        num6 = random.randint(1, 3)
        if browser.find_element(by=By.XPATH, value=f"//div[@for='q6_{num6}']"):
            browser.find_element(by=By.XPATH, value=f"//div[@for='q6_{num6}']").click()
        time.sleep(0.5)
        num7 = random.randint(1, 4)
        if browser.find_element(by=By.XPATH, value=f"//div[@for='q7_{num7}']"):
            browser.find_element(by=By.XPATH, value=f"//div[@for='q7_{num7}']").click()
        time.sleep(0.5)
        # num8 = random.randint(1, 3)
        # if browser.find_element(by=By.XPATH, value=f"//div[@for='q8_{num8}']"):
        #     browser.find_element(by=By.XPATH, value=f"//div[@for='q8_{num8}']").click()
        # time.sleep(0.5)
        # 问题5
        randomId = random.randint(1, 3)  # 随机数选择(选多少个)

        for i in range(1, randomId + 1):  # 循环 实现多选效果
            randomId1 = random.randint(1, 3)  # 随机选择第1到第6个选项之一

            # 两种js实现方式
            js = "document.getElementById(\"q8_" + str(randomId1) + "\").checked = true"
            browser.execute_script(js)
        # 延时
        time.sleep(1)
        num9 = random.randint(1, 7)
        if browser.find_element(by=By.XPATH, value=f"//div[@for='q9_{num9}']"):
            browser.find_element(by=By.XPATH, value=f"//div[@for='q9_{num9}']").click()
        time.sleep(0.5)
        num10 = random.randint(1, 3)
        if browser.find_element(by=By.XPATH, value=f"//div[@for='q10_{num10}']"):
            browser.find_element(by=By.XPATH, value=f"//div[@for='q10_{num10}']").click()
        time.sleep(0.5)
        if browser.find_element(by=By.XPATH, value="//div[@class='submitbtn mainBgColor']"):
            browser.find_element(by=By.XPATH, value="//div[@class='submitbtn mainBgColor']").click()

        time.sleep(1)
        try:
            element = browser.find_element(By.CSS_SELECTOR, "#alert_box > div:nth-child(2) > div:nth-child(2) > button")
            element.click()
            time.sleep(1)
            yanz = browser.find_element(By.ID, "rectMask")
            yanz.click()
            time.sleep(4)
        except:
            pass
        # 先点确认
        try:
            browser.find_element(By.XPATH, '//*[@id="layui-layer1"]/div[3]/a[1]').click()
            time.sleep(1)
        except:
            pass
        # 再点智能验证提示框,进行智能验证
        try:
            browser.find_element(By.XPATH, '//*[@id="SM_BTN_WRAPPER_1"]').click()
            time.sleep(3)
        except:
            pass
        # 滑块验证

        pyautogui.moveTo(789, 805, duration=1)  # 传入屏幕的位置
        time.sleep(0.5)
        pyautogui.dragRel(370, 0, duration=0.8)  # 拖动

        # pyautogui.moveTo(789, 805, duration=1)   # 回到原处
        # pyautogui.moveRel(370, 0, duration=1)

        # pyautogui.dragRel(256, 0, duration=0.8)
        # pyautogui.moveTo(789, 805)
        # time.sleep(0.5)
        # pyautogui.dragRel(370, 0, duration=0.8)
        time.sleep(5)
        browser.close()
        print(f"第{i + 1}份已经完成")



if __name__ == '__main__':
    num = 10  # 填的份数
    url = 'https://www.wjx.cn/vm/tXQkrbD.aspx'  # 链接
    run(num, url)


以上代码是我根据我自己的问卷形式来的,具体参数还得跟着问卷走,代码亲测有效,当短时间内刷的问卷数过多时,可能会出现第二重智能验证,这就要手动验证了哦,所以为了防止出现二重智能验证,在每提交完一份问卷后,要用time.sleep函数用于延时 , 避免提交过快。

本文仅为技术交流,最好不要用来恶意填写别人的问卷,以造成问卷质量低下的情况,请大家还是根据自己的实际情况填写问卷哦。 

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

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

相关文章

Mybatis框架介绍及使用

文章目录1. 概述1.1什么是框架1.2 Mybatis是什么1.3 Mybatis流程分析2. 参数的使用2.1 保存时获取插入id2.2 #{}与${}的区别2.3 parameterType 的使用2.4 SqlMapConfig.xml 中配置的内容3. 动态SQL3.1 <if>标签3.2 <where>标签3.3 <foreach > 标签3.4 抽取重…

ipv6内网穿透,有ipv6地址外网无法访问

问题描述 光猫已经开启ipv6&#xff0c;并且电脑/服务器已经有ipv6地址&#xff0c;只能通过ipv6局域网访问&#xff0c;外网/手机流量访问设备 原因分析&#xff1a; 光猫没有关闭防火墙路由器入站防护 解决方案&#xff1a; 1.光猫没有关闭防火墙 这里以中国移动的光猫为…

(17)目标检测算法之 YOLOv8 算法改进详细解析

目标检测算法之 YOLOv8 算法改进详细解析 1.YOLO的一些发展历史 YOLOv1&#xff1a;2015年Joseph Redmon和 Ali Farhadi等 人&#xff08;华盛顿大学&#xff09; YOLOv2&#xff1a;2016年Joseph Redmon和**Ali Farhadi等人*&#xff08;华盛顿大学&#xff09;* YOLOv3&am…

【JavaEE】多线程之线程安全(volatile篇),wait和notify

目录 内存可见性问题 volatile关键字 从JMM的角度来看内存可见性 wait和notify wait notify-notifyAll 内存可见性问题 首先运行一段代码&#xff0c;线程t1 用 Mycount.flag 作为标志符&#xff0c;当不为0的时候就跳出循环&#xff0c;线程t2 通过输入来改变 Mycount.f…

springboot 入门

springboot是什么 传统的开发模式下&#xff0c;无论是基于xml或注解&#xff0c;都要做许多配置&#xff0c;如果项目中集成越多的其他框架&#xff0c;配置内容也会越多。为了让开发人员以最少的配置去开发应用&#xff0c;springboot诞生了。springboot的原则是约定大于配置…

VSCode中4个Settings(JSON)的区别与联系

目录 &#x1f525; 前言 1. Preferences: Open Default Settings(JSON) 2. Preferences: Open User Settings 3. Preferences: Open Settings(JSON) 4. Preferences: Open Workspace Settings(JSON) &#x1f525; 总结 &#x1f525; 前言 在VSCode中输入快捷键ctrlsh…

读书笔记:梯度法求函数的最小值 gradient_method.py ← 斋藤康毅

● 由多元函数全部变量的偏导数汇总而成的向量称为梯度&#xff08;gradient&#xff09;。梯度指示的方向是各点处的函数值减小最多的方向。● 虽然梯度的方向并不一定指向最小值&#xff0c;但沿着它的方向能够最大限度地减小函数的值。因此&#xff0c;在寻找函数的最小值&a…

一篇五分生信临床模型预测文章代码复现——Figure 8 生存曲线鲁棒性分析

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

Linux输入子系统简析

1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 背景 本文基于 Linux 4.14 内核源码进行分析。 3. 简介 Linux 内核输入子系统&#xff0c;负责对系统中的输入设备进行管理。 一方面&#xf…

Spring Cloud_Ribbon负载均衡服务调用

目录一、概述1.是什么2.官网资料3.能干嘛二、Ribbon负载均衡演示1.架构说明2.POM三、Ribbon核心组件Irule1.IRule2.如何替换3.新建package&#xff08;注意&#xff1a;包的位置&#xff09;4.上面包下新建MySelfRule规则类5.主启动类添加RibbonClient6.测试四、Ribbon负载均衡…

Python将JSON格式文件导入 redis,多种方法

在导入前需要先确定你已经安装 Redis&#xff0c;并且可以启动相关服务。 windows 上启动 redis 的命令是 redis-server.exe redis.windows.conf&#xff0c;效果图如下&#xff1a; 文章目录使用 Python 连接 redis安装 redis 与 导入使用代码连接 Redis写入键值操作 JSON 文…

第26章 分布式缓存数据库配置的定义实现

1 Core.Configuration.CacheConfig namespace Core.Configuration { /// <summary> /// 【缓存配置--类】 /// <remarks> /// 摘要&#xff1a; /// 通过该类中的属性成员实例对“appsettings.json”文件中的1个指定缓存项(键/值对)在内存或指定分布式软件中…

mysql-installer-community-8.0.22.0安装教程

1. 下载 mysql-installer-community-8.0.22.0安装包 首先去官网&#xff1a;https://dev.mysql.com/downloads/installer/ 下载MySQL。 2. 默认Next 3. 点击Execute 4. 同意安装 5. 点击Next后点Yes 6. 点击Execute 这里出现10个选项是正确的&#xff0c;如果不是&#xff0c;…

C++ vector 容器介绍

C vector 容器介绍 C的vector是标准库中常见的一种容器&#xff0c;使用起来非常方便&#xff0c;可以用来代替c原本的数组。vector是种容器&#xff0c;类似数组一样&#xff0c;但它的size可以动态改变。vector的元素在内存中连续排列&#xff0c;这一点跟数组一样。由于vect…

队列同步器AQS的实现与分析——独占锁模式

AQS独占锁模式源码分析1、tryAcquire()、acquire()方法2、addWaiter()方法3、acquireQueued()方法4、shouldParkAfterFailedAcquire()方法5、tryRelease()、release()方法1、tryAcquire()、acquire()方法 protected boolean tryAcquire(int arg) {throw new UnsupportedOperat…

glassfish任意文件读取漏洞

glassfish任意文件读取漏洞1.简介1.1.漏洞类型1.2.漏洞成因1.3.语法搜索1.4.影响版本2.漏洞复现2.1.POC2.2.访问地址2.3.GlassFish的敏感目录2.3.1.获取数据库密码2.3.2.获取GlassFish的后台密码2.4.POC脚本1.简介 GlassFish是一款强健的商业兼容应用服务器&#xff0c;达到产品…

MyEclipse提示过期,MyEclipse Subscription Expired激活方案

一、错误描述 紧接上文&#xff0c;虽然解决了MyEclipse提示过期问题&#xff0c;但是你会发现出现一行红色提示如下&#xff1a; 1.错误日志 Product activation must be completed within 5 days. 2.错误说明 产品激活必须在5天内完成。 二、解决方案 从错误日志很明显的可…

C++语法复习笔记-2. c++基础句法

文章目录1. 图灵机与三种基本结构1. 顺序结构2. 分支结构自定义结构-枚举结构体与联合体结构体数据对齐问题3. 循环结构三种循环结构反汇编查看三种结构效率实例&#xff1a;输出所有形如aabb的四位数的完全平方数方案1: 构造aabb数&#xff0c;再判断方案2&#xff1a;反向操作…

《网络编程实战》学习笔记 Day10

系列文章目录 这是本周期内系列打卡文章的所有文章的目录 《Go 并发数据结构和算法实践》学习笔记 Day 1《Go 并发数据结构和算法实践》学习笔记 Day 2《说透芯片》学习笔记 Day 3《深入浅出计算机组成原理》学习笔记 Day 4《编程高手必学的内存知识》学习笔记 Day 5NUMA内存知…

自制DAPLink 基于ARM官方源码以及STM32F103C8T6

【本文发布于https://blog.csdn.net/Stack_/article/details/128771308&#xff0c;未经许可禁止转载&#xff0c;转载须注明出处】 一、安装工具并配置环境变量 1、python3 【官网】 【网盘】 链接&#xff1a;https://pan.baidu.com/s/1zW_H_eQlkzX3FkXuClFnTA 提取码&#…